Как динамически отобразить переменную (ы) php ARRAY? - PullRequest
2 голосов
/ 21 октября 2011

Все знают, что вы можете получить доступ к переменной в PHP, используя это: $ {'varName'}. Но когда вам нужно получить / установить переменную, которая является частью массива, почему это не работает? Предположим, у нас есть этот кусок кода:

<?php
   $myArray = array(...);
   $myVarName = "myArray['my1']['my11']['my111']";
   ${$myVarName} = "new value";
?>

Разве это не должно работать? Я проверял это снова и снова - это не работает .. Есть ли способ сделать это?

Ответы [ 3 ]

12 голосов
/ 21 октября 2011

Я рекомендую вам не использовать динамические переменные, такие как ${$var}.Вам нужно изменить многомерный ассоциативный массив в соответствии с путем ключей.

<?php
$myArray = array(...); // multi-dimensional array
$myVarPath = array('my1', 'my11', 'my111');
setValueFromPath($myArray, $myVarPath);

function getValueFromPath($arr, $path)
{
    // todo: add checks on $path
    $dest = $arr;
    $finalKey = array_pop($path);
    foreach ($path as $key) {
        $dest = $dest[$key];
    }
    return $dest[$finalKey];
}

function setValueFromPath(&$arr, $path, $value)
{
    // we need references as we will modify the first parameter
    $dest = &$arr;
    $finalKey = array_pop($path);
    foreach ($path as $key) {
        $dest = &$dest[$key];
    }
    $dest[$finalKey] = $value;
}

Это процедурный пример, чтобы упростить его.Возможно, вы захотите поместить свой иерархический массив и эти функции внутри класса.

2 голосов
/ 21 октября 2011

Разве это не должно работать?

Нет.

Все знают, что вы можете получить доступ к переменной в PHP, используя это: $ {'varName'}.

Да,Тем не менее, все знают, что это плохо.

Как динамически обращаться к переменной (ам) массива php?

с массивом ('my1','my11','my111') вы можете ссылаться на любой конкретный массивчлен, использующий просто цикл.

0 голосов
/ 21 октября 2011

Вы могли бы сделать что-то подобное, но это было бы действительно плохой идеей.Извините, полковник;)

<?php
$mA = array();
$mVN = "mA['m1']['m2']['m3']";
eval('$'. $mVN . ' = "new value";');
print_r($mA);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...