PHP массив как имя переменной - PullRequest
2 голосов
/ 31 января 2010

Как отправить имя индекса для массива php vairable.

массив

$array = array('Somthing'=>array('More'=>array('id'=> 34)));

и теперь я хочу показать это, но с именем переменной я не знаю, как объяснить, поэтому я пишу то, что хочу иметь.

$index_name = '[Something][More][id]';

$array{$index_name};

Возможно ли это как-нибудь?

Ответы [ 5 ]

15 голосов
/ 31 января 2010

Не за один раз так. Вот как вы это сделаете:

$array['Something']['More']['id']

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

function array_multi(Array $arr, $path) {
    $parts = explode(".", $path);

    $curr =& $arr;
    for ($i = 0, $l = count($parts); $i < $l; ++$i) {
        if (!isset($curr[$parts[$i]])) {
            // path doesn't exist
            return null;
        } else if (($i < $l - 1) && !is_array($curr[$parts[$i]]) {
            // path doesn't exist
            return null;
        }
        $curr =& $curr[$parts[$i]];
    }
    return $curr;
}

// usage:
echo array_multi($array, "Something.More.id");    // 34
echo array_multi($array, "Something.More");       // array("id" => 34)
2 голосов
/ 31 января 2010

Рекурсивная версия, поддерживающая ваш синтаксис в квадратных скобках:

$array = array('Something'=>array('More'=>array('id'=> 34)));

$string = '[Something][More][id]';

echo scan_array($string, $array);

function scan_array($string, $array) {
    list($key, $rest) = preg_split('/[[\]]/', $string, 2, PREG_SPLIT_NO_EMPTY);
    if ( $key && $rest ) {
        return scan_array($rest, $array[$key]);
    } elseif ( $key ) {
        return $array[$key];
    } else {
        return FALSE;
    }
}
1 голос
/ 31 января 2010

Если вы загнали себя в ловушку необходимости делать что-то подобное, есть очень хороший шанс, что вы сделали что-то еще плохим способом. Для этого есть веские причины, но не очень часто.

function key_path($arr, $keys) {
    return $keys ? key_path($arr[array_shift($keys)], $keys) : $arr;
}

$arr['Something']['More']['id'] = 34;
$keys = array('Something', 'More', 'id');

var_dump( key_path($arr, $keys));
1 голос
/ 31 января 2010

Хорошо, я знаю, что так стреляют в людей.Но давай, eval() не всегда неправильный ответ.

$array = array('Something'=>array('More'=>array('id'=> 34)));
$index_name = '[Something][More][id]';
eval('$val = $array'.$index_name.';'); // Wrap in a function or something
1 голос
/ 31 января 2010

Вы можете сделать это с помощью eval () :

<?php

$array = array('Somthing'=>array('More'=>array('id'=> 34)));
$index_name = "['Somthing']['More']['id']";

$stmt='echo $array'.$index_name.';';
eval($stmt);

?>

UPDATE:

Кажется, некоторым пользователям SO не нравится идея использовать eval (). Я думаю, что имеет смысл прочитать эту ветку, в которой обсуждаются плюсы и минусы , прежде чем решить, использовать ли это в своем собственном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...