Php 合并多维数组并尽可能保留非空值
我有一个具有以下结构的关联数组(实际上是一个Laravel集合):Php 合并多维数组并尽可能保留非空值,php,arrays,multidimensional-array,merge,reduction,Php,Arrays,Multidimensional Array,Merge,Reduction,我有一个具有以下结构的关联数组(实际上是一个Laravel集合): $array = [ ["firstname" => "John", "lastname" => "", "email" => "", "uri" => ""], ["firstn
$array = [
["firstname" => "John", "lastname" => "", "email" => "", "uri" => ""],
["firstname" => "", "lastname" => "Smith", "email" => "", "uri" => ""],
["firstname" => "", "lastname" => "", "email" => "john@example.org", "uri" => ""]
];
我如何组合/合并/减少整个多维数组,以便最终得到一个包含所有列并对非空值进行优先级排序的扁平结构
大概是这样的:
[
['firstname' => 'John', 'lastname' => 'Smith', 'email' => 'john@example.org', 'uri' => '']
]
这里我们使用的是
array\u merge
和array\u filter
array\u merge
将一个数组合并到另一个数组中,array\u filter
将筛选数组中的空值
我将演示几种具有不同好处的替代技术,这些技术依赖于所有列都在所有行中表示的事实。我认为生成二维输出数组没有任何好处,因此我的所有代码片段都将生成相同的平面关联数组
无论您喜欢哪种样式,至少需要两个循环——一个循环迭代行,另一个循环迭代每行中的元素
标准嵌套循环:()
基于半函数的迭代:()
*注意,如果您的实际项目中有超过四个字段,并且其中一个字段可能包含您不想过滤掉的零值,请使用strlen
作为array\u filter()
中的参数。否则,array\u filter()
将贪婪地删除null、false、zeroish和zero width值
使用数组_reduce()
:()完全基于函数
完全基于函数,使用数组\u merge\u recursive()
:()
这是最简短的,但无可否认,它利用了max()
将从每个列返回所需字符串这一事实。作为一种通用技术,此方法可能不适用于所有场景
实际上,这是将$array
解包为$row[0]、$row[1]、$row[2]
(使用..
)然后将数据转换为列数据的子数组(使用array\u merge\u recursive()
在每个子阵列上)
Sahil的答案不是很可靠,因为它在过程完成后手动更正缺少的uri
键的值。进行此调整纯粹是因为程序员“知道”缺少的值。从编程的角度讲,这是懒惰的,容易失败,所以SO读者不应该使用它
<?php
$array = array(
0 => array(
"firstname" => "John",
"lastname" => "",
"email" => "",
"uri" => ""
),
1 => array(
"firstname" => "",
"lastname" => "Smith",
"email" => "",
"uri" => ""
),
2 => array(
"firstname" => "",
"lastname" => "",
"email" => "john@example.org",
"uri" => "")
);
$result=array();
foreach($array as $value)
{
$result= array_merge($result,array_filter($value));
}
$result["uri"]="";
print_r(array($result));
$result = array_shift($array); // remove the first row and push it into the result array
foreach ($array as $row) {
foreach ($row as $key => $value) {
if ($value !== '') {
$result[$key] = $value; // only overwrite where a non-empty value exists
}
}
}
var_export($result);
$result = array_shift($array); // remove the first row and push it into the result array
foreach ($array as $row) {
$result = array_merge($result, array_filter($row, 'strlen')); // merge only non-empty elements into the result
}
var_export($result);
var_export(
array_reduce(
$array,
function($carry, $row) {
$carry = array_merge($carry, array_filter($row, 'strlen'));
return $carry;
},
array_shift($array)
)
);
var_export(
array_map('max', array_merge_recursive(...$array))
);