2013-04-21 1 views
0

У меня есть массив, который выглядит примерно так:PHP возвращающий ассоциативный массив, путем поиска нескольких элементов?

$array = array(
    array('Field1' => 'red', 'Field2' => 'green', 'Field3' => 'blue'), 
    array('Field1' => 'pink', 'Field2' => 'pinkish', 'Field3' => 'barbiecolor'), 
    array('Field1' => 'red', 'Field2' => 'blue', ' Field3' => 'orange') 
); 

И я хочу, чтобы проверить это с помощью заданных значений:

$searchBy = array('Field1' => 'red', 'Field2' => 'blue'); 

То, что я хочу добиться, это вернуть родительский массив, имеет все ассоциативные ключи & пары значений. Я попытался in_array(), но он не работает ..

ответ

3

array_filter может быть лучше для этого:

$matches = array_filter($array,function($a) use ($searchBy) { 
    foreach($searchBy as $k=>$v) { 
     if($a[$k] != $v) return false; 
    } 
    return true; 
}); 
+0

Обратите внимание на минимальную требуемую версию PHP, хотя:) – dbf

+0

О да. Это будет работать в PHP 5.3, но до этого вам нужно будет использовать ['create_function'] (http://php.net/create-function). –

+0

@ Kolink - спасибо, работает отлично! В интересах более старых версий, как вы определяете эту функцию поиска? Спасибо – Matt

1

Вы можете попробовать:

$find = array_filter($array, function ($a) use($searchBy) { 
    return array_intersect_assoc($searchBy, $a) == $searchBy; 
}); 

See Live Demo

старой школы версии

$find = find($searchBy, $array); 
print_r($find); 

// Function used 
function find($needle, $haystack) { 
    $r = array(); 
    foreach ($haystack as $k => $a) { 
     array_intersect_assoc($needle, $a) == $needle and $r[$k] = $a; 
    } 
    return $r; 
} 

Old School Demo

+0

можно ли достичь этого с помощью PHP <5.3? – Matt

+0

Да .. может обновить код, чтобы отразить это, если вы хотите – Baba

+0

Было бы очень полезно :) – Matt