PHP:使用字符串';地址';数组中某个值的

PHP:使用字符串';地址';数组中某个值的,php,arrays,string,indexing,Php,Arrays,String,Indexing,我有一个person数组,名称为key'n'。“n”的值是一个数组,其中键“l”(last的缩写)具有我想要获取的值,即姓氏 出于奇怪的编程原因,我将姓氏的“地址”作为字符串 我该怎么做? 我试过eval等 对不起,我说的不清楚 我想要的是使用变量$test来获取它 例如,类似于: $person[$test] (这显然不起作用,但什么起作用?) $test并不总是“两个深度”。例如,有时是['a']['residential']['street'] <?php $test =

我有一个person数组,名称为key'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";
    ?>

我相信这将使它按照您期望的方式工作:

这将输出SMITH-see


我想这对你不起作用的原因可能与逃避美元符号有关。

你几乎只有两个选择:

使用:

或字符串解析:

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

在这种情况下,我看不出使用数组的正当理由,这只会使您的编码生活变得复杂。您需要学习的是面向对象编程(OOP)

然后您只需要创建一个包含Person对象数组的People对象

在最简单的形式中,你只需要用一个

People->listOfPersons[0]->fullName->familyName 
或者更好地使用getter和setter:

People->getNextPerson()->getFamilyName()

我不完全确定你的问题是什么。您显示您可以访问$person['n']['l'],但这似乎是您的问题。您已经在这样做了,怎么了?我不清楚您的问题,但我肯定不想在回音中显示数组的内容,但您必须使用print_r()我猜op希望使用
$test
变量来获取数组位置,而不是在
echo上使用静态
['n']['l']
$person['n']['l']
part.删除了mongodb标记,因为它与此问题无关(即使数据来自于此)。显然,他的字符串始终具有相同的结构和不同的索引名,否则我怀疑有没有办法做到这一点……他可以使用正则表达式。正则表达式也会有类似的问题。我假设$person数组的结构总是相同的,$test字符串也是一样的(总是['index_1']['index_2'])。我宁愿问这样做的意义是什么,为什么索引会改变等等?谢谢,就是这样!为了在eval中分配一个变量,我只做了:
eval(\$foo=\$person$test;)@Dan请注意,您应该非常小心地使用eval。最好不要使用它。我最终选择了这条路线,所以我不必使用eval。
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
People->listOfPersons[0]->fullName->familyName 
People->getNextPerson()->getFamilyName()