0

我有一个由几个字符串(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]仍然存在,为什么它没有被删除。

4

2 回答 2

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);
于 2012-09-11T06:53:29.890 回答
2

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

通过迭代:

  1. sizeof($urls) = 3, $x = 0, $x < sizeof($urls) TRUE unset($urls[0]);

  2. sizeof($urls) = 2, $x = 1, $x < sizeof($urls) TRUE unset($urls[1]);

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

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

$length = sizeof($urls);

for($x = 0; $x < $length; $x++){
}
于 2012-09-11T06:55:27.837 回答