【问题标题】:PHP: unset from array using if statementPHP:使用 if 语句从数组中取消设置
【发布时间】:2019-08-03 18:48:20
【问题描述】:

我正在尝试使用 if 语句取消设置特定值。 我的代码是

$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];

for ($i = 0 ; $i < count($fruits); $i++){ 
    if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
        unset($fruits[$i]);
    }
 }
 print_r($fruits);

我期待它回来

Array
(
  [4] => pineapple
)

但结果是

Array
(
  [3] => banana
  [4] => pineapple
)

为什么没有从数组中取消设置“香蕉”?

【问题讨论】:

    标签: php arrays unset


    【解决方案1】:

    使用这个:

    $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
    
    $fruit_num = count($fruits);
    for ($i = 0 ; $i < $fruit_num; $i++){
    
        if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
            unset($fruits[$i]);
        }
    
    }
    print_r($fruits);
    

    而不是:

    $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
    
    for ($i = 0 ; $i < count($fruits); $i++){ 
      if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
        unset($fruits[$i]);
      }
    }
    print_r($fruits);
    

    输出:

    Array ( [4] => pineapple )
    

    【讨论】:

      【解决方案2】:

      因为删除前 3 个元素后,$i 的值为 3,但数组的计数为 2,因此 for 循环中断 - 请记住循环条件是在每次迭代中重新评估。改成这个会给你想要的输出:

      $size = count($fruits)
      for ($i = 0 ; $i < $size; $i++){ 
      

      一般情况下,不推荐使用unsetfor 带int 索引的循环

      【讨论】:

      • 啊,我明白了!太感谢了!我应该使用foreach 而不是未设置吗?
      • 是的,你可以@Kiki
      • 在for循环中删除元素是没有问题的,但是你应该反转循环,所以从末尾数到0。for($i=count($fruits); $i &gt;= 0; $i--) ...
      • 我的方法是使用第二个“坏词”数组,然后使用in_array 进行检查。这比无休止的 if 语句更具可读性。
      • @unreleased 我也很惊讶——我迄今为止获得最高票数的帖子 :)
      【解决方案3】:

      这里的问题是 count($fruits),因为每个循环循环数组都会变小。

      $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
      $count = count($fruits);
      for ($i = 0; $i < $count; $i++){ 
          if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
              unset($fruits[$i]);
          }
      }
      print_r($fruits);
      

      希望这会有所帮助!

      【讨论】:

        【解决方案4】:

        正如他们所说,去罗马有很多种方式..

        使用foreach()

        一种更简洁的方法是使用foreach 而不是for 循环,并使用in_array() 来检查数组,而不是单独检查所有水果。

        $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
        
        foreach ($fruits as $key=>$fruit) {
            if (in_array($fruit, ['apple', 'orange', 'melon', 'banana'])) {
                unset($fruits[$key]);
            }
        }
        print_r($fruits);
        

        使用array_filter()

        一种更“花哨”的方式是使用array_filter() 的单线,

        $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
        
        $fruits = array_filter($fruits, function($fruit) {
            return !in_array($fruit, ['apple', 'orange', 'melon', 'banana']);
        });
        print_r($fruits);
        

        使用array_diff()

        更简单的是,使用array_diff(),它会查找仅存在于一个数组中的所有元素(基本上是删除重复项)。

        $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
        $remove = ['apple', 'orange', 'melon', 'banana'];
        $result = array_diff($fruits, $remove);
        

        使用array_intersect()

        还有array_intersect,它是array_diff() 的倒数。这将找到两个数组中都存在的元素,并将其返回。

        $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
        $find = ['pineapple'];
        $result = array_intersect($fruits, $find); 
        

        【讨论】:

        • 琪琪,很高兴你学到了一些东西!这就是 StackOverflow 的全部意义所在——分享知识! dWinder,您的回答解决了具体问题 - 并解释了为什么当前代码不起作用。我只是展示了不同的(也许更有效的)方法来实现相同的目标!
        【解决方案5】:

        我建议您使用foreach 而不是for loop。试试下面的代码。

        <?php
        $fruitss = ['apple', 'orange', 'melon', 'banana', 'pineapple','h'];
        
        foreach ($fruitss as $key=>$fruits) {
            //echo $fruits;
            if ($fruits == 'apple' || $fruits == 'orange' || $fruits == 'melon' || $fruits == 'banana') {
                unset($fruitss[$key]);
            }
        }
        print_r($fruitss);
        ?>
        

        【讨论】:

          【解决方案6】:

          在 PHP 中有许多可能的方法来做到这一点,因为 PHP 具有非常丰富的数组和字符串函数。

          在这个答案中,讨论了两种方法。

          基本上,您想从数组中删除元素。

          因此,使用另一个包含您要删除的元素的数组。

          找出你的数组和新数组之间的区别。

          差异肯定会是您预期的结果。

          您可以使用array_diff()

          这种方法的优点是:

          你可以用最少的代码行,而且不需要循环。

          $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
          $remove = ['apple', 'orange', 'melon', 'banana'];
          $test = array_diff($fruits, $remove);
          echo '<pre>';print_r($test);echo '</pre>';
          

          输出:

          Array
          (
              [4] => pineapple
          )
          

          甚至使用array_interset()

          获取一个临时数组,其中包含您要在数组中维护的唯一元素。

          获取数组相交元素。

          您将删除所有其他元素。

          $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
          $two = ['pineapple'];
          $test2 = array_intersect($fruits, $two);
          echo '<pre>';print_r($test2);echo '</pre>';
          

          输出:

          Array
          (
              [4] => pineapple
          )
          

          【讨论】:

            【解决方案7】:

            我认为问题是$i&lt;count($fruits)。它减少了数组大小。所以它只运行了3次。所以首先将数组大小分配给变量。

            <?php 
            
                $fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
                $n=count($fruits);
                for ($i = 0 ; $i <$n ; $i++){ 
            
                 if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana'){
                     unset($fruits[$i]);
                  }
                 }
                 print_r($fruits);
            
            ?>
            

            【讨论】:

            • 纯代码回答不是很有趣。而且我想 dwinder 已经提出了相同的解决方案,并给出了很好的解释。
            猜你喜欢
            • 2013-06-18
            • 1970-01-01
            • 2013-01-17
            • 2020-04-10
            • 2018-07-16
            • 2016-07-26
            • 2012-06-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多