Я использую этот код для фильтрации многомерного массива:
$sourceArray = array(
array('name'=>'banana', 'color'=>'green'),
array('name'=>'banana', 'color'=>'black'),
array('name'=>'banana', 'color'=>'yelow'),
);
$arrayToCompare = array('type'=>'fruits','has_name'=>'banana', 'has_color'=>'yelow');
$filtered = array();
foreach($sourceArray as $item) {
if($item['name'] !== $arrayToCompare['has_name']) continue;
if($item['color'] !== $arrayToCompare['has_color']) continue;
$filtered[] = $item;
}
Но я думаю, что может быть эффективное/быстрое решение.
В PHP 5.3 мы можем использовать анонимные функции (замыкания) внутри встроенного фильтра filter_array(), но они не поддерживаются в 5.2:
$filtered = array_filter(
$masterItems,
function ($arr) use ($arrayToCompare) { // PHP 5.3 is required here!!
return ($arr['name'] == $arrayToCompare['has_name']
AND $arr['color'] == $arrayToCompare['has_color']);
}
);
Есть ли какие-то лучшие подходы в скорости?
PHP 5.2 принимает имя обратного вызова в функции array_filter
.
function filter($arr)
{
$arrayToCompare = array('type'=>'fruits','has_name'=>'banana', 'has_color'=>'yelow');
return $arr['name'] == $arrayToCompare['has_name']
&& $arr['color'] == $arrayToCompare['has_color'];
}
$filtered = array_filter($masterItems, 'filter');
callable
объект - почему бы не создать именованную функцию и использовать ее?