【问题标题】:How to remove an all the elements in an array through iteration如何通过迭代删除数组中的所有元素
【发布时间】:2017-05-26 18:53:06
【问题描述】:

我有一个数组$scripts_stack = []; 包含数组:

$array_item = array('script' => $file_parts, 'handle' => $file_name, 'src' => $url);
array_push($scripts_stack, $array_item);

<?php

for ($i = 0; $i < sizeof($scripts_stack); $i++) {
    $child_array = $scripts_stack[$i];
    if (is_array($child_array)) {
        // Do things with $child_array, 
        // then remove the child array from $scripts_stack when done with (BELOW)
        unset($scripts_stack[$i]);
    }
}

echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END

但是,我的尝试只删除了一半的元素。无论我尝试什么,只有一半的项目被删除。 sizeof($scripts_stack) 始终是开始时大小的一半。

我希望它会是空的//在最后

为什么我只删除了数组中的一半元素?

提前谢谢大家。

【问题讨论】:

标签: php arrays iteration


【解决方案1】:

正如其他答案中提到的,$i 增加但sizeof() 数组缩小。 foreach() 可能是最灵活的数组循环,因为它公开了实际的键(而不是希望它从 0 开始并以 1 递增)和值:

foreach ($scripts_stack as $key => $child_array) {
    if (is_array($child_array)) {
        // Do things with $child_array, 
        // then remove the child array from $scripts_stack when done with (BELOW)
        unset($scripts_stack[$key]);
    }
}

【讨论】:

    【解决方案2】:

    仅供参考,您使用for 的方式几乎有效。您只需要在循环定义之前建立计数,而不是在继续条件中重新计数。

    $count = sizeof($scripts_stack);
    for ($i = 0; $i < $count; $i++) {  // ...
    

    不过,我认为最好使用其他答案中所示的不同类型的循环。我个人会选择foreach,因为即使某些索引不存在,它也应该始终迭代每个元素。 (按照您构建数组的方式,看起来索引应该始终是连续的。)

    另一种可能性是将元素移出数组,而不是显式取消设置。

    while ($child_array = array_shift($scripts_stack)) {
        // Do things with $child_array,
    }
    

    不过,这肯定会删除数组中的每个元素。看起来$child_array 应该始终是一个数组,因此is_array($child_array) 可能不是必需的,但如果我们在这里没有看到更多内容,并且您需要保留一些非数组元素,那么这将不起作用。

    【讨论】:

      【解决方案3】:

      您在数组缩小时推进了$i,但同时您跳过了数组中的项目。

      第一个循环是 $i == 0 的位置,然后当您删除数组中的第 0 项时,位于第二位的项目已移动到第一个位置,而您的 $i ==(因此您不会删除项目在当前第一位,依此类推。

      你可以做的是使用while而不是for循环:

      <?php
      $i = 0;
      while ($i < sizeof($scripts_stack)) {
          $child_array = $scripts_stack[$i];
          if (is_array($child_array)) {
              // Do things with $child_array, 
              // then remove the child array from $scripts_stack when done with (BELOW)
              unset($scripts_stack[$i]);
          } else {
              $i++;
          }
      }
      
      echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END
      

      【讨论】:

        【解决方案4】:

        也许你可以使用这个脚本。它没有经过测试。

        foreach($array as $key => $value ) {
            unset($array[$key]);
            echo $value." element is deleted from your array</br>";
        }
        

        希望对你有帮助。

        【讨论】:

          【解决方案5】:

          问题根源在于将$isizeof($scripts_stack) 进行比较。每一步,sizeof($scripts_stack) 变得更低(它在每一步都计算),$i 变得更高。

          解决方法可能如下所示:

          <?php
          
          $scripts_stack = [];
          
          $array_item = array('script' => 1, 'handle' => 2, 'src' => 3);
          array_push($scripts_stack, $array_item);
          array_push($scripts_stack, $array_item);
          array_push($scripts_stack, $array_item);
          array_push($scripts_stack, $array_item);
          array_push($scripts_stack, $array_item);
          
          while (sizeof($scripts_stack) > 0) {
              $child_array = array_shift($scripts_stack);
              if (is_array($child_array)) {
                  // Do things with $child_array, 
                  // then remove the child array from $scripts_stack when done with (BELOW)
              }
          }
          
          echo "Array Size : " . (sizeof($scripts_stack)); // AT THE END
          

          https://3v4l.org/N2p3v

          【讨论】:

          • 您原来的答案是错误的,然后您只是复制了我在答案中写的内容。不太好...
          猜你喜欢
          • 2020-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-27
          • 2016-04-27
          • 1970-01-01
          • 2010-12-07
          相关资源
          最近更新 更多