代码之家  ›  专栏  ›  技术社区  ›  Gal

php-将数组提取为全局变量

  •  3
  • Gal  · 技术社区  · 16 年前

    The manual on "extract" 显示可以提取数组,如:

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

    换成1美元2美元…

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

    编辑: (解释我正在努力实现的目标) 我有一个数组,其中包含数百条输出消息,我希望这些消息可以作为变量有效地访问。我的意思是,每当我想输出一条消息时,说:

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

    消息将出现。我这样做的原因是为了让用户可以改变他们浏览网站的语言,比如: ''$helloworld.''; 会产生:

    Hola Mundo!
    
    6 回复  |  直到 16 年前
        1
  •  4
  •   VolkerK    16 年前

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

    $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

        2
  •  4
  •   user187291    16 年前
     $GLOBALS += $vars;
    

    例如

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

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

        3
  •  2
  •   code_burgar    16 年前

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

    我不确定您所说的“全球化”是什么意思,但我的理解是,您正试图完成extract()所做的工作,只需注意当前的作用域(如果从函数中提取(),则提取的变量只在函数本身中可用)。

        4
  •  2
  •   Tyler Carter    16 年前

    你的意思是:

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

    这将全局化每个变量,然后将其设置为您的值。它会为你的 $one 和 $two

        5
  •  1
  •   Anthony Forloney    16 年前
    foreach ($array as $key => $value) {
      // initialize the variables as global
       global $$key;
       $$key = $value;
    }
    

    编辑:

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

        6
  •  0
  •   soulmerge    16 年前

    您是否正在查找已提取的变量?你可以用 array_keys()

    推荐文章