Как обратиться к элементу многомерного массива по ключу, который находится в другом линейном массиве

xintrea

Новичок
Есть многомерный ассоциативный массив. Надо обратиться к элементу массива по ключу, который записан в другом линейном массиве.

То есть, имеется многомерный массив данных и линейный массив с ключем:

Код:
$a=[
  'animals'=> [
   'cats' => [
     'catusdomesticus' => 'home',
     'pantera' => 'wild'
   ]
  ]
];

$keys=['animals', 'cats', 'pantera'];
Нужно сделать две вещи:

1. (простое) Получить значение $a['animals']['cats']['pantera']
2. (сложное) Удалить элемент $a['animals']['cats']['pantera']

Есть ли какой-либо быстрый (встроеный) в PHP5 способ такое сделать, или нужно городить собственный код?

Хотелось бы обойтись без кодогенерации и eval().
 
Последнее редактирование:

xintrea

Новичок
Ну и какой синтаксис будет чтобы получить значение? По документации я вообще не вижу, что для этой задачи данный способ подходит.

Я пробовал:

Код:
var_dump( $a[ $keys ] );
var_dump( $a[ $$keys ] );
var_dump( ${$a}[ $keys ] );
var_dump( ${$a[ $keys ]} );
Ничего не работает.
 

Semen

Семён
PHP:
$a=[
    'animals'=> [
        'cats' => [
            'catusdomesticus' => 'home',
            'pantera' => 'wild'
        ]
    ]
];

$keys=['animals', 'cats', 'pantera'];
$varToGet = $a;
foreach ($keys as $key) {
    $varToGet = $varToGet[$key];
    
}
var_dump($varToGet);
 

xintrea

Новичок
То есть, синтаксис переменных переменных тут никаким боком.

Но получение значения - это просто. Я тему поднял не потому что не могу получить значение, а потому что думал что есть готовый синтаксис к такой задаче.

Вопрос на самом деле стоит с удалением элемента. Я попробовал такой код:

Код:
for($i=0; $i<count($keys); $i++)
{
  $item =& $item[$keys[$i]];

  if($i===count($keys)-1) {
    echo "\nDelete element:\n";
    var_dump($item);

    unset($item);
  }  
}  
var_dump( $a );
Но он элемент не удаляет, хоть переменная $item и содержит ссылку на элемент.
 

fixxxer

К.О.
Партнер клуба
ай ну хххооспади вот даже напишу
PHP:
function array_delete_path(array &$ref, array $path) {
    $lastKey = array_pop($path);
    while ($key = array_shift($path)) {
        assert(is_array($ref[$key] ?? null));
        $ref = &$ref[$key];
    }
    unset($ref[$lastKey]);
}
 

xintrea

Новичок
PHP:
$item =&$a;
foreach($keys as $key) {
  $array =& $item;
  $item =& $item[$key];
}
unset($array[$key]); // Удаление элемента
или
$array[$key] = 42; // Установка значения
 
Сверху