【问题标题】:php - extract array into global variablesphp - 将数组提取到全局变量中
【发布时间】:2011-01-14 02:43:51
【问题描述】:

The manual on "extract" 表明您可以提取如下数组:

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

进入$一个,$两个...

但是提取函数不返回变量。有没有办法“全球化”这些变量?也许不使用提取,而是使用 foreach 循环?

编辑:(解释我想要达到的目标) 我有一个包含数百条输出消息的数组,我希望它们可以作为变量有效地访问。我的意思是每当我想输出一条消息时,说:

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

消息将出现。我这样做的原因是用户可以更改他们查看网站的语言,例如: ''。 $helloWorld .''; 会产生:

Hola Mundo!

【问题讨论】:

  • 全局变量和 extract() 是 PHP 中我最不喜欢的两个部分……所以,这个问题让我有点想吐。能否以其他方式解决您的应用程序问题?
  • @ojrac:当然,我编辑了更详细的解释。
  • 我对语法生疏了,但这里有一个想法:$language = get_lang('en'),然后是 "${language['helloWorld']} "
  • @ojrac,我一开始没有使用它的原因是因为我想使用变量,而不是数组。
  • 嘿,extract 是完美的,请参阅@code_burgar 答案。另一种“PHP 方式”是list($a,$b,...)=$array (!)。我不明白你为什么需要更多...

标签: php arrays variables extract global


【解决方案1】:

不完全是您问题的答案......但是:保留数组,不要污染(全局)变量命名空间。

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

同一主题的一些变化:

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

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

您可能还对http://docs.php.net/gettext感兴趣

【讨论】:

  • 你建议不要让 $lang 全球化吗?
  • $lang 本身和它的元素都不是,是的。只需使用返回数组的函数/方法。
  • -1:没有回答问题。如果您想劝告提出问题的人更好地回答问题,然后告诉他们为什么不使用它,因为有人可能想将它用于有效的用例 (例如与现有的 CMS。)
  • @MikeSchinkel :我总体上同意您的观点,但在这种特殊情况下选择不采取相应行动并接受反对票。我宁愿这个“答案”没有被标记为“接受”,就像往常一样,当我从“不是真的/完全是你问题的答案”开始时;-)
【解决方案2】:
foreach ($array as $key => $value) {
  // initialize the variables as global
   global $$key;
   $$key = $value;
}

编辑:

刚刚注意到我的一个错误,您必须将数组的键变成一个变量,这可以通过使用$$ 符号将其转换为variable variables 来完成。

【讨论】:

  • 这不起作用,因为$key 将只是数组中最后一项的值。
  • 如果你的全局变量被命名为$value,你会和局部变量$value发生冲突。所以最好分配$GLOBALS[$key] = $value;
【解决方案3】:

您是否在寻找已提取的变量?你可以通过array_keys()找到他们

【讨论】:

    【解决方案4】:

    你的意思是:

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

    这将全局每个变量,然后将其设置为您的值。对于您,它将创建 $one$two

    【讨论】:

    • 如果你的全局变量恰好被命名为$var_value,你会和局部变量$var_value发生冲突。所以最好分配$GLOBALS[$var_name] = $var_value;
    【解决方案5】:

    在数组上使用 extract() 将在当前范围内创建新变量,或为现有变量分配新值。

    我不确定您所说的“全球化”是什么意思,但我的理解是您正在尝试完全完成 extract() 所做的事情,请注意当前范围(如果您从函数中进行 extract() ,提取的变量将仅在函数内部可用)。

    【讨论】:

    • 供参考,以防我再次搜索此...extract 与 assoc-array 一起使用,请使用 list 索引数组
    【解决方案6】:
     $GLOBALS += $vars;
    

    例如

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

    也就是说,你能解释一下你为什么需要这个吗?使用全局变量被认为是糟糕的风格,也许有更好的方法

    【讨论】:

    • 我有一个包含数百个变量的数组=>输出消息。你认为有更好的做法吗? (我不希望这些消息成为常量,因为它们可能需要更改)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2013-03-11
    • 2012-03-06
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多