Как обратится к элементу массива по списку индексов?

Сабж.

Есть некоторый многоуровневый массив, например $arArray. И есть плоский массив индексов, например array(1,8,0);
Как проще всего обратится к элементу вложенность которого описывает этот плоский массив представляющий список индексов. Т.е. в данном случае к элементу $arArray[1][8][0];
Интересует изменение его значения.
Естественно общий случай - вложенность $arArray, может быть любой, как и длинна списка индексов.
  • Вопрос задан
  • 371 просмотр
Решения вопроса 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
function getvalbykeypath($arr,$index,$deep=0){
 if (is_array($arr) && isset($index[$deep]) && isset($arr[$index[$deep]])) {
  $deep++;
  $arr=&$arr[$index[$deep]];
  getvalbykeypath($arr,$index,$deep); 
  } else return $arr;
}

function setvalbykeypath($arr,$index,$val){
 foreach($index as $i) {
  if (is_array($arr[$i])) $arr=&$arr[$i];
  else {&$arr=$val;return $arr;}
 }
}
Ответ написан
65536
@65536
выдам своего барахла

function a2p($array)
{
    return implode('/', $array);
}

function p2a($path)
{
    return explode('/', $path);
}

function ap(&$input, $path = null, $set_value = null)
{
    if ( !is_null($path) )
    {
        if ( $path )
            $path = p2a($path);

        if ( !is_null($set_value) )
        {
            if ( $path )
                eval('$input["' . implode('"]["', $path) . '"] = $set_value;');
            else
                $input = $set_value;

            return $input;
        }
        else
        {
            if ( $path )
                eval('$value = isset($input["' . implode('"]["', $path) . '"]) ? $input["' . implode('"]["', $path) . '"] : null;');
            else
                $value = $input;

            return $value;
        }
    }
    else
    {
        return $input;
    }
}


p2a - преобразовать путь в массив. путь это/любая/строка/такого/вида
a2p - наоборот
ap - получить или изменить значение по определенному пути

ваш случай
$path = array(1,8,0);
$arArray = array(1 => array(8 => array(0 => 123)));
print ap($arArray, a2p($path));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы