使用变量变量作为数组前缀

时间:2014-02-07 17:58:27

标签: php arrays variable-variables

是否可以使用变量作为数组前缀?我有一组格式为$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错误:

  

意外'_settings'(T_STRING)

可能的?

5 个答案:

答案 0 :(得分:3)

是的,有可能。你的循环应该如下所示:

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

答案 1 :(得分:1)

为此目的使用2D数组:

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

答案 2 :(得分:1)

为什么不制作一个二维阵列......

$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']);
}

(我只是输入了 - 可能有拼写错误!)

答案 3 :(得分:0)

应该是

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

在为值分配键时,使用 => 运算符代替 = 运算符

答案 4 :(得分:0)

我将值更改为字符串仅用于测试。试试这个:

$env = 'local';

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

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