【问题标题】:PHP array_Shift() stops suddenlyPHP array_Shift() 突然停止
【发布时间】:2014-06-17 06:14:37
【问题描述】:

我得到了这个简单的例子来说明问题所在。

假设你有:

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

这会删除第一个 loop 中的第一个 element 和两个或三个以上,突然间,它放弃了删除第一个 Elements。

根据文档:

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

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

输出:数组 ( [0] => 香蕉 [1] => 苹果 [2] => 覆盆子)

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

如果这就是它的设计方式。然后无论如何要实现删除/删除第一个ArrayElement到最后一个元素。..直到@987654330 @returns 0(零).??

非常感谢任何建议。

【问题讨论】:

  • 您在调用每个循环的计数,它会缩小,这就是它没有完成的原因。它最多只能达到 4。如果您想完成并转移所有内容,请改用 while
  • Thx...那么,您如何循环遍历??...我尝试将该号码分配给variable,以避免将其传递给for循环,但没有任何效果... .

标签: php arrays indexing element


【解决方案1】:

简单地说:

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

See Demo

【讨论】:

  • while(!empty($myArray)) {也可以
  • @ErickBest 看看this。请注意,$i 越来越大,而 count($myArray) 越来越小……当它们在中间相遇时,循环结束。
  • +++1...大声笑,我从没想过。 :)(接受你的回答!!)
  • @ErickBest 很高兴为您提供帮助 :)
【解决方案2】:

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

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

【讨论】:

  • +1 感谢一百万清理逻辑......再次UpVotes @Mark M的回答......while循环方式。
  • @ErickBest 是的,我也赞成他的回答。欢迎您
【解决方案3】:
while (count($myArray) > 0) {
    array_shift($myArray); 
}

这应该可以解决问题,但使用起来不是更有效吗:

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

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

【讨论】:

  • 我不打算突然清理数组......我的目标是按顺序删除元素......不过谢谢。
【解决方案4】:

这是您的代码转储:

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 循环中可能是只读的。

【讨论】:

  • 那么如何遍历所有循环??...任何想法?
猜你喜欢
  • 2013-06-30
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多