52

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

$liste = array();
foreach($something as $value){
     array_push($liste, $value);
}
4

9 回答 9

110

in_array在推送之前使用 , 检查它是否存在。

foreach($something as $value){
    if(!in_array($value, $liste, true)){
        array_push($liste, $value);
    }
}

,true启用“严格检查” 。===这使用而不是比较元素==

于 2012-04-10T20:32:39.820 回答
27

真的有两个选择。

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

foreach($something as $value) {
    if( !in_array($value,$liste)) array_push($liste,$value);
}

选项2:无论如何添加它们并在之后删除重复项:

foreach($something as $value) {
    array_push($liste,$value);
}
$liste = array_unique($liste);

不过,从外观上看,您可能只是在寻找$liste = array_unique($something);.

于 2012-04-10T20:33:39.360 回答
8

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

解决有问题的代码:

基本上,有问题的尝试本身就是过滤掉重复。更好的方法:

$liste = array_unique($something);

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

$liste = array_unique(array_merge($liste, $something));

如果您使用 array_push():

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

$liste[] = $value;

用于更短的语法和较小的性能提升

于 2018-07-13T07:58:22.407 回答
4

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

function find_uniq( $something ) {
    foreach($something as $value){
         $liste[$value]++;
    }
    return array_keys( $liste );
}
于 2012-04-10T20:33:30.470 回答
4

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

array_push($array, $new_member);
$array = array_unique($array);
于 2017-08-09T00:33:34.123 回答
3

您可以在调用之前简单地检查此条件array_push()。使用array_search()并使用强比较来false查看值是否存在:

foreach( $something as $value ){
    if( array_search( $value, $liste, true ) === false ){
        array_push( $liste, $value );
    }
}

(顺便说一句:添加,truearray_search使用“严格检查”。这将===用于比较而不是==

于 2012-04-10T20:35:27.533 回答
1

上面已经给出了很好的答案,但是如果您的代码中有多个 array_push() ,那么每次都编写 if(in_array()) 语句会很痛苦。

这是一个解决方案,可以缩短您在这种情况下的代码:使用单独的函数。

function arr_inserter($arr,$add){ //to prevent duplicate when inserting
    if(!in_array($add,$arr))
        array_push($arr,$add);
    return $arr;
}

然后在您的所有 array_push() 需要中,您可以调用上面的该函数,如下所示:

$liste = array();
foreach($something as $value){
    $liste = arr_inserter($liste, $value);
}

如果 $value 已经存在,则 $liste 保持不变。

如果 $value 尚不存在,则将其添加到 $liste。

希望有帮助。

于 2014-07-02T08:09:33.367 回答
1

通过保持逻辑少来节省逻辑并提高速度。只是继续覆盖。

$list = array();
foreach ($something as $value) {
  if (!is_object($value) && !is_array($value)) {
    $list[$value] = $value
  }
}
$list = array_values($list);
于 2015-02-06T04:37:41.410 回答
1

我有另一个解决方案给你!您可以将键用作值并且键永远不会重复

$arr = ["A" => true, "B" => true, "C" => true];

$item = "A";
$arr[$item] = true;

用法:

foreach($arr as $value => $helper){
    echo $value;
}

设置类

好,我给你写一堂课!不允许重复项的数组称为集合。

class Set{
    private $countainer;

    public function get(){
        return $this->container;
    }
    public function push($item){
        $this->container[$item] = true;
    }
    public function delete($item){
        unset($this->container[$item]);
    }
}

注意:这不适用于关联数组和值。

于 2019-08-01T08:34:48.010 回答