Php 为什么';虽然条件仍然为真,但这个for循环似乎执行了吗?
在下面的SSCCE中,为什么对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
$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