比較している2つのアレイがあり、それを行うためのより効率的な方法があるかどうかを知りたいです。
最初の配列はユーザーが送信した値であり、2番目の配列には許可された値があり、その一部には数値の代わりにワイルドカードが含まれている場合があります。
// user submitted values
$values = array('fruit' => array(
'apple8756apple333',
'banana234banana',
'apple4apple333',
'kiwi435kiwi'
));
//allowed values
$match = array('allowed' => array(
'apple*apple333',
'banana234banana',
'kiwi*kiwi'
));
最初の配列のすべての値が2番目の配列の値と一致するかどうかを知る必要があります。
これは私が使用しているものです:
// the number of values to validate
$valueCount = count($values['fruit']);
// the number of allowed to compare against
$matchCount = count($match['allowed']);
// the number of values passed validation
$passed = 0;
// update allowed wildcards to regular expression for preg_match
foreach($match['allowed'] as &$allowed)
{
$allowed = str_replace(array('*'), array('([0-9]+)'), $allowed);
}
// for each value match against allowed values
foreach($values['fruit'] as $fruit)
{
$i = 0;
$status = false;
while($i < $matchCount && $status == false)
{
$result = preg_match('/' . $match['allowed'][$i] . '/', $fruit);
if ($result)
{
$status = true;
$passed++;
}
$i++;
}
}
// check all passed validation
if($passed === $valueCount)
{
echo 'hurray!';
}
else
{
echo 'fail';
}
foreachループ内のwhileループよりも優れた仕事をするPHP関数を見逃しているように感じます。それとも私は間違っていますか?
更新:申し訳ありませんが、数値は値内で複数の場所に表示される可能性がありますが、ワイルドカードは1つしかありません。これを表すために配列を更新しました。