【问题标题】:Can PHP's list() work with associative arrays?PHP 的 list() 可以与关联数组一起使用吗?
【发布时间】:2012-01-12 19:42:54
【问题描述】:

例子:

list($fruit1, $fruit2) = array('apples', 'oranges');

上面的代码当然可以,但是下面的代码:

list($fruit1, $fruit2) = array('fruit1' => 'apples', 'fruit2' => 'oranges');

给:Notice: Undefined offset: 1 in....

有没有办法通过list('fruit1' : $fruit1) 之类的列表以某种方式引用命名键,你有没有看到这样的计划在未来发布?

【问题讨论】:

    标签: php arrays list associative-array


    【解决方案1】:

    来自/来自PHP 7.1

    对于键控数组;

    $array = ['fruit1' => 'apple', 'fruit2' => 'orange'];
    
    // [] style
    ['fruit1' => $fruit1, 'fruit2' => $fruit2] = $array;
    
    // list() style
    list('fruit1' => $fruit1, 'fruit2' => $fruit2) = $array;
    
    echo $fruit1; // apple
    

    对于无键数组;

    $array = ['apple', 'orange'];
    
    // [] style
    [$fruit1, $fruit2] = $array;
    
    // list() style
    list($fruit1, $fruit2) = $array;
    
    echo $fruit1; // apple
    

    注意:如果可能按版本使用[]样式,也许list将来会成为新类型,谁知道...

    【讨论】:

      【解决方案2】:

      编辑:这种方法在当时很有用(九年前有人问过并回答过),但请参阅下面的 K-Gun 的 answer 以了解使用较新 PHP 7+ 语法的更好方法.

      试试extract() 函数。它将创建所有键的变量,并分配给它们的关联值:

      extract(array('fruit1' => 'apples', 'fruit2' => 'oranges'));
      var_dump($fruit1);
      var_dump($fruit2);
      

      【讨论】:

      • 是的,这行得通。另一方面,在使用 extract 时提供前缀几乎总是一种好习惯,除非您 100% 绝对确定将出现哪些键。
      • 是的,我会先用 array_intersect_key() 用预期的键运行它。
      • @Jurik,您是否尝试过将list()array_values() 一起使用?不过你是对的——那个功能很奇怪。
      • 请不要使用extract。 IDE 无法处理它。它可以创建一个host of other problems.
      • @Bananaapple,我已经相应地编辑了我的答案。我可能有偏见,但我不确定当时正确的答案是否一定是正确的方法。感谢您提醒我注意。
      【解决方案3】:

      使用 array_values() 怎么样?

      <?php
         list($fruit1, $fruit2) = array_values( array('fruit1'=>'apples','fruit2'=>'oranges') );
      ?>
      

      【讨论】:

      • 如果你想跳过一些键,这种方法更好(然后接受的答案)
      • 如果数组中的值顺序相反,这不起作用,例如array('fruit2'=&gt;'apples','fruit1'=&gt;'oranges')。 'fruit2' 的值被赋值为 $fruit1,反之亦然。
      • PHP 7.1 提供了一种更简洁的方式 - 请参阅 K-Gun 的答案。
      【解决方案4】:

      实现起来非常简单。

      function orderedValuesArray(array &$associativeArray, array $keys, $missingKeyDefault = null)
      {
          $result = [];
          foreach ($keys as &$key) {
              if (!array_key_exists($key, $associativeArray)) {
                  $result[] = $missingKeyDefault;
              } else {
                  $result[] = $associativeArray[$key];
              }
          }
          return $result;
      }
      $arr = [
          'a' => 1,
          'b' => 2,
          'c' => 3
      ];
      list($a, $b, $c) = orderedValuesArray($arr, ['a','AAA', 'c', 'b']);
      echo $a, ', ', $b, ', ', $c, PHP_EOL;
      

      输出:1, , 3

      • 在使用方面减少打字
      • 没有元素顺序依赖(不像array_values
      • 直接控制变量名称(与 extract 不同)- 名称冲突风险更小,IDE 支持更好

      【讨论】:

        【解决方案5】:

        如果你是我的情况:

        list() 仅适用于数值数组。因此,如果可以,请在 fetch() 或 fetchAll() 中留空 -> 让它有 2 个选项:数值数组和关联数组。它会起作用的。

        【讨论】:

          【解决方案6】:

          认为这是一个优雅的解决方案:

          <?php
          
              $fruits = array('fruit1'=> 'apples','fruit2'=>'oranges');  
          
              foreach ($fruits as $key => $value)  
              {
                  $$key = $value;  
              }
              echo $fruit1; //=apples  
          
          ?>
          

          【讨论】:

          • 抱歉,但实际上变量变量几乎从来都不是“优雅”的解决方案。
          • 那么为什么不使用 extract() 呢?它基本上可以满足您提供的解决方案
          【解决方案7】:
          <?php
          
          function array_list($array)
          {
              foreach($array as $key => $value)
              $GLOBALS[$key] = $value;
          }
          
          $array = array('fruit2'=>'apples','fruit1'=>'oranges');
          
          array_list($array);
          
          echo $fruit1; // oranges
          
          
          ?>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多