我有一个简单的例子来说明我遇到了什么问题。
假设你有:
$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
(零)。??
非常感谢任何建议。
答案 0 :(得分:5)
答案 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();
(如果要删除所有数据?)。