Как обратиться к многомерному массиву имея простой массив с индексами?

есть массив, может быть и другой где уровней больше, всегда разные...:
$arr = array('one' => array(
                                         'two' => array('three' => 'stroka')
                                          )
                    );

и есть массив(путь) до 'stroka' как бы ключи массива $arr:
array(
'one',
'two',
'three'
);


Как обратиться ?
ну как бы нужно чтобы обращение было типа $arr[one][two][three]

Количество уровней может быть разным, в этом и проблема...
  • Вопрос задан
  • 166 просмотров
Пригласить эксперта
Ответы на вопрос 2
Решение на скорую руку:

function getElementByPath(array &$arr, array $path) {
    $el = $arr[array_shift($path)];
    if (count($path) === 0) {
        return $el;
    }
    return getElementByPath($el, $path);
}


Пример работы:
$arr = array(
    'one' => array(
        'two' => array(
            'three' => 'stroka'
        )
    )
);

$path = array(
    'one',
    'two',
    'three'
);


$el = getElementByPath($arr, $path);
var_dump($el); // ---> 'stroka'


Добавите всяких проверок и будет ок.

UPD1. Решение чуть получше:
// Последний параметр значение, если элемент не найден
function getElementByPath(array &$arr, array $path, $initial = null) {
    return array_reduce($path, function (&$res, $key) use (&$initial) {
        return is_array($res) && isset($res[$key]) ? $res[$key] : $initial;
    }, $arr);
}
Ответ написан
Комментировать
profesor08
@profesor08 Куратор тега PHP
Вот так:
function getElement(&$array, $path)
{
   if (count($path)==0) return $array;
   return getElement($array[array_shift($path)], $path);
}


$arr = array(
    'one' => array(
        'two' => array(
            'three' => 'stroka'
        )
    )
);


$path = array(
    'one',
    'two',
    'three'
);

echo getElement($arr, $path);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 12:53
1000 руб./за проект
19 апр. 2024, в 12:41
8000 руб./за проект
19 апр. 2024, в 12:05
1500 руб./в час