Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Variables - Fatal编程技术网

PHP数组作为变量名

PHP数组作为变量名,php,arrays,variables,Php,Arrays,Variables,如何为php数组VARABLE发送索引名称 数组是 $array = array('Somthing'=>array('More'=>array('id'=> 34))); 现在我想显示这个东西,但是用一个变量名,我不知道如何解释,所以我写下我想要的 $index_name = '[Something][More][id]'; $array{$index_name}; 有可能吗?不是一下子就能做到的。以下是您的做法: $array['Something']['More']

如何为php数组VARABLE发送索引名称

数组是

$array = array('Somthing'=>array('More'=>array('id'=> 34)));
现在我想显示这个东西,但是用一个变量名,我不知道如何解释,所以我写下我想要的

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

$array{$index_name};

有可能吗?

不是一下子就能做到的。以下是您的做法:

$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)
函数数组\u multi(数组$arr,$path){
$parts=分解(“.”,$path);
$curr=&$arr;
对于($i=0,$l=count($parts);$i<$l;+$i){
如果(!isset($curr[$parts[$i]])){
//路径不存在
返回null;
}else if(($i<$l-1)和&!is_数组($curr[$parts[$i]])){
//路径不存在
返回null;
}
$curr=&$curr[$parts[$i]];
}
返回$curr;
}
//用法:
echo array_multi($array,“Something.More.id”);//34
echo array_multi($array,“Something.More”);//数组(“id”=>34)
您可以通过以下方式完成此操作:



更新:


似乎有些用户对使用eval()的想法感到不舒服。我认为在决定是否在您自己的代码中使用eval()之前,先使用eval()是有意义的。

好的,我知道这就是人们被枪杀的原因。但是拜托,
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

支持方括号语法的递归版本:

$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;
    }
}

如果你把自己逼到需要做这样的事情的地步,你很有可能以一种糟糕的方式做了其他事情。这样做是有正当理由的,但不是经常这样做

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));

正则表达式应该可以做到这一点。但更改不会非常有效或灵活。顺便说一句,您的原始代码中有一个输入错误。您在$array中定义了一个名为“Somthing”的键,但后来尝试引用它,称之为“Something”。不要错过这个问题的有效答案,使用eval()可以非常简单地完成此操作。讨论最佳实践非常重要,但如果我们仅仅因为认为我们比OP更了解情况而忽视问题的有效和简单的解决方案,那就太愚蠢了。干杯。如果你打算花时间否决我的答案,发表评论肯定会很好。我认为这与eval()有关用法。但我不是投反对票的人。具体来说,eval()呢用法?它完成了OP想要做的事情。这是一个完美的例子,说明了为什么它是错误的。你的字符串中有语法错误。谁他妈的想调试正在动态生成的代码?代码运行没有问题,所以我不知道所谓的语法错误在哪里。但是如果你提到索引键上缺少的引号我同意这很难看,但并没有错。php将所有未定义的常量计算为它们的字符串值,我只是从op中剪切了“n”粘贴。
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));