Question

The manual on "extract" shows you can extract an array like:

extract(array('one'=>1,'two'=>2));

into $one,$two...

But the extract function doesn't return the variables. Is there a way to 'globalize' these variables? Maybe not using extract, but a foreach loop?

EDIT: (explanation about what I'm trying to achieve) I have an array containing hundreds of output messages which I want to have accessible as variables efficiently. What I mean is that whenever I want to output a message, say:

$englishMessages = array('helloWorld'=>'Hello World');
$spanishMessages = array('helloWorld'=>'Hola Mundo');
'<span id="some">'. $helloWorld .'</span>';

The message would appear. The reason I'm doing it like this is so that users can change the language they're viewing the website in, so something like: ''. $helloWorld .''; would produce:

Hola Mundo!
Was it helpful?

Solution

Not exactly an answer to your question ...but: Keep the array, don't pollute the (global) variable namespace.

$englishMessages = array('helloWorld'=>'Hello World');
$spanishMessages = array('helloWorld'=>'Hola Mundo');

// wrap this in a nice function/method
$lang = $englishMessages;
// then use $lang for the output
'<span id="some">'. $lang['helloWorld'] .'</span>';

Some variations on the same theme:

function getMessages($language) {
  static $l = array(
    'en'=> array('helloWorld'=>'Hello World'),
    'es' => array('helloWorld'=>'Hola Mundo')
  );
  // <-- add handling reporting here -->
  return $l[$language];
}

$lang = getMessages('en');
echo '<span id="some">'. $lang['helloWorld'] .'</span>';

or

function __($language, $id) {
  static $l = array(
    'en'=> array('helloWorld'=>'Hello World'),
    'es' => array('helloWorld'=>'Hola Mundo')
  );
  // <-- add error handling here -->
  return $l[$language][$id];
}

echo '<span id="some">'. __('es', 'helloWorld') .'</span>';

You might also be interested in http://docs.php.net/gettext

OTHER TIPS

 $GLOBALS += $vars;

for example

function foo() {
  $vars = array('aa' => 11, 'bb' => 22);
  $GLOBALS += $vars;
}

foo();
echo $aa; // prints 11

that said, can you explain why you need this? Using global variables is considered poor style, maybe there's a better way

using extract() on an array will create new variables inside the current scope, or assign new values to existing variables.

I'm not sure what you mean by "globalize", but my understanding is that you are trying to accomplish exactly what extract() does, just be mindful of the current scope (if you extract() from within a function, the extracted variables will only be available inside the function itself).

You mean:

 foreach($array as $var_name => $var_value)
 {
       global $$var_name;
       $$var_name = $var_value;
 }

This will global each variable, and then set it to your value. For yours it would create $one, and $two

foreach ($array as $key => $value) {
  // initialize the variables as global
   global $$key;
   $$key = $value;
}

EDIT:

Just noticed a mistake of mine, you'd have to make the key of the array into a variable, which can be done by converting it to a variable variables using $$ notation.

Are you looking for the variables that have been extracted? You can find them using array_keys()

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top