-1

我试图取消设置小于 60 的所有记录,但每次只取消设置有限的数量。这是我的代码:

echo "<p>============= count=".count($ar); // 1764
for ($i=0;$i<count($ar);++$i) 
    if ((strlen($ar[$i])<60) OR (strpos($ar[$i],'src=')<5)) 
        unset ($ar[$i]);

$ar=array_values($ar); // renumber the indices

echo "<p>============================= count=".count($ar); 
//    1452; OK, so they are all larger than 60 chars, right?
for ($i=0;$i<count($ar);++$i) 
    if (strlen($ar[$i])<60) 
        echo"<br>$i - ".$ar[$i]; // not so; several items printed!!! ???

for ($i=0;$i<count($ar);++$i) 
    if (strlen($ar[$i])<60) 
        unset ($ar[$i]); //again

$ar=array_values($ar);
echo "<p>============================= count=".count($ar); // 1396; OK, now all are larger than 60 chars?

for ($i=0;$i<count($ar);++$i) 
    if (strlen($ar[$i])<60) 
        echo"<br>$i - ".$ar[$i]; // no, still items printed!!! ???

for ($i=0;$i<count($ar);++$i) 
    if (strlen($ar[$i])<60) 
        unset ($ar[$i]);

$ar=array_values($ar);
echo "<p>============================= count=".count($ar); //  1386; so 10 more were removed; are we done now?
for ($i=0;$i<count($ar);++$i) 
    if (strlen($ar[$i])<60) 
        echo"<br>$i - ".$ar[$i]; // again still items printed!!! ???

怎么可能在每次循环并删除少于 60 个字符的项目之后,仍然有未设置的数组项目将在下一次重复时取消设置?我真的束手无策。我做错了什么?有人可以解释一下吗?谢谢....埃克

4

3 回答 3

1

使用foreach循环 - https://www.php.net/manual/en/control-structures.foreach.php

问题是当删除项目时,数组中的元素数量在循环迭代中发生变化。

更好的方法是使用array_filter- https://www.php.net/manual/en/function.array-filter.php

<?php

$arrOriginal = [ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];

$arr = $arrOriginal;
for ($i = 0; $i < count($arr); $i++) {
        echo '$i = '.$i.' $arr[$i] = '.$arr[$i].' and count($arr) = '.count($arr).PHP_EOL;
        if (strlen($arr[$i]) < 4) {
                unset($arr[$i]);
        }
}
var_dump($arr);

$arr = $arrOriginal;
foreach ($arr as $k => $v) {
        echo '$k = '.$k.' $arr[$k] = '.$arr[$k].' and count($arr) = '.count($arr).PHP_EOL;
        if (strlen($arr[$k]) < 4) {
                unset($arr[$k]);
        }
}
var_dump($arr);

$arr = $arrOriginal;
$arr = array_filter($arr, function ($v) {
        return strlen($v) >= 4;
});
var_dump($arr);
于 2020-12-21T15:47:59.513 回答
0

每次找到要取消设置的行时,都会将正在处理的数组的大小减少一次。并且因为您count($ar)每次循环都使用循环控制,您可以根据数组的新大小(在删除出现之后)重新计算终止条件,所以基本上您永远不会处理数组的所有出现。

您需要做的就是在循环控制代码之外计算数组大小

$max = count($ar);
for ($i=0; $i<$max; ++$i) {
    if ((strlen($ar[$i])<60) OR (strpos($ar[$i],'src=')<5)) {
        unset ($ar[$i]);
    }
}
于 2020-12-21T16:04:02.403 回答
0

谢谢你的帮助,你解决了我的困惑。

事实上,我的错误是在循环中使用 count($ar),在该循环中我减小了数组的大小,因此 count($ar) 在每次取消设置后都会减少,从而使数组尾部的一个潜在数组项不被检查. 这也解释了为什么在每个循环之后剩余的项目(小于 60 但令人惊讶地没有未设置)位于数组的“尾部”。再次感谢你给了我这个洞察力............Eke

于 2020-12-23T10:00:43.257 回答