Question

Is it possible to use a variable variable as an array prefix? I have a set of arrays with the format $x_settings, and I want to output the values of just one depending on which prefix matches a condition.

This is an extremely stripped-down version of much more complex code, so thanks for your indulgence:

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

As you can see I tried using ${$env}_settings[] but that gave me a PHP error:

unexpected '_settings' (T_STRING)

Possible?

Was it helpful?

Solution

Yes, it is possible. Your loop should look like below:

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

Notes:

  • I've fixed the typo in your array declaration. You were using just = instead of =>.
  • I've added a break inside your loop - otherwise, you'll be trying to re-declare constants and that will cause PHP to output errors
  • I've changed = to ==. = is the assignment operator. You need to use == (loose comparison) or === (strict comparison) instead.

Demo

OTHER TIPS

Use 2D array for this purpose:

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

Why not just make a 2-d array...

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

then:

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

(I just typed this in - there may be typos!)

It should be

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

Make use of the => operator instead of = operator when assigning keys to values

I changed the values to strings just for testing. Try this:

$env = 'local';

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

$setting_selector=$env.'_settings';
echo ${$setting_selector}['debug'];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top