2011-09-27 142 views
0

我有一個遞歸數組深度的變量,我希望能夠使用分隔符獲取字符串並將該字符串轉換爲該數組中的索引,使用變量變量獲取數組索引的值

例如

$path = 'level1.level2.level3'; 

將被轉換爲從陣列中得到以下

$data['level1']['level2']['level3'] = 'my data'; 

值「我的數據」我認爲得到這個是使用可變變量的最快方法S,但是當我嘗試下面的代碼

$index = "data['level1']['level2']['level3']"; 

echo $$index; 

我得到follwing錯誤

PHP Notice: Undefined variable: data['level1']['level2']['level3'] 

我能想到這樣做的效率非常低,可能有人請一些線索這光所有其他的方式,有可能在PHP中使用數組的變量變量嗎?任何其他有效的解決方法?

非常感謝。

+0

你所說的 「效率不高」?是什麼原因? –

+0

我稱之爲「低效率」,因爲如果索引很深並且數組結構很龐大,它會在遞歸數組內部複製數組。 – Haddad

回答

0

嘗試

$index = "data"; 
echo $$index['level1']['level2']['level3']; 

代替,因爲$index應該是唯一的變量名

+0

Ehm,downvote的原因是什麼?有人憤怒嗎?小心解釋,這樣我可以改善我的答案? – genesis

+1

這不會對他有幫助,因爲他沒有level1/level2/level3的細分。如果他這樣做了,那麼就不需要使用'$$ index'符號 –

+0

@AleksG:他需要做的唯一的事情就是用變量來改變'level1'......這些變量不會與變量名 – genesis

2

你必須循環數組,你就無法做到這一點使用可變的變量,據我知道。這似乎工作,雖然:

<?php 

function retrieve($array, $path) { 
    $current = $array; 
    foreach(explode('.', $path) as $segment) { 
     if(false === array_key_exists($segment, $current)) { 
      return false; 
     } 
     $current = $current[$segment]; 
    } 
    return $current; 
} 

$path = 'level1.level2.level3'; 

// will be converted to get the value 'my data' from the array below 
$data['level1']['level2']['level3'] = 'my data'; 

var_dump(retrieve($data, $path)); 
+0

您可以使用'isset($ current [$ segment])'而不是' array_key_exists()'。它會快一點。 –

+0

@ScottSaunders你可以,但如果該值爲「null」,則不起作用。這就是爲什麼我選擇了array_key_exists。 –

+0

@Scott我會注意到這個「有點」嗎? –

2

這是一個棘手的這一點,這裏是最有效的方法我能想到的:

function get_value_from_array ($array, $path, $pathSep = '.') { 
    foreach (explode($pathSep, $path) as $pathPart) { 
    if (isset($array[$pathPart])) { 
     $array = $array[$pathPart]; 
    } else { 
     return FALSE; 
    } 
    } 
    return $array; 
} 

返回值,或FALSE的失敗。

+0

這個答案和Berry提出的解決方案類似於我已經實現的解決方案,我試圖優化它,因爲如果被截取的值非常深結構(並且陣列結構可能會很大),這意味着將會有很多陣列複製週期,這將是昂貴的 – Haddad

+0

@Haddad可能不足以讓您擔心它。除非你這樣做幾十萬次,否則它應該不會有太大的差異。 – DaveRandom

+0

@Haddad那麼,如果我可能會問,你是否在做foo.bar.path thingy?爲什麼不只是$ array ['foo'] ['bar'] ['path']?你真的需要使用嗎?作爲分隔符? –

-1

事情是這樣的:

eval('$data[\''.implode("']['",explode('.',$path))."'] = 'my data';"); 

... ...但不要永遠,永遠告訴任何人,我告訴你這樣做。

-1

可以使用eval功能,像這樣:

$data['level1']['level2']['level3'] = 'my data'; 
eval("\$index = \$data['level1']['level2']['level3'];"); 
echo $index; 
+0

小心解釋爲什麼downvoted? –