Php 为什么';虽然条件仍然为真,但这个for循环似乎执行了吗?

Php 为什么';虽然条件仍然为真,但这个for循环似乎执行了吗?,php,for-loop,unset,array-splice,array-unset,Php,For Loop,Unset,Array Splice,Array Unset,在下面的SSCCE中,为什么对$a执行的for循环不大于3,尽管条件应该允许它执行直到$a变为5 最后一条语句的输出更奇怪 我试图实现的是,我希望删除元素,并为元素/变量word选择一个值,这样生成的数组是: Array([0]=>stdClass对象([word]=>alpha[句子]=>A是单词alpha中的第一个字母。)[1]=>stdClass对象([word]=>beta[句子]=>B是单词beta中的第一个字母。) 问题是什么把事情搞砸了,我能做些什么来修复它 <?php

在下面的SSCCE中,为什么对
$a
执行的
for
循环不大于3,尽管条件应该允许它执行直到
$a
变为5

最后一条语句的输出更奇怪

我试图实现的是,我希望删除元素,并为元素/变量
word
选择一个
值,这样生成的数组是:

Array([0]=>stdClass对象([word]=>alpha[句子]=>A是单词alpha中的第一个字母。)[1]=>stdClass对象([word]=>beta[句子]=>B是单词beta中的第一个字母。)

问题是什么把事情搞砸了,我能做些什么来修复它

<?php 

$objectOne = new stdClass;
$objectOne->word = 'alpha';
$objectOne->sentence = 'A is the first letter in the word Alpha.';

$objectTwo = new stdClass;
$objectTwo->word = 'beta';
$objectTwo->sentence = 'B is the first letter in the word Beta.';

$objectThree = new stdClass;
$objectThree->word = 'Select one';
$objectThree->sentence = '';

$items = array($objectOne, $objectTwo, $objectThree, $objectThree, $objectThree, $objectThree );


print_r($items);//check
echo '<br><br>count($items) >> '.count($items).'<br><br>';//check


for ($a=0; $a < count($items); $a++) {
    echo '<br><br>We are entering index '.$a.'<br><br>';//check
    echo '<br>'.$items[$a]->word.'<br>';//check

    if ( ($items[$a]->word)=="Select one"  ) {
        echo '<br>YES if ( ($items['.$a.']->word)=="Select one"  ) AT '.$a.' INDEX.<br>';//check
        unset($items[$a]);
        /**/array_splice($items, $a, 1);
    }

    echo '<br><br>We are leaving index '.$a.'<br><br>';//check
}


echo '<br><br>AFTER:-<br>';//check
print_r($items);//check

?>

在执行过程中取消设置main的键时,使用
temp
变量进行迭代。也许,这应该奏效:-

$temp = $items;
for ($a=0; $a < count($temp); $a++) {
  echo '<br><br>We are entering index '.$a.'<br><br>';//check
  echo '<br>'.$items[$a]->word.'<br>';//check

  if ( ($items[$a]->word)=="Select one"  ) {
      echo '<br>YES if ( ($items['.$a.']->word)=="Select one"  ) AT '.$a.' INDEX.<br>';//check
      unset($items[$a]);
      /**/array_splice($items, $a, 1);
  }

  echo '<br><br>We are leaving index '.$a.'<br><br>';//check
}
$temp=$items;
对于($a=0;$a
我们正在输入索引“$a”。

”;//检查 回显“
”.$items[$a]->word.
”;//检查 如果(($items[$a]->word)=“选择一个”){ 如果($items['.$a.]->word)==“选择一个”)在“$a.”索引处,则回显“
是”。
”;//检查 未结算($项目[$a]); /**/阵列拼接(项目$a,1); } 回显“

我们将离开索引“$a”。

”;//检查 }
该条件并不总是正确的。for循环中的条件会在每次迭代中重新计算数组的大小。每当删除项时,数组的长度都会更改

每次检查条件时,
$a
计数($items)
的值如下:

$a | count($items) | $a < count($items)
---------------------------------------
 0 | 6             | true 
 1 | 6             | true
 2 | 6             | true
 3 | 5             | true  -- $items[2] was removed
 4 | 4             | false -- $items[3] was removed
更好的是,您可以使用
foreach
代替
for
,使用
$item
代替
$items[$a]

foreach ($items as $a=>$item) {
    echo '<br><br>We are entering index '.$a.'<br><br>';//check
    echo '<br>'.$item->word.'<br>';//check
    ...
    unset($items[$a]); //can't use $item because it is a copy and not a reference
foreach($a=>$item){
回显“

我们正在输入索引“$a”。

”;//检查 回显“
”.$item->word.
”;//检查 ... unset($items[$a]);//无法使用$item,因为它是副本而不是引用
如果($items['.$a.]->word)=“选择一个”)在“$a.”索引处,这一行有问题吗?
echo'
是。
;//检查
@Saty-Yep。只有在
$a
的值变为3时才会打印。我正在编辑问题以发布示例的完整输出。请尝试
取消($items[$a]->word);
这将抛出一个错误,因为数组拼接不保留数字键。
$count = count($items);
for ($a=0; $a < $count; $a++) {
foreach ($items as $a=>$item) {
    echo '<br><br>We are entering index '.$a.'<br><br>';//check
    echo '<br>'.$item->word.'<br>';//check
    ...
    unset($items[$a]); //can't use $item because it is a copy and not a reference