0

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?

2
  • Why can't you just use 2D array? Commented Feb 7, 2014 at 18:00
  • $current_env = $env is always true, as this means "set $current_env to the value of $env". Did you mean the conditional operators == or ===? Commented Feb 7, 2014 at 18:06

5 Answers 5

3

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

Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

1

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!)

Comments

0

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

Comments

0

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'];

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.