2015-07-10 4 views
1

Я использую этот код для фильтрации многомерного массива:PHP 5.2: Фильтр массива с несколькими аргументами производительность

$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']); 
       } 
      ); 

Существуют ли более эффективные подходы в плане скорости?

+0

array_filter попробуйте это –

+1

Может использоваться любое 'вызываемое' -почему не вызывать именованную функцию и использовать ее? –

+1

Я уверен, что вы уже очень это осознаёте, но учтите, что php 5.2 устарел. * ОЧЕНЬ * устаревший. Он был объявлен в конце жизни почти полвека назад, и с тех пор он не имел никаких защитных патчей. Если вы используете его на общедоступном веб-сервере, вы подвергаете себя большому риску. Вы также обнаружите, что любые сторонние библиотеки/фреймворки, на которые вы полагаетесь, также будут устаревшими, так как почти все отказались от поддержки php 5.2 некоторое время назад, поэтому вы будете застрять на старых версиях, опять же, вероятно, с неприятными дыры безопасности. Я настоятельно рекомендую вам попробовать обновить, если это возможно. – Simba

ответ

0

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'); 
+0

Использование глобального в PHP не рекомендуется. – numediaweb

+1

@numediaweb Я знаю об этом, я просто использовал его в качестве примера. Во всяком случае, я отредактировал ответ :) – pedrochaves

Смежные вопросы