访问索引表示为字符串的PHP关联数组

访问索引表示为字符串的PHP关联数组,php,associative-array,Php,Associative Array,可以在PHP中执行类似的操作吗 $index1 = "[0][1][2]"; $index2 = "['cat']['cow']['dog']"; // I want this to be $myArray[0][1][2] $myArray{$index1} = 'stuff'; // I want this to be $myArray['cat']['cow']['dog'] $myArray{$index2} = 'morestuff'; 我已经搜索了一个解决方案,但我不知道解决这

可以在PHP中执行类似的操作吗

$index1 = "[0][1][2]";
$index2 = "['cat']['cow']['dog']";

// I want this to be $myArray[0][1][2]
$myArray{$index1} = 'stuff';

// I want this to be $myArray['cat']['cow']['dog']
$myArray{$index2} = 'morestuff';

我已经搜索了一个解决方案,但我不知道解决这个问题所涉及的关键字。

您可以使用两个匿名函数

$getThatValue = function($array){ return $array[0][1][2]; };
$setThatValue = function(&$array, $val){ $array[0][1][2] = $val; };

$setThatValue($myArray, 'whatever');
$myValue = $getThatValue($myArray);

但在使用eval和用户输入时要小心,因为它容易受到代码注入攻击

不直接
$myArray[$index]
将计算为
$myArray['[0][1][2]]
。您可能需要分离每个维度或编写一个小函数来解释字符串:

function strIndexArray($arr, $indices, $offset = 0) {
     $lb = strpos($indices, '[', $offset);
     if ($lb === -1) {
         return $arr[$indices];
     }
     else {
         $rb = strpos($indices,']', $lb);
         $index = substr($indices, $lb, $rb - $lb);
         return strIndexArray($arr[$index], substr($indices, $rb+1));
     }
}
您可能会找到一些正则表达式来更容易地提取索引,这将导致如下结果:

$indices = /*regex*/;
$value = '';
foreach($indices as $index) {
    $value = $array[$index];
}
要在数组中设置值,可以使用以下函数:

function setValue(&$arr, $indices, $value) {
    $lb = strpos($indices, '[');
    if ($lb === -1) {
        $arr = $value;
    }
    else {
        $rb = strpos($indices, ']', $lb);
        $index = substr($indices, $lb, $rb);
        setValue($arr[$index], substr($indices, $lb, $rb+1), $value);
    }
}

注意:我在答案编辑器中编写了上述代码,因此它可能包含一两个输入错误;)

总是有邪恶的评价:

eval('$myArray' . $index1 . ' = "stuff";');

我理解这个问题的意思是,
“[0][1][2]”“
是可变的。他想反过来:)如果索引发生变化会发生什么?gahh,
eval()
是唯一的解决方案吗?你也可以用肮脏的方式来解析$index字符串,然后循环遍历数组级别。对这种方法感兴趣?
eval
可能不是唯一的解决方案,但它是最好的<代码>评估正是您要寻找的。请不要因为听到人们说“eval是邪恶的”就盲目地忽略了最好的解决方案。eval是邪恶的,我通常在使用它之前寻找所有可能的解决方案!伙计们,冷静点。我们在这里都是朋友。每个人都可以相信他们想要的。我们不讨论意见,我们讨论论点。你可以用eval()来做,但我建议不要用它。我们可以问一下你为什么要这样做吗?可能还有另一种方法可以实现您想要的:)我正在编写一个递归函数,它可以改变数组的不同维度。如果你将,
$array['cow']
传递到一个函数中,我很确定你无法从该函数中访问
$array
(即使通过引用传递)。我刚刚意识到我的答案不是一个解决方案,因为它只是获取一个值,而提问者想要设置一个值。我正在尝试想出一个正则表达式解决方案,但是,如果遇到“$index=“['[a]']”;”,会发生什么呢;。我认为一个通用解决方案的可能输入对于一个人来说可能太复杂了。在这种情况下,这个东西会中断并使用
”[a
作为索引,然后再次使用该索引进行获取和设置,这样就不会丢失所有内容。此外,我一生中从未使用过
[
]
在数组索引中,但我能理解这只是我自己。我选择了这一个,因为它清楚地显示了编码人员对代码正在完成的任务的意图。对于阅读本文的任何人来说,
eval()
可能是一个可接受的解决方案,但在实践中,具有此意图的函数调用要好得多。您是['[a]]],检查一下$lb2=strpos($index,,[',$lb);$lb2<$rb;就可以发现这种特殊情况。
eval('$myArray' . $index1 . ' = "stuff";');
$index1 = "[0][1][2]";
$index2 = "['cat']['cow']['dog']";

function myArrayFunc(&$myArray,$myIndex,$myData) {
    $myIndex = explode('][',trim($myIndex,'[]'));
    $m = &$myArray;
    foreach($myIndex as $myNode) {
        $myNode = trim($myNode,"'");
        $m[$myNode] = NULL;
        $m = &$m[$myNode];
    }
    $m = $myData;
}

// I want this to be $myArray[0][1][2]
myArrayFunc($myArray,$index1,'stuff');

// I want this to be $myArray['cat']['cow']['dog']
myArrayFunc($myArray,$index2,'morestuff');


var_dump($myArray);