2014-02-07 71 views
0

是否可以將變量變量用作數組前綴?我有一組格式爲$x_settings的數組,我想輸出只有一個的值,具體取決於哪個前綴符合條件。使用變量變量作爲數組前綴

這是更爲複雜的代碼非常精簡版本,所以謝謝你的放縱:

$current_env = 'local'; 

$local_settings = array 
(
    'debug' => TRUE, 
    'cake' => TRUE, 
    'death' => FALSE 
); 

$environments = array 
(
    'local', 
    'dev', 
    'prod' 
); 

foreach($environments as $env) 
{ 
    if($current_env == $env) 
    { 
    define('DEBUG', ${$env}_settings['debug']); 
    define('CAKE', ${$env}_settings['cake']); 
    define('DEATH', ${$env}_settings['death']); 

    break; 
    } 
} 

正如你可以看到我嘗試使用${$env}_settings[]但給了我一個PHP錯誤:

unexpected '_settings' (T_STRING)

可能嗎?

+0

爲什麼你不能只使用二維數組? –

+0

'$ current_env = $ env'是** always ** true,因爲這意味着「將'current_env設置爲$ env'的值。你的意思是條件運算符'=='還是'==='? – h2ooooooo

回答

3

是的,這是可能的分配鍵的時候它應該是

$local_settings = array 
(
    'debug' => TRUE, 
    'cake' =>TRUE, 
    'death' => FALSE 
); 

利用=>操盤的=運營商。你的循環應該如下:

foreach($environments as $env) 
{ 
    if($current_env == $env) 
    { 
    define('DEBUG', ${$env.'_settings'}['debug']); 
    define('CAKE', ${$env.'_settings'}['cake']); 
    define('DEATH', ${$env.'_settings'}['death']); 
    break; 
    } 
} 

注:

  • 我固定在你的數組聲明錯字。您僅使用=而不是=>
  • 我添加了一個break你的循環中 - 否則,你會試圖重新聲明常量,這將導致PHP輸出錯誤
  • 我已經改變了====是賦值運算符。您需要使用==(寬鬆比較)或===(嚴格比較)。

Demo

0

到值

1

使用二維數組用於此目的:

$current_env = 'local'; 

$environment_settings = array(
    'local' => array('debug' = TRUE, 'cake' = TRUE, 'death' = FALSE), 
    'dev' => array('debug' = TRUE, 'cake' = FALSE, 'death' = FALSE), 
    'prod' => array('debug' = TRUE, 'cake' = TRUE, 'death' = FALSE) 
); 

if (isset($environment_settings[$current_env])) { 
    foreach ($environment_settings[$current_env] as $name => $val) 
     define(strtoupper($name), $value); 
} 
+0

偉大的思想家都認爲:) – TonyWilk

1

爲什麼不只是做一個2-d陣列...

$settings=array(
    "local" => array(
     'cake'=>TRUE, 
     'death'=>FALSE 
    ), 
    "dev" =>array(...etc ...), 
    "prod"=>array(...etc ...) 
); 

則:

if($current_env = $env) 
{ 
    define('DEBUG', $settings[$env]['debug']); 
    define('CAKE', $settings[$env]['cake']); 
    define('DEATH', $settings[$env]['death']); 
} 

(我只是輸入了 - 可能有錯別字!)

0

我將值更改爲僅用於測試的字符串。試試這個:

$env = 'local'; 

$local_settings = array 
(
    'debug' => 'TRUE', 
    'cake' => 'TRUE', 
    'death' => 'FALSE' 
); 

$setting_selector=$env.'_settings'; 
echo ${$setting_selector}['debug'];