Извлечение подмножества значений из ассоциативного массива (php)
-
05-09-2019 - |
Вопрос
Я хочу сделать что-то, казалось бы, очень простое, но я ничего не могу найти по этому поводу:просто извлеките подмножество массива, похожего на 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');
Если все остальное терпит неудачу, нет ли встроенной функции для фильтрации ассоциативного массива по ключам?Например:
$filteredArray = массив__извлечения__ключей__и__значений($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!
Решение
в версии 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
не имеет значения, они просто должны присутствовать.
Другие советы
Это, по сути, то же самое, что и ответ SilentGhost, но это может быть проще и, вероятно, немного медленнее.
array_intersect_key($array, array_flip($wantedKeys));