0

unset()PHP フィルターと無効な URL を削除するメソッドを実行するいくつかの文字列 (HTTP アドレス) から構築された配列があります。ただし、最後の配列項目が削除されることはありません。その理由や解決方法はわかりません。皆さんが助けてくれることを願っています。

$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 に答える