Доступ к ассоциативному массиву PHP с индексом, представленным в виде строки - PullRequest
2 голосов
/ 24 февраля 2012

Возможно ли сделать что-то подобное в 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 ]

4 голосов
/ 24 февраля 2012
eval('$myArray[0][1][2] = "stuff";');
eval('$myArray'.$index1.' = "stuff";');

Но будьте осторожны при использовании eval и пользовательского ввода, так как он уязвим для атак внедрения кода.

3 голосов
/ 24 февраля 2012

Не напрямую. $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);
    }
}

Примечание: я сделал код выше в редакторе ответов, чтобы он мог содержать опечатку или два; )

1 голос
/ 24 февраля 2012
$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);
0 голосов
/ 24 февраля 2012

Всегда есть злой эвал:

eval('$myArray' . $index1 . ' = "stuff";');
0 голосов
/ 24 февраля 2012

Для этого вы можете использовать две анонимные функции.

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

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