2012-06-06 34 views
2

比方說,我有以下多維數組:如何使用一個變量來解決複雜的關聯數組在PHP

$fruits['apple']['name'] = 'macintosh'; 

是否有一個變量引用整個關鍵路徑的方法嗎?

我想以某種方式做到以下幾點:

$path = "['apple']['name']"; 
echo $fruits[$path]; 

//output would be "macintosh" 
+0

&引用在我腦海裏.. – 2012-06-06 20:29:20

+0

@vizvi你可以擴大一點嗎?謝謝。 –

+0

你可以打電話:$ fruits2 =&fruits ['apple']; echo $ fruits2 ['name'];會給「麥金塔」 – 2012-06-06 20:31:42

回答

3

是否有一個變量引用整個關鍵路徑的方法嗎?

1)在這樣的方式:$fruits[$variable],答案是沒有,沒有

當然,有幾種方法,你可以在兩個或更多的拆單$變量,然後separetely使用其部分($fruits[$part1][$part2]

這是一個通用的解決方案:

function get_path($array, $path) 
{ 
    $value = $array; 
    $parts = explode("']['", trim($path, "[']")); 
    foreach($parts as $key) 
    { 
     $value = $value[$key]; 
    } 
    return $value; 
} 

$fruits['apple']['name'] = 'macintosh'; 
$path = "['apple']['name']"; 
echo get_path($fruits, $path); 

// output = 'macintosh' 

2)由於還指出,你可以使用 「EVAL」,這是不建議:

$fruits['apple']['name'] = 'macintosh'; 
$path = "['apple']['name']"; 
eval('echo $fruits' . $path . ';'); 

// output = 'macintosh' 

3)最後,如果您想使用引用變量訪問數組的元素,然後簡單地說:

$fruits['apple']['name'] = 'macintosh'; 
$path &= $fruits['apple']['name']; 
echo $path; // output = 'macintosh' 

$path = 'MSX'; 
echo $fruits['apple']['name']; // output = 'MSX' 
0

引用可能是你需要的東西:

$path = &$fruits['apple']['name']; 

現在,您每次訪問$path時,都會使用(或更改等)$fruits['apple']['name']的值。

+0

謝謝。我認爲這是迄今爲止我看到的最有希望的答案。 –

0

你想要做的事情不是直接可能的 - 如果變量被鏈接,這將是ambigous。

您需要如

define('SEPARATOR','|'); 

function getElement($array,$path) { 
    $path=explode(SEPARATOR,$path); 
    $out=&$array; 
    foreach ($path as $step) { 
    if (!isset($out[$step])) return null; 
    $out=$out[$step]; 
    } 
    return $out; 
} 

$path="apple|name"; 
echo getElement($fruits,$path); 
1

顯然有可怕的,從來沒有將要使用的方法寫一個訪問函數:eval()

但是,如果你真的想這樣做這個,我更喜歡這樣的方法:

function &array_value_by_address (&$array, $address, $addressSeparator = '/') { 
    $parts = explode($addressSeparator, $address); 
    $thisLevel = array_shift($parts); 
    if (isset($array[$thisLevel])) { 
    if ($parts) { 
     $ref = &array_value_by_address($array[$thisLevel], implode($addressSeparator, $parts)); 
     return $ref; 
    } else { 
     return $array[$thisLevel]; 
    } 
    } 
} 

由於在函數聲明中的引用,也可以捕獲返回值在一個變量中,並使用它來修改源數組。這是可選的 - 如果您在通話時忽略了&前綴,捕獲的值將只是copu而不是參考。

儘管如此 - 如果數組中的「地址」不存在,該函數將返回NULL,但無法區分此情況和存儲在數組中的值NULL

See it working

1

Ĵ布倫的#3的答案是你最好的選擇,但是,因爲他已經證明了按位與運算符(& =),而不是引用賦值他的答案是不正確的。這是更正後的代碼:

$fruits['apple'] = array('name' => 'macintosh'); 

$path = &$fruits['apple']['name']; 

echo $path; // outputs 'macintosh'; 
相關問題