PHP: используя строку 'address' значения в массиве, получите значение - PullRequest
0 голосов
/ 05 июля 2011

У меня есть массив person с ключом 'n' для имени. Значение для 'n' - это массив, ключ 'l' (сокращение от 'last') имеет значение, которое я хочу получить, фамилию.

По любопытным причинам программирования у меня есть "адрес" фамилии в виде строки .

Как мне это сделать?
Я пробовал Eval, среди других.

К сожалению, я не был ясен !!

Я хочу использовать переменную $ test, чтобы получить ее.

например. что-то вроде:

$person[$test]

(что, очевидно, не работает, но что делает?)

$test не всегда будет «двумя глубокими». Например. иногда это будет ['a']['residential']['street']

<?php

    $test = "['n']['l']";

    echo "I've got a string with the array index ".$test. "\n";

    $person = array("n"=>array('l'=>'SMITH'));

    echo 'the array, $person, is this: '."\n";
    print_r($person);

    echo "What I want is ".$person['n']['l']. "\n";
    ?>

Выход:

I've got a string with the array index ['n']['l']
the array, $person, is this: 

    Array
    (
        [n] => Array
            (
                [l] => SMITH
            )

    )

Я хочу смит

Ответы [ 4 ]

2 голосов
/ 05 июля 2011

Я верю, что это заставит эту работу работать так, как вы ожидаете:

Это выведет SMITH - см. http://codepad.org/M3jRDg99

eval("echo \$person$test;");

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

2 голосов
/ 05 июля 2011

У вас есть всего две опции:

Использование eval :

function IAmEvilSoYouShouldNotCallMe($array, $key) {
    return eval('return $array' . $key . ';');
}

echo IAmEvilSoYouShouldNotCallMe(
    array("n"=>array('l'=>'SMITH')),
    "['n']['l']"
);

Или разбор строки:

function helper($array, $key) {
    $keys = array_map(function ($val) {
        return trim($val, "]['");
    }, explode('][', $key));    

    while ($key = array_shift($keys)) {
        if (isset($array[$key])) {
            $array = $array[$key];
            continue;
        }

        return null;
    }

    return $array;
}

echo helper(
    array("n"=>array('l'=>'SMITH')),
    "['n']['l']"
);

Оба вывода:

SMITH
0 голосов
/ 05 июля 2011

Я не вижу никакой законной причины для использования массивов в этом случае, вы только усложняете свою жизнь кодирования. Вам нужно изучить объектно-ориентированное программирование (ООП).

Тогда вам нужно будет только создать объект People, который будет содержать массив объектов Person.

В простейшей форме вы бы получили имя человека просто с

People->listOfPersons[0]->fullName->familyName 

или даже лучше с геттерами и сеттерами:

People->getNextPerson()->getFamilyName()
0 голосов
/ 05 июля 2011
$index1 = $test[2];    
$index2 = $test[7];

echo $person[$index1][$index2];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...