我想在PHP中组合两个多维数组。
的print_r($ array_a):
Array
(
[0] => Array
(
[0] => A
[1] => 0
[2] => 1047
)
[1] => Array
(
[0] => B
[1] => 0
[2] => 279
)
[2] => Array
(
[0] => C
[1] => 0
[2] => 68
)
[3] => Array
(
[0] => D
[1] => 0
[2] => 4
)
)
的print_r($ array_b):
Array
(
[0] => Array
(
[0] => A
[1] => 76
[2] => 0
)
[1] => Array
(
[0] => B
[1] => 170
[2] => 0
)
[2] => Array
(
[0] => C
[1] => 15
[2] => 0
)
[3] => Array
(
[0] => D
[1] => 210
[2] => 0
)
[4] => Array
(
[0] => E
[1] => 287
[2] => 0
)
)
然后合并它,结果应该是这样的:
Array
(
[0] => Array
(
[0] => A
[1] => 76
[2] => 1047
)
[1] => Array
(
[0] => B
[1] => 170
[2] => 279
)
[2] => Array
(
[0] => C
[1] => 15
[2] => 68
)
[3] => Array
(
[0] => D
[1] => 210
[2] => 4
)
[4] => Array
(
[0] => E
[1] => 287
[2] => 0
)
)
所以逻辑关键是根据每个数组的第一个值(A,B,C,D)合并两个数组。如果有一个数组只属于一个数组(例如," E"在array_b上),我只需添加它们。 我试过这个:
foreach($array_a as $a=>$array_now){
foreach($array_b as $b=>$array_before){
if($array_now[0] == $array_before[0]){
$array_a[$a] = [$array_before[0], $array_before[1], $array_now[2]];
}
}
}
但我似乎无法添加缺少的数组($ array_b中的第5个数组包含' E')。
答案 0 :(得分:1)
使用下面的代码来帮助您
$array_a = [];
$array_a[0][0] = 'A';
$array_a[0][1] = 0;
$array_a[0][2] = 1047;
$array_a[1][0] = 'B';
$array_a[1][1] = 0;
$array_a[1][2] = 279;
$array_a[2][0] = 'C';
$array_a[2][1] = 0;
$array_a[2][2] = 68;
$array_a[3][0] = 'D';
$array_a[3][1] = 0;
$array_a[3][2] = 4;
$array_b = [];
$array_b[0][0] = 'A';
$array_b[0][1] = 76;
$array_b[0][2] = 0;
$array_b[1][0] = 'B';
$array_b[1][1] = 70;
$array_b[1][2] = 0;
$array_b[2][0] = 'C';
$array_b[2][1] = 15;
$array_b[2][2] = 0;
$array_b[3][0] = 'D';
$array_b[3][1] = 210;
$array_b[3][2] = 0;
$array_b[3][0] = 'E';
$array_b[3][1] = 287;
$array_b[3][2] = 0;
$array_b[4][0] = 'E';
$array_b[4][1] = 2870;
$array_b[4][2] = 0;
$cnt = 0;
if(count($array_b) > $array_a){
$cnt = count($array_b);
}else{
$cnt = count($array_a);
}
$array_new = [];
for($i=0; $i <= $cnt; $i++){
$array_new[$i] = [];
if(isset($array_a[$i][0])){
$array_new[$i][0] = $array_a[$i][0];
}else{
$array_new[$i][0] = $array_b[$i][0];
}
if(isset($array_b[$i][1])){
$array_new[$i][1] = $array_b[$i][1];
}else{
$array_new[$i][1] = 0;
}
if(isset($array_a[$i][2])){
$array_new[$i][2] = $array_a[$i][2];
}else{
$array_new[$i][2] = 0;
}
}
echo "<pre>";
print_r($array_new);
希望这会有所帮助!
答案 1 :(得分:0)
您可以使用多个array_maps
来实现此目标
$c = array_map(function() {
return array_map(function() {
foreach (func_get_args() as $arg) {
if ($arg) return $arg;
}
return func_get_arg(0);
}, ...func_get_args());
}, $a, $b);
此代码也适用于超过$a
,$b
- 只需添加尽可能多的数组作为param
答案 2 :(得分:0)
很抱歉,但上述所有解决方案都不起作用,我自己想通过使用此代码:
$result = array();
if (count($array_a) > count($array_b)){
foreach($array_a as $a=>$array_now){
foreach($array_b as $b=>$array_before){
if($array_now[0] == $array_before[0]){
$array_a[$a] = [(string)$array_before[0], (int)$array_before[1], (int)$array_now[2]];
}
}
}
$result = $array_a;
} else {
foreach($array_b as $a=>$array_now){
foreach($array_a as $b=>$array_before){
if($array_now[0] == $array_before[0]){
$array_b[$a] = [(string)$array_before[0], (int)$array_now[1], (int)$array_before[2]];
}
}
}
$result = $array_b;
}
谢谢大家的回复。
答案 3 :(得分:0)
此任务可以通过单个循环简洁、高效且可靠地执行,该循环生成一个带有临时键的结果数组,以确定是否遇到新行。
代码:(Demo)
$array_a = [
['A', 0, 1047],
['B', 0, 279],
['C', 0, 68],
['D', 0, 4],
];
$array_b = [
['A', 76, 0],
['B', 170, 0],
['E', 287, 0],
['C', 15, 0],
['D', 210, 0],
];
foreach (array_merge($array_a, $array_b) as $row) {
if (!isset($result[$row[0]])) {
$result[$row[0]] = $row;
} else {
$result[$row[0]][1] += $row[1];
$result[$row[0]][2] += $row[2];
}
}
var_export(array_values($result));
输出:
array (
0 =>
array (
0 => 'A',
1 => 76,
2 => 1047,
),
1 =>
array (
0 => 'B',
1 => 170,
2 => 279,
),
2 =>
array (
0 => 'C',
1 => 15,
2 => 68,
),
3 =>
array (
0 => 'D',
1 => 210,
2 => 4,
),
4 =>
array (
0 => 'E',
1 => 287,
2 => 0,
),
)