Извлечение подмножества значений из ассоциативного массива (php) - PullRequest
13 голосов
/ 20 февраля 2009

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

$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'].

РЕДАКТИРОВАТЬ: Спасибо, я думаю, для использования со списком, решение будет

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

Интересное использование array_flip!

Ответы [ 2 ]

31 голосов
/ 20 февраля 2009

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

array_intersect_key($array, array_flip($wantedKeys));
9 голосов
/ 20 февраля 2009

в версии 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 не имеют значения, они просто должны присутствовать.

...