转换多维数组

时间:2014-11-01 08:51:57

标签: php arrays multidimensional-array

如何将下面的数组转换为下面的数组。我正在尝试使用array_map,但我对如何编写函数感到困惑。

array(3) {
  ["award_year"]=>
  array(2) {
    [0]=>
    string(7) "1999-01"
    [1]=>
    string(7) "2010-02"
  }
  ["award_title_user"]=>
  array(2) {
    [0]=>
    string(1) "2"
    [1]=>
    string(2) "tt"
  }
  ["award_description_user"]=>
  array(2) {
    [0]=>
    string(1) "2"
    [1]=>
    string(3) "ddd"
  }
}

这就是我想要实现的目标:

array(2) {
  [0]=>
  array(3) {
    ["award_year"]=>
    string(7) "2010-02"
    ["award_title_user"]=>
    string(2) "tt"
    ["award_description_user"]=>
    string(3) "ddd"
  }
  [1]=>
  array(3) {
    ["award_year"]=>
    string(7) "1999-01"
    ["award_title_user"]=>
    string(1) "2"
    ["award_description_user"]=>
    string(1) "2"
  }
}

2 个答案:

答案 0 :(得分:1)

$newArr = [];
foreach($oldArr as $key=>$row) {
   foreach($row as $index=>$item) {
       $newArr[$index][$key] = $item;
   }   
}

这将解决它,但不检查数据是否有效,如你所提到的

答案 1 :(得分:0)

首先,在这种情况下,@ tzook-bar-noy的答案是一个更好的答案,我甚至不提倡我将在这里详述的方法。

在处理数组时,我总是试图避免泛型循环(即:foreach()),而不是使用你在问题中提到的更多功能编程方法:使用像{{1}这样的函数}。然而,功能编程功能非常注重他们的工作(这是他们的好处:他们创建你的代码Cleaner),所以要使用它们:你有点想要做他们提供的特定操作。

array_map()在这里有一个缺点,因为映射的数组具有与原始数组相同顺序的相同键,这不是您想要的。您需要将原始数组“从里向外”转换,但所需结果数组的排序与原始数据相反。不适合array_map()

这对于array_map()是可行的,但就像你需要飞利浦时使用平头螺丝刀一样。

以下是一个例子:

array_map()

显然我也在这里硬编码了不太理想的关键名称。一个可以设计一个通用方法,但到那时我们远远超出<?php $awards = [ "award_year" => ["1999-01", "2010-12"], "award_title_user" => ["2", "tt"], "award_description_user" => ["2", "ddd"] ]; $remappedAwards = array_map(function($year, $title, $description){ return [ "award_year" => $year, "award_title_user" => $title, "award_description_user" => $description ]; }, $awards["award_year"], $awards["award_title_user"], $awards["award_description_user"]); $remappedAwards = array_reverse($remappedAwards); echo "<pre>"; var_dump($remappedAwards); echo "</pre>"; 的实际意图,代码复杂性将变得愚蠢。

在其他语言中,这些数组迭代函数实现得更好(比如JS或CFML),人们可以用aaray_map()JS得出一个不错的答案, CFML)一种操作。然而,PHP的array_reduce()(以及它的其他数组迭代方法)由于它们的实现很差而受到限制,因为它们只将传递给回调。他们确实需要至少传递索引,并且(通常很少有用,但有时候很方便〜)数组本身作为额外的参数,使它们不仅仅是一个概念验证。 IMO,显然(我有偏见,我做了比我更多的JS和CFML,所以我的期望更高)。

底线:.reduce()不适合你的要求,但是我赞赏你为我们思考的努力,因为数组操作的函数编程方法肯定是一种比通用循环更好的方法。要求与功能相匹配。