2015-11-10 20 views
2

在下面SSCCE,为什么没有被超过3 $a更大的执行for循环,虽然病情应该让它执行到$a变得5.为什么这个for循环似乎执行,虽然条件仍然是真的?

而最后一条语句的输出更是怪异。

我想实现的是,我要删除的元素有元素/变量wordSelect one值,使得产生的阵列是:

Array ([0] => stdClass Object ([word] => alpha [sentence] => A is the first letter in the word Alpha.) [1] => stdClass Object ([word] => beta [sentence] => B is the first letter in the word 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 

?> 

OUTPUT:

Array ([0] => stdClass Object ([word] => alpha [sentence] => A is the first letter in the word Alpha.) [1] => stdClass Object ([word] => beta [sentence] => B is the first letter in the word Beta.) [2] => stdClass Object ([word] => Select one [sentence] =>) [3] => stdClass Object ([word] => Select one [sentence] =>) [4] => stdClass Object ([word] => Select one [sentence] =>) [5] => stdClass Object ([word] => Select one [sentence] =>)) 

count($items) >> 6 



We are entering index 0 


alpha 


We are leaving index 0 



We are entering index 1 


beta 


We are leaving index 1 



We are entering index 2 


Select one 

YES if (($items[2]->word)=="Select one") AT 2 INDEX. 


We are leaving index 2 



We are entering index 3 


Select one 

YES if (($items[3]->word)=="Select one") AT 3 INDEX. 


We are leaving index 3 



AFTER:- 
Array ([0] => stdClass Object ([word] => alpha [sentence] => A is the first letter in the word Alpha.) [1] => stdClass Object ([word] => beta [sentence] => B is the first letter in the word Beta.) [2] => stdClass Object ([word] => Select one [sentence] =>)) 
+0

有你在这一行'回声有问题“
是如果(($项目[” 。$ a。'] - > word)==“选择一个”)AT'。$ a。'指数。
'; //查询 ' – Saty

+0

@Saty Yep。它只会被打印,直到'$ a'的值变为3.我正在编辑问题以发布完整的示例输出。 – Solace

+0

尝试'unset($ items [$ a] - > word);' – Saty

回答

1

这种情况并不总是如此。 for循环中的条件会在每次迭代中重新计算数组的大小。数组的长度随着项目被移除而改变。

的每次检查的条件如下$acount($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 

您应的阵列的大小存储在变量并使用它。此外,由于array_splice不保留数字键,因此在尝试访问$items[4]$items[5]时,最终会得到未定义的抵消通知。该行不是必需的。

$count = count($items); 
for ($a=0; $a < $count; $a++) { 

更重要的是,你可以使用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 
1

如您在执行取消设置主键使用迭代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 
} 
+0

这将抛出一个错误,因为array_splice不保留数字键。 – topher

+0

我认为'array_splice'正在代码中被注释。 – jitendrapurohit