2010-01-31 108 views
2

如何爲php數組發送索引名稱vairable。作爲變量名稱的PHP數組

數組是

$array = array('Somthing'=>array('More'=>array('id'=> 34))); 

,現在我想顯示這個事情,但有一個變量名,我不知道該怎麼解釋,所以我寫我想有什麼。

$index_name = '[Something][More][id]'; 

$array{$index_name}; 

這有可能嗎?

+0

這應該可以用正則表達式。但它不會變得非常有效或靈活。 – Tammo 2010-01-31 14:26:51

+0

順便說一句,你有你的原代碼中的拼寫錯誤。您在$ array中定義一個名爲'Somthing'的鍵,但稍後您會嘗試引用它,將其稱爲'Something'。 – 2010-01-31 14:32:57

+0

不要錯過這個問題的有效答案,這使得使用eval()非常簡單。討論SO的最佳實踐很重要,但是當我們忽略了有效和簡單的問題解決方案時,很愚蠢,因爲我們認爲我們比OP更瞭解情況。乾杯。 – 2012-09-27 20:10:14

回答

15

不是這樣的。這裏是你會怎麼做:

$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) 
+0

+1我真的很喜歡這個答案:) – 2010-01-31 14:26:24

1

您可以用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是有意義的。

+2

如果你打算花時間降低我的答案,評論肯定會很好。 – 2010-01-31 14:37:22

+1

我會假設它必須與eval()的用法有關。雖然我不是那個倒下的人。 – 2010-01-31 14:39:59

+2

具體來說,eval()的用法呢?它完成了OP想要做的事情。 – 2010-01-31 14:41:02

1

好吧,我知道這是人們被槍殺的方式。但來吧,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 
+0

這是一個完美的例子,它爲什麼錯了。你的**字符串**有語法錯誤。他們想要調試正在生成的代碼嗎? – nickf 2010-01-31 15:13:11

+0

該代碼運行沒有問題,所以我不知道所謂的語法錯誤在哪裏。如果你指的是索引鍵上的缺失引號,我同意它很醜陋,但這沒有錯。 php會將所有未定義的常量評估爲它們的字符串值,並且我簡單地從操作中刪除'n'pasted。 – 2010-01-31 15:18:43

2

遞歸版本,支持用方括號你的語法:

$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; 
    } 
} 
1

如果你逼到自己陷入需要做這樣的事情,有你做別的事情的一個非常好的機會糟糕的方式。有這樣的理由是有道理的,但並不經常。

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