如何将下面的数组转换为下面的数组。我正在尝试使用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"
}
}
答案 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()
不适合你的要求,但是我赞赏你为我们思考的努力,因为数组操作的函数编程方法肯定是一种比通用循环更好的方法。要求与功能相匹配。