PHP array_Shift()突然停止

时间:2014-06-17 06:14:37

标签: php arrays indexing element

我有一个简单的例子来说明我遇到了什么问题。

假设你有:

$myArray =  array("A","B","C","D","E","F","I","G","H");

目标是在循环中删除此数组的第一个元素。

让我们说:

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

    var_dump($myArray );

//...Remove the first Element of this array while $i is less than it's length.

    array_shift($myArray); 
}

这删除了第一个element中的第一个loop以及两个或三个,突然,它放弃了删除第一个Elements

根据文档

  
    

array_shift()关闭数组的第一个值并返回它,     将数组缩短一个元素并将所有内容向下移动。全部     数字数组键将被修改为从零开始计数     而文字键不会被触及。它暗示了这个例子。

  
   <?php 
         $stack = array("orange", "banana", "apple", "raspberry"); 
         $fruit = array_shift($stack); 
print_r($stack); 
?>
     

输出:阵列(       [0] =&gt;香蕉       [1] =&gt;苹果       [2] =&gt;树莓)

示例清楚地显示了我想要的内容。但是,为什么不继续删除到最后element

如果这是它的设计方式。然后,无论如何都要实现第一个Array Element 到最后一个元素的删除 / 删除。 。直到count($myArray) returns 0 (零)。??

非常感谢任何建议。

4 个答案:

答案 0 :(得分:5)

简单地:

while (count($myArray) > 0) {
    array_shift($myArray); 
}

See Demo

答案 1 :(得分:2)

你的for循环的问题是。您调用的每次迭代count()。因此,这个数字会减少,循环只会中途(因为你移动它),它将会中途结束。如果你真的想使用for循环,你需要先将它初始化。考虑这个例子:

for($x = 0, $size = count($myArray); $x < $size; $x++) {
    var_dump($myArray);
    array_shift($myArray);
}

// or the preferred one

while(!empty($myArray)) {
    var_dump($myArray);
    array_shift($myArray);
}

答案 2 :(得分:1)

以下是您的代码转储:

array (size=9)
  0 => string 'A' (length=1)
  1 => string 'B' (length=1)
  2 => string 'C' (length=1)
  3 => string 'D' (length=1)
  4 => string 'E' (length=1)
  5 => string 'F' (length=1)
  6 => string 'I' (length=1)
  7 => string 'G' (length=1)
  8 => string 'H' (length=1)
array (size=8)
  0 => string 'B' (length=1)
  1 => string 'C' (length=1)
  2 => string 'D' (length=1)
  3 => string 'E' (length=1)
  4 => string 'F' (length=1)
  5 => string 'I' (length=1)
  6 => string 'G' (length=1)
  7 => string 'H' (length=1)
array (size=7)
  0 => string 'C' (length=1)
  1 => string 'D' (length=1)
  2 => string 'E' (length=1)
  3 => string 'F' (length=1)
  4 => string 'I' (length=1)
  5 => string 'G' (length=1)
  6 => string 'H' (length=1)
array (size=6)
  0 => string 'D' (length=1)
  1 => string 'E' (length=1)
  2 => string 'F' (length=1)
  3 => string 'I' (length=1)
  4 => string 'G' (length=1)
  5 => string 'H' (length=1)
array (size=5)
  0 => string 'E' (length=1)
  1 => string 'F' (length=1)
  2 => string 'I' (length=1)
  3 => string 'G' (length=1)
  4 => string 'H' (length=1)

第6次迭代预计会对数组的第6个元素起作用。但是此时阵列的长度为5。所以什么都不会发生。这解释了你遇到的问题。

如果您确实希望浏览数组,最好使用while count(..)

while (count($myArray) > 0) {
    var_dump($myArray);
    array_shift($myArray); 
}

一般来说,在for循环中更改数组并不是一个好习惯。在其他语言中,数组在for循环中可能是只读的。

答案 3 :(得分:1)

while (count($myArray) > 0) {
    array_shift($myArray); 
}

这应该可以解决问题,但使用起来效率不高:

unset($foo);
$foo = array();

(如果要删除所有数据?)。