Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用字符串从嵌套数组中获取值_Php_Arrays_String_Multidimensional Array - Fatal编程技术网

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

Php 如何使用字符串从嵌套数组中获取值,php,arrays,string,multidimensional-array,Php,Arrays,String,Multidimensional Array,我有这样一个数组: $temp = array( '123' => array( '456' => array( '789' => '0' ) ), 'abc' => array( 'def' => array( 'ghi' => 'jkl' ) ) ); $address = '123_456_789'; 我有这样一个字符串: $temp = array( '123' => array( '4

我有这样一个数组:

$temp = array( '123' => array( '456' => array( '789' => '0' ) ),
               'abc' => array( 'def' => array( 'ghi' => 'jkl' ) )
             );
$address = '123_456_789';
我有这样一个字符串:

$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='123_456_789',您好;如果是您的情况,那么您可以使用explode函数通过使用某些delimeter拆分字符串,并可以输出您的值

<?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]];

这是一个简单的函数,它接受数组和字符串地址,其中键由任何定义的分隔符分隔。使用这种方法,我们可以使用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,"_");
?>

使用explode:

Arr::get($temp,explode('''u',$address))
或者用
替换
,以利用点符号访问

Arr::get($temp,str_replace(“,”,$address))

使用的另一个好处是,如果数组中不存在具有给定键的元素,则可以将默认回退值设置为返回。

我不理解这个问题。对于阵列,是的,这是正常使用。对于字符串编号,它们不相关。数组是结构化数据,而字符串只是一行中的一组字符。当然,您可以解析$address字符串,从中获取3个键,然后使用它们来寻址$temp中的正确值,但为什么呢?有这样的用例吗?知道这将如何使用可能会极大地影响答案。在这里搜索,您的问题已经得到了回答。但是eval()算是好的做法吗?可能与[编辑我以前的内容]重复它实际上很有效,而且非常简单。如果适合在函数中,则可能“更漂亮”,但无论如何+1:)在
$addr
中的元素数可能不同。因此,在
123_456
@Awan的情况下,它将不起作用,直到
爆炸
,一切正常。如果您在将
$addr
应用为参数之前构建一个函数来验证数组级别,那么您可以将其应用于任何字符串(在相同的模式中),如果数组长度不同,那么我将查看@Typeless”解决方案