PHP数组unset()行为 - 最后一个数组键仍然存在?

时间:2012-09-11 06:47:58

标签: php arrays

我有一个由多个字符串(HTTP地址)构成的数组,我在其上运行PHP过滤器和unset()方法来删除无效的URL。但是,最后一个数组项永远不会删除 - 我不知道为什么,或者我如何解决这个问题。我希望你们能帮忙。

$url1 = "http://localhost/work/project/scrapes/1.html";
$url2 = "";
$url3 = "";

$urls = array($url1, $url2, $url3);

for($x = 0; $x < sizeof($urls); $x++){
    if(!filter_var($urls[$x], FILTER_VALIDATE_URL)){
        unset($urls[$x]);
    }
}

print_r() gives me this:

Array ( [0] => http://localhost/work/project/scrapes/1.html [2] => )

我不知道为什么$urls[2]仍在那里,以及为什么它没有删除。

2 个答案:

答案 0 :(得分:5)

因为您动态计算size() - 只要删除元素,它就会减少。所以修复是在循环之前获得大小:

$url1 = "http://localhost/work/project/scrapes/1.html";
$url2 = "";
$url3 = "";

$urls = array($url1, $url2, $url3);
$size = sizeof($urls); // <----

for($x = 0; $x < $size; $x++){
    if(!filter_var($urls[$x], FILTER_VALIDATE_URL)){
        unset($urls[$x]);
    }
}

var_dump($urls);

答案 1 :(得分:2)

这是因为你在每次迭代中计算数组的大小。

通过迭代:

  1. sizeof($ urls)= 3,$ x = 0,$ x&lt; sizeof($ urls)TRUE未设置($ urls [0]);

  2. sizeof($ urls)= 2,$ x = 1,$ x&lt; sizeof($ urls)TRUE未设置($ urls [1]);

  3. sizeof($ urls)= 1,$ x = 2,$ x&lt; sizeof($ urls)FALSE ...不再执行代码

  4. 在开始循环之前保存数组的长度

    $length = sizeof($urls);
    
    for($x = 0; $x < $length; $x++){
    }