【问题标题】:PHP flatten array of two dimensions into array of one dimension [duplicate]PHP将二维数组展平为一维数组[重复]
【发布时间】:2011-07-26 03:30:40
【问题描述】:

如何将二维数组展平为一维数组?

例如:

Array
(
    [1] => Array
        (
            [key] => val
            [key2] => val2
        )
)

变成:

Array
(
   [key] => val
   [key2] => val2
)

【问题讨论】:

    标签: php arrays


    【解决方案1】:
    $array = array_shift($array);   
    

    这也将处理键,它不需要所有数组都以 0 或 1 或任何东西开头。

    【讨论】:

    • 在这种情况下访问$array[1] 可能会更简单。
    • @Archimedix:并非所有数组都以 1 作为第一个索引开始,因此 array_shift 使其完全独立于键并简单地将第一个元素从数组中弹出。
    • @Marc B,我知道,但答案特别说明了// for your example only 并被提及是合适的,因此$array[1] 也同样合适。您的论点就像是说并非所有数组都存储在名为 $array 的变量中,这是正确的,但希望应该足够明显。整个示例仅在外部数组仅包含 1 个元素且因此具有高度特异性时才有效。
    • 如果你不知道第一个元素的键:$array = reset($array);。在任何情况下,这个答案都非常仅限于所讨论的数组,并且不能反映问答的一般特征。警告说明甚至已被删除。
    【解决方案2】:

    举个例子:

    $myarray = array_shift($myarray);
    

    $myarray = $myarray[1];
    

    但是:

    会不会有多个子数组?

    如果是这样:这个子数组有同名的键吗?

    如果是这样:重复项应该怎么办?全部重命名?除了一个之外,其他都丢掉?

    如您所见,您必须提供更多相关信息。这个问题真的不清楚。

    【讨论】:

      【解决方案3】:

      一种明显的方法是foreach 覆盖数组(最好通过引用,以保存一遍又一遍地复制所有数据),然后将array_combine 放入一个新数组中。

      类似这样的:

      $b = array();
      foreach($arr as &$a) $b = array_combine($b, $a);
      $arr = $b;
      

      尽管正如其他人指出的那样,在您的特殊情况下 array_shift 就足够了。

      【讨论】:

      • 现在数组是通过引用自动传递的。没有理由指定它。哦,对象也是通过引用自动传递的。
      • 嗯...在我的理解中,foreach 文档的措辞恰恰相反:“除非引用了数组,否则 foreach 对指定数组的副本而不是数组本身进行操作” .你有这方面的参考吗(不是双关语),特别是哪些版本可以自动参考?
      • 嗯,那么可能是错误的,至少对于 foreach 循环。不过,您可以出于其他目的对其进行测试。您可以执行function test($array){$array[0] = 2;} $test = array(1,2,3); test($test); print_r($test); 之类的操作,即使它不是通过引用传递的,您也应该得到 array(2,2,3) 。即使您执行$var = $test; $test[0] = 2; print_r($var);,即使您只更改了$test[0] 的值,您也会从$var 获得array(2,2,3)。我认为他们在 5.2 或附近的某个地方对其进行了更改。
      • 该死的,也许我又错了。我知道它发生在物体上。很烦人。
      【解决方案4】:

      假设您的密钥是唯一的

      $oneDArray = array();
      foreach($multiDimensionalArray as $k=>$v) {
          $oneDArray[$k]=$v;
      }
      unset($multiDimensionalArray); //If you don't want to keep it.
      

      【讨论】:

        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 2015-07-21
          • 2011-02-03
          • 2016-01-11
          • 2015-07-17
          • 1970-01-01
          • 2010-11-29
          • 2014-04-23
          • 2018-02-09
          • 2011-10-18
          相关资源
          最近更新 更多