【问题标题】:how i use unique array in for loop我如何在 for 循环中使用唯一数组
【发布时间】:2013-12-19 07:14:39
【问题描述】:

我想在 for 循环中使用唯一数组。请看我的代码。

Array ( [0] => Pritesh [1] => Pritesh [2] => Nilesh )

现在我使用“UNIQUE”函数来获取唯一值

 Array ( [0] => Pritesh [2] => Nilesh ) 

但现在的问题是当我使用 for 循环时像

for($p = 0; $p < count($unique); $p++)
    {   echo $uniques;
        echo  '<option value="'.$unique[$p].'">'.$unique[$p].'</option>';
    }   

所以第二个值显示为空白,因为数组计数为 2 而 Key 为 0,2。

我如何使用它。

【问题讨论】:

  • 使用foreach 而不是for
  • 不禁想知道您是如何获得这些非唯一值的。

标签: php arrays word unique


【解决方案1】:

在进入循环之前这样做..

$yourarray = array_values(array_unique($repeated_values_array));

现在在 for 循环中使用$yourarray

【讨论】:

  • array_values 返回另一个数组。这段代码可能是单行代码,但它需要一个数组,创建一个新的、只有唯一值的数组,然后创建第三个只有唯一值的数组。 sort 重置数组的键而不重新创建唯一数组。
  • Sorting不是正确的做法。如果值要保持在同一位置怎么办?
  • 如果是这样的话,排序是不对的,真的(除非你使用usortfunction keepOrder($a, $b) { return 0; },但这很愚蠢)。在这种情况下,OP 没有提到他关心顺序,所以我不认为元素的顺序是相关的。
  • 我对我的答案进行了一些编辑,如果 OP 想要保证键完整性而不是改变数组中元素的顺序,建议你的答案。为了好玩,我还添加了一些愚蠢的解决方案
【解决方案2】:
foreach($uniques as $key => $unique) {
  echo '<option value="'.$unique.'">'.$unique.'</option>';
}

如评论中所述,如果不需要,则无需为键分配变量。 (我只是用作方便的参考)。所以你可以简单地这样做:

foreach($uniques as $unique) {
  echo '<option value="'.$unique.'">'.$unique.'</option>';
}

【讨论】:

  • 如果你不打算使用$key,为什么还要麻烦foreach($uniques as $key =&gt; $unique),在每次迭代中分配2个变量? foreach($uniques as $unique) 写起来更短,速度稍快,并且只迭代您需要的内容:值
  • 我认为包含 key 变量是个好主意,因为 OP 可能不知道这种语法。性能不是这里的问题。但你肯定是对的。我已经编辑了我的答案以包含这两种结构。
  • 现在,由于我处于迂腐状态:最有效的echo 不会连接字符串,而是用逗号分隔它们。 I've given a lengthy explanation on the matter here
【解决方案3】:

请阅读the manualarray_unique 重置数组键。此外,for 循环非常好,但 foreach 是一种更适合处理数组(和对象)的语言结构。
也就是说,在应用array_unique 后重置数组键的最快方法是sort 数组:

$a = array( 'Pritesh','Pritesh','Nilesh' );
$b = array_unique($a);
sort($b);
var_dump($b);

这会导致:

array(2) {
  [0]=>
  string(6) "Nilesh"
  [1]=>
  string(7) "Pritesh"
}

这同时适用于forforeach

编辑:
在 TMTOWTDI 编程中经常出现这种情况(有不止一种方法可以做到)。这里有几种方法,从有效到荒谬:

快速:

foreach($uniques as $unique) echo '<option value="', $unique, '">', $unique,'</option>';

是的,这些是逗号,逗号 + echo 实际上比串联更快(~20-30%)
何时使用:只要你喜欢它,它不会改变 $uniques 数组(因此它的索引仍然不一致),但它快速且易于阅读。

修复$uniques索引:

sort($uniques);
foreach($uniques as $unique) echo '';//same deal

与之前版本的不同之处在于,这里也可以将foreach 替换为for,并且$uniques 数组将再次被正确索引。元素的顺序可能已更改。
如果元素的顺序很重要,并且您想要一个整齐索引的数组,请使用:

$uniques = array_values($uniques);//as Shankar Damodaran suggested

当您的用例符合上述非常具体且不太可能的情况时使用。
或者,事情正在从这里开始变得荒谬:

function keepOrder($a, $b)
{
    return 0;
}
usort($uniques, 'keepOrder);

使用:从不

由于我们在过度设计解决方案方面做得相当远,让我们将其扩展到解决方案再次成为问题的范围(警告,以下代码可能会导致你的眼睛流血):

//get the highest key in array, add 1
$max = max(array_keys($uniques)) + 1;
for($i=0;$i<$max;++$i) if (isset($uniques[$i])) echo $unique;

我故意让上面的代码更难阅读,以避免任何人使用它。
何时使用:当您临床精神失常或想看到同事穿着紧身衣被带走,大喊“恐怖,恐怖”时使用
说真的:不要使用它。

【讨论】:

    【解决方案4】:

    使用PHP的foreach函数

     foreach($unique as $val)
     {   
          echo $val;
          echo  '<option value="'.$val.'">'.$val.'</option>';
     }  
    

    【讨论】:

      【解决方案5】:

      使用foreach 代替for 循环

      如果您也需要密钥,请执行以下操作:

      foreach ($unique as $key=>$value)
      

      $key 将是数组键。

      【讨论】:

        【解决方案6】:

        您需要的似乎是“变基数组键”。 如本文所述:Rebase array keys

        所以用

        $array = array_values($array);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-02
          • 2023-03-08
          • 2020-04-04
          • 1970-01-01
          相关资源
          最近更新 更多