如何将下面的数组转换为如下所示的数组。我正在尝试使用
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"
}
}
$newArr = [];
foreach($oldArr as $key=>$row) {
foreach($row as $index=>$item) {
$newArr[$index][$key] = $item;
}
}
这可以解决问题,但不会检查数据是否有效,如您所提到的
首先,@tzook-bar-noy 的答案在这种情况下是一个更好的答案,我什至不提倡我将在这里详细介绍的方法。
在处理数组时,如果可以的话,我总是尽量避免通用循环(即:
foreach()
),而是使用您在问题中提到的更具功能性的编程方法:使用像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>";
显然我也在这里对键名进行了硬编码,这不太理想。一个人可以设计出一种通用方法,但到那时我们就远远超出了
aaray_map()
的实际意图,以至于代码复杂性会变得愚蠢。
在其他语言中,这些数组迭代函数的实现要好一些(比如 JS 或 CFML),人们可能能够用
.reduce()
(JS,CFML)的方式提出一个半不错的答案手术。然而,PHP 的 array_reduce()
(及其其他数组迭代方法)因其糟糕的实现而受到阻碍,因为它们只将 value 传递给回调。他们确实需要至少传递索引,以及(不太常用,但有时很方便〜)数组本身作为附加参数,以使它们不仅仅是概念验证。 IMO,显然(我有偏见,我做的 JS 和 CFML 比 PHP 多,所以我的期望设定得更高)。
底线:
array_map()
不太适合您的要求,但我赞赏您为我们思考这一点所做的努力,因为数组操作的函数编程方法绝对是比需求与功能相匹配的通用循环更好的方法.