2009-02-20 5 views
12

Я хочу сделать что-то очень простое, но я ничего не могу найти об этом: просто извлеките подмножество массива, похожего на array_splice, но , используя ключи к получить значения:Извлечение подмножества значений из ассоциативного массива (php)

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1, 
       /* many more data I don't need here ... */); 

list($name, $age, $id) = array_splice_by_keys($data, 
          array('personName', 'personAge', 'personId'); 

Если все остальное терпит неудачу, не существует встроенная функция для фильтрации ассоциативного массива по ключам? Например:

$ filterArray = array__extract__keys__and__values ​​($ srcArray, $ arrayOfWantedKeys);

// create a new array with ONLY those key => values I need 
$wanted_values = array_extract_keys_and_values($data, 
        array('personName', 'personAge', 'personId'); 

echo $wanted_values['personName']; 

Я думаю, причина, почему я хочу сделать первый, что я не люблю повторять ассоциативного доступа к массиву во всем моем коде, казалось бы, лучше оптимизированы для копирования значения, которые используются (в цикле, например), в локальную переменную, плюс гораздо проще набрать $ name, чем $ somearray ['name'].

EDIT: Спасибо, я думаю, для использования со списком, решение будет

list($x, $y, $z) = array_values(array_intersect_key($array, array_flip($wantedKeys))); 

Intesresting использование array_flip!

ответ

7

в PHP версии> = 5.1.0 можно использовать array_intersect_key:

$data = array('personName' => 'John', 'personAge' => 99, 'personId' => 1, 
      'test' => 23); 
$ex = array('personName'=>0, 'personAge'=>0, 'personId'=>0); 
var_dump(array_intersect_key($data, $ex)); 

значения в $ex не имеет значения, они просто должны присутствовать.

27

Это по сути то же самое, что и ответ SilentGhost, но это может быть проще и, вероятно, немного медленнее.

array_intersect_key($array, array_flip($wantedKeys)); 
Смежные вопросы