2012-02-24 91 views
2

是否有可能做這樣的事情在PHP?索引訪問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'; 

我已經搜索了一個解決方案,但我不認爲我知道關鍵字涉及到搞清楚這一點。

+1

你可以用的eval()這樣做,但我建議不要使用它。我們可以問爲什麼你想這樣做?有可能是另一種方式來完成你想要的:) – Maurice 2012-02-24 15:46:27

+0

我寫一個遞歸函數數組變造不同的維度。如果你傳遞'$ array ['cow']'到一個函數中,我敢肯定你不能從該函數訪問'$ array'(即使通過引用傳遞) – afuzzyllama 2012-02-24 15:48:28

回答

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

注:I上面的代碼中的答案編輯器中進行,因此它可能包含一個錯字或兩個; )

+0

我剛剛意識到我的答案不是一個解決方案,因爲它只是爲了獲得一個值,而提問者想設置一個值。 – 2012-02-24 15:57:02

+0

添加了一個函數,可以設置值 – 2012-02-24 16:03:11

+0

我試圖想到一個正則表達式解決方案,但如果遇到'$ index =「['[a]']」;會發生什麼?我認爲一般解決方案的可能輸入可能太複雜了。 – afuzzyllama 2012-02-24 16:04:28

-3

您可以使用兩種匿名函數這一點。

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

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

我明白這個問題意味着''[0 ] [1] [2]「'是可變的。 – 2012-02-24 15:42:47

+0

他希望它周圍,如果指標改變,會發生什麼其他的方式:) – Maurice 2012-02-24 15:43:02

+1

? – afuzzyllama 2012-02-24 15:44:36

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

但使用eval和用戶輸入的時候,因爲它很容易受到代碼注入攻擊要小心。

+0

gahh,是'eval()唯一的解決方案嗎? – afuzzyllama 2012-02-24 15:45:35

+0

你也可以用髒方法來解析你的$ index字符串,然後通過數組級別循環。對這種方法感興趣? – Basti 2012-02-24 15:46:19

+2

'eval'可能不是唯一的解決方案,但它是*最好的*之一。 'eval'完全是*你正在尋找的東西。請不要盲目忽略最好的解決方案,因爲你聽到人們說「eval是邪惡的」。 – meagar 2012-02-24 15:48:10

0

總有邪惡的eval:

eval('$myArray' . $index1 . ' = "stuff";'); 
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);