如何爲php數組發送索引名稱vairable。作爲變量名稱的PHP數組
數組是
$array = array('Somthing'=>array('More'=>array('id'=> 34)));
,現在我想顯示這個事情,但有一個變量名,我不知道該怎麼解釋,所以我寫我想有什麼。
$index_name = '[Something][More][id]';
$array{$index_name};
這有可能嗎?
如何爲php數組發送索引名稱vairable。作爲變量名稱的PHP數組
數組是
$array = array('Somthing'=>array('More'=>array('id'=> 34)));
,現在我想顯示這個事情,但有一個變量名,我不知道該怎麼解釋,所以我寫我想有什麼。
$index_name = '[Something][More][id]';
$array{$index_name};
這有可能嗎?
不是這樣的。這裏是你會怎麼做:
$array['Something']['More']['id']
如果你特別想訪問多維數組有一個字符串,那麼你可以建立一個函數來做到這一點:
function array_multi(Array $arr, $path) {
$parts = explode(".", $path);
$curr =& $arr;
for ($i = 0, $l = count($parts); $i < $l; ++$i) {
if (!isset($curr[$parts[$i]])) {
// path doesn't exist
return null;
} else if (($i < $l - 1) && !is_array($curr[$parts[$i]]) {
// path doesn't exist
return null;
}
$curr =& $curr[$parts[$i]];
}
return $curr;
}
// usage:
echo array_multi($array, "Something.More.id"); // 34
echo array_multi($array, "Something.More"); // array("id" => 34)
+1我真的很喜歡這個答案:) – 2010-01-31 14:26:24
您可以用eval()做到這一點:
<?php
$array = array('Somthing'=>array('More'=>array('id'=> 34)));
$index_name = "['Somthing']['More']['id']";
$stmt='echo $array'.$index_name.';';
eval($stmt);
?>
UPDATE:
似乎有些SO用戶對使用eval()的想法感到不舒服。在決定是否在你自己的代碼中使用它之前,我認爲它對於read this thread which discusses the pros and cons是有意義的。
如果你打算花時間降低我的答案,評論肯定會很好。 – 2010-01-31 14:37:22
我會假設它必須與eval()的用法有關。雖然我不是那個倒下的人。 – 2010-01-31 14:39:59
具體來說,eval()的用法呢?它完成了OP想要做的事情。 – 2010-01-31 14:41:02
好吧,我知道這是人們被槍殺的方式。但來吧,eval()
是不是總是錯誤的答案。
$array = array('Something'=>array('More'=>array('id'=> 34)));
$index_name = '[Something][More][id]';
eval('$val = $array'.$index_name.';'); // Wrap in a function or something
這是一個完美的例子,它爲什麼錯了。你的**字符串**有語法錯誤。他們想要調試正在生成的代碼嗎? – nickf 2010-01-31 15:13:11
該代碼運行沒有問題,所以我不知道所謂的語法錯誤在哪裏。如果你指的是索引鍵上的缺失引號,我同意它很醜陋,但這沒有錯。 php會將所有未定義的常量評估爲它們的字符串值,並且我簡單地從操作中刪除'n'pasted。 – 2010-01-31 15:18:43
遞歸版本,支持用方括號你的語法:
$array = array('Something'=>array('More'=>array('id'=> 34)));
$string = '[Something][More][id]';
echo scan_array($string, $array);
function scan_array($string, $array) {
list($key, $rest) = preg_split('/[[\]]/', $string, 2, PREG_SPLIT_NO_EMPTY);
if ($key && $rest) {
return scan_array($rest, $array[$key]);
} elseif ($key) {
return $array[$key];
} else {
return FALSE;
}
}
如果你逼到自己陷入需要做這樣的事情,有你做別的事情的一個非常好的機會糟糕的方式。有這樣的理由是有道理的,但並不經常。
function key_path($arr, $keys) {
return $keys ? key_path($arr[array_shift($keys)], $keys) : $arr;
}
$arr['Something']['More']['id'] = 34;
$keys = array('Something', 'More', 'id');
var_dump(key_path($arr, $keys));
這應該可以用正則表達式。但它不會變得非常有效或靈活。 – Tammo 2010-01-31 14:26:51
順便說一句,你有你的原代碼中的拼寫錯誤。您在$ array中定義一個名爲'Somthing'的鍵,但稍後您會嘗試引用它,將其稱爲'Something'。 – 2010-01-31 14:32:57
不要錯過這個問題的有效答案,這使得使用eval()非常簡單。討論SO的最佳實踐很重要,但是當我們忽略了有效和簡單的問題解決方案時,很愚蠢,因爲我們認爲我們比OP更瞭解情況。乾杯。 – 2012-09-27 20:10:14