我有一个由多个字符串(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]
仍在那里,以及为什么它没有删除。
答案 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)
这是因为你在每次迭代中计算数组的大小。
通过迭代:
sizeof($ urls)= 3,$ x = 0,$ x&lt; sizeof($ urls)TRUE未设置($ urls [0]);
sizeof($ urls)= 2,$ x = 1,$ x&lt; sizeof($ urls)TRUE未设置($ urls [1]);
sizeof($ urls)= 1,$ x = 2,$ x&lt; sizeof($ urls)FALSE ...不再执行代码
在开始循环之前保存数组的长度
$length = sizeof($urls);
for($x = 0; $x < $length; $x++){
}