2013-07-07 47 views
0

我配置的陣列:有沒有辦法從同一個數組中的另一個值訪問一個值?

return array(
    'admin_url' => 'admin', 
    'routes' => array(
     'link1' => 'admin/link1', 
     'link2' => 'admin/link2' 
    ) 
); 

是否有可能直接獲得「鏈接1」 ADMIN_URL「?喜歡的東西:

... 
'routes' => array(
    'link1' => someDynamicGet.'/link1', 
... 

嘗試:

return $config = array(
    'admin_url' => 'admin', 
    'routes' => array(
     'link1' => $config['admin_url'].'/link1', 
     'link2' => $config['admin_url'].'/link2' 
    ) 
); 

沒有工作。

+0

如果將'admin_url'改爲'adm',那麼'link1'和'link2'分別改爲'adm/link1'和'adm/link2'。 –

+0

你應該顯示你的「動態」背後的邏輯。 – brasofilo

+0

是的,可以通過實現ArrayAccess來創建一個與數組類似的對象,然後攔截__set調用。但是,我建議你只寫一個普通課,練習封裝技巧。 – goat

回答

3

我認爲你正在尋找

$retArray = return array(
    'admin_url' => 'admin', 
    'routes' => array(); 
); 
$retArray['routes']['link1'] = $retArray['admin_url'].'/link1'; 
$retArray['routes']['link2'] = $retArray['admin_url'].'/link2'; 

return $retArray; 

這不是 '動態'。如果你創建了一個類,你可能會'動態地'做出你想要的。

+0

這是一個解決方案,不是很優雅,但如果沒有其他解決方案,我會執行它。謝謝 –

+0

我同意這不是'優雅' - 我們不能總是擁有一切!正如我所說 - 你可能會得到一個更優雅的解決方案,但「優雅」並不總是「最清晰」。 – 2013-07-07 21:53:09

+0

我同意,謝謝! –

0

不,它不是。您必須在數組聲明之外取值admin_url以引用它,否則請在單獨的步驟中添加引用它的元素。

1

不,你不能做這樣的事情:

$array = array(0,1,2,$array[1]); //error! 

但有一些真正有趣的這個問題!您可能做到這一點:

$admin = 'admin'; 
$array = array('admin_url' => &$admin); //passing by referance 

現在,當你改變變量$admin它也改變了$數組中!

$admin = 'Ziarno'; 
echo $array['admin_url']; //echoes 'Ziarno'! 

但是,您不能這個串聯爲一個字符串:

$array2 = array(
'admin_url' => &$admin, 
'routes' => array(
    'link1' => &$admin . '/link1', //error! 
    'link2' => "$admin/link2"  // will not change when the var $admin changes :(
) 
); 

所以最終,一個簡單的解決方案,這將是:

$admin = 'admin'; 

$array = array(
    'admin_url' => $admin, 
    'routes' => array(
     'link1' => "$admin/link1", 
     'link2' => "$admin/link2" 
    ) 
); 

然而,當$ admin更改時,$ array值不會自動更改 ...但如果您將它用作函數的返回值ñ,我認爲它應該工作得很好。

return $array; 
1

正如Jon和其他人所說的那樣,訪問數組聲明中的值是不可能的。我不知道在什麼情況下你需要做到這一點,但如果你真的需要重新配置你的數組,我會把它包裝在一個像這樣的函數中(僅適用於PHP> = 5.3):

 
function set_config_routes(array $array) { 
    $return = array('admin_url'=>$array['admin_url']); 
     array_walk_recursive($array, function($val, $key) use (&$return) { 
     if(substr($key,0,4)=='link'){   
      $return['routes'][$key] = $return['admin_url'].$val; 
     } 
     }); 
    return $return; 
} 

然後調用它像這樣:

 
$config = set_config_routes($config); 

麥克W和其他人也都表示,你真的應該考慮使用類和對象的更有效的做法。

相關問題