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

Use Variable Variable as Array Prefix

提问人:kmgdev 提问时间:2/8/2014 最后编辑:kmgdev 更新时间:2/8/2014 访问量:79

问:

是否可以使用变量变量作为数组前缀?我有一组格式为 的数组,我想根据与条件匹配的前缀只输出一个数组的值。$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;
  }
}

如您所见,我尝试使用,但这给了我一个PHP错误:${$env}_settings[]

意想不到的“_settings”(T_STRING)

可能?

PHP 数组 变量

评论

0赞 u_mulder 2/8/2014
为什么不能只使用二维数组?
0赞 h2ooooooo 2/8/2014
$current_env = $env始终为真,因为这意味着“设置”。你是说条件运算符还是?$current_env to the value of $env=====

答:

0赞 Shankar Narayana Damodaran 2/8/2014 #1

它应该是

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

在为值分配键时,请使用 => 运算符而不是 = 运算符

3赞 Amal Murali 2/8/2014 #2

是的,这是可能的。您的循环应如下所示:

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

笔记:

  • 我已经修复了您的数组声明中的拼写错误。您使用的只是而不是 .==>
  • 我在你的循环中添加了一个 - 否则,您将尝试重新声明常量,这将导致 PHP 输出错误break
  • 我已更改为 . 是赋值运算符。您需要改用(松散比较)或(严格比较)。=========

演示

1赞 u_mulder 2/8/2014 #3

为此,请使用 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);
}
1赞 TonyWilk 2/8/2014 #4

为什么不直接做一个二维数组呢?

$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赞 TecBrat 2/8/2014 #5

我将值更改为字符串只是为了测试。试试这个:

$env = 'local';

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

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