/**
* Retrieves an element within multidimensional array stored on any level by it's keys.
* @param array $data A multidimensional array with data
* @param array $keys A list of keys to element stored in $data
* @return null|mixed Returns null if elements is not found. Element's value otherwise.
*/
function getElement(array $data, array $keys)
{
/** перебираем ключи */
foreach($keys as $key) {
/**
* Если текущий элемент - массив, и в нём есть ключ, то текущий массив перезаписываем на новый.
* А если ключа такого нет или это не массив, то возвращаем null.
*/
if (is_array($data) && array_key_exists($key, $data)) {
$data = $data[$key];
} else {
return null;
}
}
return $data;
}
Использовать как-то так:
$data = [
'key1' => [
'key2' => [
'key3' => [
'value' => 123
]
]
]
];
echo getElement($data, ['key1', 'key2', 'key3', 'value']); // => 123
Можно пойти дальше и упростить себе вызов этой функции буквальной парой строк:Добавляем обработку ключа как строки:/**
* Retrieves an element within multidimensional array stored on any level by it's keys.
* @param array $data A multidimensional array with data
* @param string|array $keys A list of keys to element stored in $data as an array or a string with joined keys with a dot (.)
* @return null|mixed Returns null if elements is not found. Element's value otherwise.
*/
function getElement(array $data, $keys)
{
if (is_string($keys)) $keys = explode('.', $keys);
/** перебираем ключи */
foreach($keys as $key) {
/**
* Если текущий элемент - массив, и в нём есть ключ, то текущий массив перезаписываем на новый.
* А если ключа такого нет или это не массив, то возвращаем null.
*/
if (is_array($data) && array_key_exists($key, $data)) {
$data = $data[$key];
} else {
return null;
}
}
return $data;
}
И уже можно делать так:
echo getElement($data, 'key1.key2.key3.value'); // => 123