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

时间:2012-02-24 15:38:04

标签: 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';

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

5 个答案:

答案 0 :(得分:4)

eval('$myArray[0][1][2] = "stuff";');
eval('$myArray'.$index1.' = "stuff";');

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

答案 1 :(得分:3)

不直接。 $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);
    }
}

注意:我在答案编辑器中创建了上面的代码,因此它可能包含一两个错字; )

答案 2 :(得分:1)

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

答案 3 :(得分:0)

总有邪恶的评价:

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

答案 4 :(得分:-3)

您可以使用两个匿名函数。

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

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