- 此问题在此处已有答案**:
Merge arrays of associative arrays by shared column values(3个答案)
5个月前关闭。
我有两个这样的数组:
- 数组1**
Array
(
[0] => Array
(
[ID] => 101
[Code] => 1075
[Date] => 2012-03-03 17:13:12.433
)
[1] => Array
(
[ID] => 103
[Code] => 175
[Date] => 2012-09-05 20:30:02.217
)
[2] => Array
(
[ID] => 109
[Code] => 178
[Date] => 2012-07-05 20:30:02.217
)
)
- 数组2**
Array
(
[0] => Array
(
[Amount] => 1234
[ID] => 101
)
[1] => Array
(
[Amount] => 1342
[ID] => 103
)
[2] => Array
(
[Amount] => 0
[ID] => 0
)
)
我使用这段代码根据ID索引的匹配值将它们组合起来。
$combined = array();
foreach ($arr as $arrs) {
$comb = array('ID' => $arrs['ID'], 'Code' => $arrs['Code'],'Date' => $arrs['Date'],'Amount' => '');
foreach ($arr4 as $arr2) {
if ($arr2['ID'] == $arrs['ID']) {
$comb['Amount'] = $arr2['Amount'];
break;
}
else {
$comb['Amount'] = $arr2['Amount'];
}
}
$combined[] = $comb;
}
echo print_r($combined);
下面是我从这段代码中得到的预期输出:
Array
(
[0] => Array
(
[ID] => 101
[Code] => 1075
[Date] => 2012-03-03 17:13:12.433
[Amount] => 1234
)
[1] => Array
(
[ID] => 103
[Code] => 175
[Date] => 2012-09-05 20:30:02.217
[Amount] => 1342
)
[2] => Array
(
[ID] => 109
[Code] => 178
[Date] => 2012-07-05 20:30:02.217
[Amount] => 0
)
)
我想优化代码,以便
$comb = array('ID' => $arrs['ID'], 'Code' => $arrs['Code'],'Date' => $arrs['Date'],'Amount' => '');
应该是动态生成的,而不是硬编码的。并且我希望代码自动将所有其他字段添加到ID匹配的第一个数组中,而不是$comb['Amount'] = $arr2['Amount'];
。
我如何实现这一目标?
4条答案
按热度按时间pftdvrlh1#
最简单的解决方案,使它完全动态除了
ID
,做如下:输出:-https://3v4l.org/1sDJs
2vuwiymt2#
首先使用ID作为密钥:
然后对键进行排序(要解决不相同的原始索引:
然后使用
array_map
作为:在末尾使用
array_values
可忽略ID键。如果您有另一个包含ID字段的数组,您可以在它们上使用相同的逻辑-注意
array_map
可以获得2个以上的输入数组...参考:array_column、array_map、array_merge、ksort
示例:3v4l
使用模板修复元素缺失的问题:
请注意,此解决方案将仅对2个阵列有效-它可以进行一般化,但我将其留给您
示例:3v4l
rjjhvcjd3#
我调整你的代码做你需要的,这里是完整的代码,为我工作:
如果你因为不同的原因需要进一步的操作,我建议你阅读关于
array_keys
和array_values
方法的文章,它们很有帮助。wi3ka0sx4#
http://sandbox.onlinephpfunctions.com/code/ee72a1c89782f4eef25a1143816f237ca6af129c