php array_push() - >如果数组已包含值,如何不推送

Mar*_*arc 39 php arrays array-push

我使用以下循环将项添加到我的一个名为$ liste的数组中.我想知道如果值已经在数组中,是否有可能以某种方式不向$ liste数组添加$ value?希望我很清楚.先感谢您.

$liste = array();
foreach($something as $value){
     array_push($liste, $value);
}
Run Code Online (Sandbox Code Playgroud)

Roc*_*mat 81

in_array在推之前检查它是否存在.

foreach($something as $value){
    if(!in_array($value, $liste, true)){
        array_push($liste, $value);
    }
}
Run Code Online (Sandbox Code Playgroud)

,true使"严格检查".这比较使用的元素===而不是==.

  • @Jazz:你在说什么?`in_array`只搜索数组值,而不是键.http://ideone.com/JjkuP (3认同)
  • 请注意,如果`$ value`是数字并且碰巧与`$ liste`中的一个(数字)键相同,`in_array()`即使数组中没有这样的值也可以返回`true` .我建议使用`array_search()`而强 - 将结果与`false`进行比较. (2认同)
  • @Rocket,我回去看了看.你是错的,我用'in_array()`错误地描述了这个问题 - 它没有数字键的问题,但是有松散的类型转换.我的错!在我之前使用它的代码中,使用严格模式不是一个选项(我需要''2'来比较相同的`2`但不同于''2thing'`).我仍然建议新的PHP开发人员使用`array_search()`,因为它比`in_array()具有更少的"gotcha".道德是 - 无论你使用什么,请确保你知道什么时候它不起作用. (2认同)

Nie*_*sol 20

真的有两种选择.

选项1:检查每个项目,如果项目在那里则不要推送.基本上你要求的是:

foreach($something as $value) {
    if( !in_array($value,$liste)) array_push($liste,$value);
}
Run Code Online (Sandbox Code Playgroud)

选项2:无论如何添加它们并在以下情况下删除重复项:

foreach($something as $value) {
    array_push($liste,$value);
}
$liste = array_unique($liste);
Run Code Online (Sandbox Code Playgroud)

从它的外观来看,你可能只是在寻找$liste = array_unique($something);.

  • 这两个选项中哪个更有效? (2认同)

bje*_*lli 5

也许您想将其用作关联数组。它被实现为(类似于) 哈希表,因此您可以获得恒定的插入时间而不是线性的。

function find_uniq( $something ) {
    foreach($something as $value){
         $liste[$value]++;
    }
    return array_keys( $liste );
}
Run Code Online (Sandbox Code Playgroud)

如果您想禁止显示警告,请@在第三行添加符号。

如果你想避免警告,你需要首先检查是否存在:

function find_uniq( $something ) {
    foreach($something as $value){
      if (isset($liste[$value]))
        $liste[$value]++;
      else
        $liste[$value] = 1;
    }
    return array_keys( $liste );
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 5

正确答案要简单得多。推送所有内容,然后使用array_unique()函数:

array_push($array, $new_member);
$array = array_unique($array);
Run Code Online (Sandbox Code Playgroud)


NoO*_*Z24 5

由于这个问题不是使用最佳实践代码开始的,我发现这里的所有答案都过于复杂。

解决有问题的代码:

基本上,自己试图做的是过滤掉重复。更好的方法:

$liste = array_unique($something);
Run Code Online (Sandbox Code Playgroud)

如果向非空数组添加元素:

$liste = array_unique(array_merge($liste, $something));
Run Code Online (Sandbox Code Playgroud)

如果您使用 array_push():

除非您实际使用数组推送的返回值,否则您应该真正使用:

$liste[] = $value;
Run Code Online (Sandbox Code Playgroud)

更短的语法和轻微的性能提升