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 错误:

意外的“_settings”(T_STRING)

可能的?

4

5 回答 5

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 输出错误
  • 我已更改===. =是赋值运算符。您需要改用==(松散比较)或===(严格比较)。

演示

于 2014-02-07T18:01:44.557 回答
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);
}
于 2014-02-07T18:06:59.907 回答
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']);
}

(我刚刚输入了这个 - 可能有错别字!)

于 2014-02-07T18:07:34.347 回答
0

它应该是

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

将键分配给值时使用=>运算符而不是运算符=

于 2014-02-07T17:59:37.177 回答
0

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

$env = 'local';

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

$setting_selector=$env.'_settings';
echo ${$setting_selector}['debug'];
于 2014-02-07T18:07:51.427 回答