如何使用字符串从嵌套数组中获取值

4

我有一个这样的数组:

$temp = array( '123' => array( '456' => array( '789' => '0' ) ),
               'abc' => array( 'def' => array( 'ghi' => 'jkl' ) )
             );

我有一个像这样的字符串:

$address = '123_456_789';

我能否通过上述数组 $temp 和字符串 $address 获取 $temp['123']['456']['789'] 的值?

有没有办法实现这个功能,使用它是不是一个好的做法?


当然,你可以解析$address字符串,从中获取3个键,然后使用它们来寻址$temp中的正确值,但为什么呢?这样做有用例吗?了解这将如何使用可能会极大地影响答案。 - Typel
在这里搜索,你的问题已经被回答了。 - u_mulder
eval()算作良好的实践吗? - Typel
@Typeless eval只是回答第一部分问题的一种方式。在我看来,第二部分有点基于个人观点。 - Don't Panic
显示剩余4条评论
3个回答

7
这是一个简单的函数,它接受一个数组和一个字符串地址,其中键由任何定义的分隔符分隔。使用这种方法,我们可以使用for循环迭代到所需深度的数组,如下所示。
<?php
function delimitArray($array, $address, $delimiter="_") {
    $address = explode($delimiter, $address);
    $num_args = count($address);

    $val = $array;
    for ( $i = 0; $i < $num_args; $i++ ) {
        // every iteration brings us closer to the truth
        $val = $val[$address[$i]];
        }
    return $val;
    }

$temp = array("123"=>array("456"=>array("789"=>"hello world")));
$address = "123_456_789";
echo delimitArray($temp,$address,"_");
?>

3

你好,如果你的情况是字符串 $address = '123_456_789';,那么你可以使用explode函数按照某个分隔符拆分字符串,然后输出你需要的值。

<?php
$temp = array('123' => array('456' => array('789' => '0')),
    'abc' => array('def' => array('ghi' => 'jkl')),
);
$address = '123_456_789';
$addr = explode("_", $address);
echo $temp[$addr[0]][$addr[1]][$addr[2]];

[编辑我的先前评论] 它实际上可以工作并且非常简单。如果放在一个函数内可能会更加“漂亮”,但无论如何+1 :) - al'ein
$addr中的元素数量可能不同。因此,在123_456的情况下它将无法工作。 - Awan
@Awan 直到 explode 之前,一切都很好。如果您构建一个函数,在将 $addr 作为参数应用之前验证您的数组级别,您可以将其应用于您拥有的任何字符串(以相同的模式)。 - al'ein
如果数组长度不同,则我会查看@Typeless的解决方案。 - Jujunol

0

使用这个数组库,您可以通过将字符串转换为键数组并使用explode轻松获取元素值:

Arr::get($temp, explode('_', $address))

或将_替换为.以利用点符号访问

Arr::get($temp, str_replace('_', '.', $address))

使用这种方法的另一个好处是,如果给定键的元素不存在于数组中,则可以设置默认回退值来返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接