【问题标题】:php array_push() -> How not to push if the array already contains the valuephp array_push() -> 如果数组已经包含值,如何不推送
【发布时间】:2012-04-10 20:31:08
【问题描述】:

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

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

【问题讨论】:

  • 这在细节上有点模糊。这有点取决于$value 是什么。它是一个标量值吗?它始终是一个整数吗?一个字符串?根据这一重要细节,可能有比反复调用in_array() 更有效的方法。

标签: php arrays array-push


【解决方案1】:

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

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

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

【讨论】:

  • 请注意,如果$value 是数字并且恰好与$liste 中的(数字)键之一相同,则in_array() 可以返回true,即使没有这样的值是在数组中。我建议改用array_search() 并将结果与​​false 进行强对比。
  • @Jazz:你在说什么? in_array 只搜索数组值,不搜索键。 ideone.com/JjkuP
  • @Rocket,我看到了你的结果,但过去我收到了不同的结果。可能是在 5.2.11 之前修复了这个问题。
  • @Jazz:这从来都不是问题,即使在 PHP 4 中也是如此。问题可能出在您的代码中。
  • @Rocket,我回去看了看。你说得对,我用in_array() 错误地描述了这个问题——数字键没有问题,但类型转换松散。我的错!在我之前使用它的代码中,使用严格模式不是一个选项(我需要'2'2 比较,但与'2thing' 不同)。我仍然建议新的 PHP 开发人员使用array_search(),因为它的“陷阱”比in_array(). 少。道德是——无论你使用什么,确保你知道它什么时候不起作用。
【解决方案2】:

真的有两个选择。

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

【讨论】:

  • 这两个选项哪个更有效?
【解决方案3】:

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

解决有问题的代码:

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

$liste = array_unique($something);

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

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

如果您使用的是 array_push():

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

$liste[] = $value;

为了更短的语法和较小的性能提升

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      上面已经给出了很好的答案,但是如果您的代码中有多个 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。

      希望对您有所帮助。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 这是最有效的解决方案。
          • 并且不应该使用它,因为它会生成通知,因为它正在增加一个未声明的元素。
          【解决方案8】:

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

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

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

          【讨论】:

          • 我不知道你从哪里听说过关于in_array 的信息,但这是完全错误的。 in_array 搜索,而不搜索ideone.com/JjkuP
          • @Rocket,我看到了你的结果,但过去我收到了不同的结果。可能是在 5.2.11 之前修复了这个问题。
          • @Jazz:你的代码一定是做错了什么,这从来都不是问题,即使在 PHP 4 中也是如此。
          • @Rocket,请参阅this linkthis link,了解遇到in_array() 问题的人。我可以向你保证,大约三年前我遇到这个问题时,我非常彻底地验证了这个问题不在我的代码中。
          • @Jazz:这些问题与数组中的键无关,它们与 PHP 奇怪的“类型杂耍”有关。 array_search 会有同样的问题。您需要添加,true 以启用“严格检查”来解决此问题。否则,它使用== 进行比较(和'2dudes' == 2)。
          【解决方案9】:

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

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

          【讨论】:

          • 只要$value(作为键)不是对象或数组,就可以正常工作
          • 这是一个相当不错的解决方案,但是您可以看到您不再有一个无逻辑的解决方案,对吧?在最新的编辑之后,这似乎不再是最优雅的解决方案了。
          • 确实如此,它现在确实在每个循环中都包含一些逻辑:(我需要查看一些性能测试才能知道这是否是正确的方法。
          • 虽然这可能很有效,但在某些边缘情况下,键冲突会损坏数据。例如,浮点数将被截断为整数——因此可能会丢失数据。 is_scalar()会提升“优雅”。
          猜你喜欢
          • 1970-01-01
          • 2017-04-22
          • 2018-11-01
          • 2020-02-03
          • 1970-01-01
          • 2014-03-15
          • 2019-04-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多