Имя динамической переменной для многомерного массива

На левой руке у меня есть этот «ключ»:
localisation.adresse.commune.id
и многие другие значения, подобные этому, которые являются динамическими (я не могу использовать их в своем коде, так как не знаю, какими они будут).

С другой стороны, у меня есть такой массив (приходит от JSON декодированный):

    Array
(
[localisation] => Array
(
[adresse] => Array
(
[adresse1] => Le Chatelard
[codePostal] => 42820
[etat] => France
[commune] => Array
(
[id] => 16418
)

)

)

)

Я не могу перечислить все «ключи», которые я собираюсь использовать, поэтому мне нужно автоматически получить значение $ object [‘localization’] [‘adresse’] [‘commune’] [‘id’].

Я пробовал это, но это не работает:

$test['localisation']['adresse']['commune']['id'] = 16418 ;
$var = '$test[\'localisation\'][\'adresse\'][\'commune\'][\'id\']' ;
echo $var ; // $test['localisation']['adresse']['commune']['id']
var_dump($$var) ; // NULL Notice: Undefined variable: $test['localisation']['adresse']['commune']['id']
var_dump(${$var}) ; // NULL Notice: Undefined variable: $test['localisation']['adresse']['commune']['id']

Я полагаю, что он ищет простую переменную со сложным именем, вместо того, чтобы смотреть на многомерный массив, но я не знаю, как я могу это сделать …

Спасибо за вашу помощь!

1

Решение

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

Я придумал два варианта: рекурсивный и итеративный. Они также будут обрабатывать случай, когда «глубина» ключа и массива различна, например, если твой $key будет содержать больше элементов, чем глубина массива, то NULL будет возвращено, если меньше, то будет возвращено все, что находится под последним ключом.

Рекурсивный вариант

$a = [
'localisation' => [
'adresse' => [
'adresse1' => 'Le Chatelard',
'codePostal' => 42820,
'etat' => 'France',
'commune' => [
'id' => 16418,
],
],
],
];

$key = 'localisation.adresse.commune.id';

function getValueByKeyRecursively($a, $key)
{
$keyList = explode('.', $key);
$currentKey = array_shift($keyList);

// Found the value
if (empty($currentKey)) {
return $a;
}

// No more depth to traverse or no such key
if (!is_array($a) || !array_key_exists($currentKey, $a)) {
return null;
}

return getValueByKeyRecursively($a[$currentKey], implode('.', $keyList));
}

var_dump(getValueByKeyRecursively($a, $key)); // outputs: int(16418)

Итерационный вариант

function getValueByKey(array $a, $key)
{
$keyList = explode('.', $key);
$returnValue = $a;

do {
$currentKey = array_shift($keyList);

// Found the value
if ($currentKey === null) {
break;
}

// No more depth to traverse or no such key
if (!is_array($returnValue) || !array_key_exists($currentKey, $returnValue)) {
return null;
}

$returnValue = $returnValue[$currentKey];

} while (true);

return $returnValue;
}

var_dump(getValueByKey($a, $key)); // outputs: int(16418)
1

Другие решения

попробуй это :

$str = '{
"localisation" : {
"adresse" : {
"adresse1" : "Le Chatelard",
"codePostal" : "42820",
"etat" : "France",
"commune" : {
"id" : 16418
}
}
}
}
';

$data = json_decode($str, true);
$var = $data['localisation']['adresse']['commune']['id'] ;
echo $var ;
print_r($data);
0

По вопросам рекламы [email protected]