views:

485

answers:

6

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!
+1  A: 
 $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

stereofrog
I have an array containing hundreds of variables=>output messages.Do you think there's a better practice for this? (I don't want these messages to be constants because they might have to be changed).
sombe
if you're looking for the best practice solution, consider gettext (http://www.php.net/manual/en/function.gettext.php)
stereofrog
+1  A: 
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.

Anthony Forloney
This doesn't work, as `$key` will only be the value of the last item in the array.
Chacha102
I had edited my answer to correct a few things
Anthony Forloney
+1  A: 

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

code_burgar
+1  A: 

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

Chacha102
A: 

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

soulmerge
+2  A: 

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

VolkerK
do you suggest not making $lang global?
sombe
Neither $lang itself nor its elements, yes. Just use a function/method that returns an array.
VolkerK