foreach のバグでしょうか。PHP 5.3.3 で悩んだところが
foreach のバグでしょうか。PHP 5.3.3 で悩んだところがあります。
あるレコードが正規表現にマッチした場合、そのレコードに対して何らかの処理をするスクリプトを書いていました。
しかし思ったように動かず原因を調べました。結果、配列の値が変わっていることに気づきました。
◇テスト用レコードの内容
http://www.yahoo.co.jp/
http://www.bing.com/
http://www.goo.ne.jp/
http://www.google.co.jp
http://d.hatena.ne.jp/
◇先頭一致して欲しい文字列
http://www.google.co.jp/
http://www.bing.com/
http://www.youtube.com/
この場合、処理の対象は2件です。
私が書いたスクリプトでは3回マッチしてしまいます。
以下、テスト用に作ったスクリプトです。
<?php
// URL のパターンを用意 (とりあえず以下の3パターン)
$ar = array();
$ar['Google'] = array(
'URL' => 'http://www.google.co.jp/'
);
$ar['Bing'] = array(
'URL' => 'http://www.bing.com/'
);
$ar['YouTube'] = array(
'URL' => 'http://www.youtube.com/'
);
// 先頭一致の正規表現にする
foreach($ar as $key => &$value){
$value['regex'] = '/^' . preg_quote($value['URL'], '/') . '/';
}
echo("URL の パターンを出力してみる/n");
print_r($ar);
// テスト用 レコード
$list = array();
$list[] = 'http://www.yahoo.co.jp/';
$list[] = 'http://www.bing.com/'; // match.
$list[] = 'http://www.goo.ne.jp/';
$list[] = 'http://www.google.co.jp/'; // match.
$list[] = 'http://d.hatena.ne.jp/';
// マッチするのは2回のみ...のはずが
for($n = 0; $n < count($list); $n ++){
foreach($ar as $key => $value){
if(preg_match($value['regex'], $list[$n], $match)) echo("match.\n");
}
}
echo("もう一度 URL のパターンを出力してみる\n");
print_r($ar);
echo("なぜか一番最後の配列の値が変わっている。\n");
?>
お礼
回答ありがとうございます。回答者様のおかげで、自分だけではないと分かり幾分安心しました。改めまして、回答ありがとうございました。