比方說,我有以下多維數組:如何使用一個變量來解決複雜的關聯數組在PHP
$fruits['apple']['name'] = 'macintosh';
是否有一個變量引用整個關鍵路徑的方法嗎?
我想以某種方式做到以下幾點:
$path = "['apple']['name']";
echo $fruits[$path];
//output would be "macintosh"
比方說,我有以下多維數組:如何使用一個變量來解決複雜的關聯數組在PHP
$fruits['apple']['name'] = 'macintosh';
是否有一個變量引用整個關鍵路徑的方法嗎?
我想以某種方式做到以下幾點:
$path = "['apple']['name']";
echo $fruits[$path];
//output would be "macintosh"
是否有一個變量引用整個關鍵路徑的方法嗎?
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'
引用可能是你需要的東西:
$path = &$fruits['apple']['name'];
現在,您每次訪問$path
時,都會使用(或更改等)$fruits['apple']['name']
的值。
謝謝。我認爲這是迄今爲止我看到的最有希望的答案。 –
你想要做的事情不是直接可能的 - 如果變量被鏈接,這將是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);
顯然有可怕的,從來沒有將要使用的方法寫一個訪問函數: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
。
Ĵ布倫的#3的答案是你最好的選擇,但是,因爲他已經證明了按位與運算符(& =),而不是引用賦值他的答案是不正確的。這是更正後的代碼:
$fruits['apple'] = array('name' => 'macintosh');
$path = &$fruits['apple']['name'];
echo $path; // outputs 'macintosh';
&引用在我腦海裏.. – 2012-06-06 20:29:20
@vizvi你可以擴大一點嗎?謝謝。 –
你可以打電話:$ fruits2 =&fruits ['apple']; echo $ fruits2 ['name'];會給「麥金塔」 – 2012-06-06 20:31:42