繁体   English   中英

循环时仅将唯一值推入数组

[英]Push only unique values into an array while looping

我正在使用以下循环将项目添加到数组中。 我想知道如果值已经在数组中,是否有可能不将$value添加到$liste数组?

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

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

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

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

真的有两个选择。

选项 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); .

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

解决问题代码:

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

$liste = array_unique($something);

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

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

如果您正在使用 array_push():

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

$liste[] = $value;

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

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

function find_uniq( $something ) {
    foreach($something as $value){
         $liste[$value]++;
    }
    return array_keys( $liste );
}

如果要取消警告,请在第三行添加@符号。

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

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

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

array_push($array, $new_member);
$array = array_unique($array);

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

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

(顺便说一句:将,true添加到array_search以使用“严格检查”。这将使用===进行比较而不是==

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

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

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

用法:

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

设置 class

好的,我给你写一个class。 arrays 不允许重复项称为集合。

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]);
    }
}

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

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

这是一个可以缩短您的代码的解决方案:使用单独的 function。

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

然后,在您所有的 array_push() 需求中,您可以调用上面的 function,如下所示:

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

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

如果 $value 还不存在,它被添加到 $liste。

希望有所帮助。

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

$list = array();
foreach ($something as $value) {
  if (!is_object($value) && !is_array($value)) {
    $list[$value] = $value
  }
}
$list = array_values($list);

您可以使用值作为临时键,只要$something数组不包含:

  1. 非标量值(对象/数组/等不能用作键)或
  2. 用作数组键时将发生变异的值(浮点数被截断,空值变为空字符串,布尔值变为整数)
  3. 数字字符串和整数的混合,将松散地评估为相等( 2 vs "2"

糟糕的演示


代码:(好的演示

$something = [3, 2, 1, 3, 6, 5, 1, 1];
$liste = [];
foreach ($something as $value) {
     $liste[$value] = $value;
}

Output:

array (
  3 => 3,
  2 => 2,
  1 => 1,
  6 => 6,
  5 => 5,
)

上面的方法绝对比本页上使用重复检查技术的任何其他方法表现得更好。 PHP 不允许在数组的任何一个级别上重复键,因此它只会覆盖重新遇到的值。

如果新键不影响未来的处理,请保持原样,否则调用array_values()重新索引数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM