我知道用foreach
,然后用while
->list等过程,(我已经完成了(,但是我感觉到我的代码有点脏,看起来不是最好的解决方案。。。我希望使用本机PHP数组函数来完成以下操作:
我有两个像这样的阵列:
[
['rank' => '579', 'id' => '1'],
['rank' => '251', 'id' => '2'],
]
和
[
['size' => 'S', 'status' => 'A', 'id' => '1'],
['size' => 'L', 'status' => 'A', 'id' => '2'],
]
我需要将它们合并以生成:
[
['size' => 'S', 'status' => 'A', 'id' => '1', 'rank' => '579'],
['size' => 'L', 'status' => 'A', 'id' => '2', 'rank' => '251'],
]
有没有一种方法可以合并具有id
值(或任何其他值(的两个数组,而不需要进入一组无穷无尽的foreach
?
使用array_marge_recurive((
$array = array_merge_recursive($array1, $array2);
或者制作自己的功能(可能更快(
function my_array_merge(&$array1, &$array2) {
$result = Array();
foreach($array1 as $key => &$value) {
$result[$key] = array_merge($value, $array2[$key]);
}
return $result;
}
$array = my_array_merge($array1, array2);
print_r($array);
Ray在评论中注意到,接受的答案实际上并没有回答问题。我找不到答案,所以我创建了以下小实用程序函数:
function array_merge_callback($array1, $array2, $predicate) {
$result = array();
foreach ($array1 as $item1) {
foreach ($array2 as $item2) {
if ($predicate($item1, $item2)) {
$result[] = array_merge($item1, $item2);
}
}
}
return $result;
}
按如下方式使用:
array_merge_callback($array1, $array2, function ($item1, $item2) {
return $item1['id'] == $item2['id'];
});
像其他语言一样很好地合并数组。这是因为php有自动编号的数组元素,合并会用键复制或替换不同的元素。
现在,它变了。
// array_fork
public static function array_fork() {
$args = func_get_args();
$result = array();
foreach ($args as $arr) {
is_array($arr) || exit('[' . __METHOD__ . '] Each item must be an array.');
foreach ($arr as $key => $val) {
if (is_array($val)) {
// recursion
!isset($result[$key]) && $result[$key] = array();
$result[$key] = self::array_fork($result[$key], $arr[$key]);
continue;
}
if (is_numeric($key)) {
if (!in_array($arr[$key], $result))
$result[] = $arr[$key];
} else
$result[$key] = $arr[$key];
}
}
return $result;
}
function custom_array_merge(&$array1, &$array2) {
$result = Array();
foreach ($array1 as $key_1 => &$value_1) {
// if($value['name'])
foreach ($array2 as $key_1 => $value_2) {
if($value_1['name'] == $value_2['name']) {
$result[] = array_merge($value_1,$value_2);
}
}
}
return $result;
}
//传递$array1,&array2,并更改要合并的$value_2['name']//名称。
好吧,假设您的数组被称为$arr1和$arr2,您可以这样做:
<?php
$newarray = Array();
foreach ($arr1 as $element=>$value){
$newarray = array_merge($arr1[$element],$arr2[$element])
}
?>
既不需要使用递归技术,也不需要使用多个循环。将两个数组合并在一起,然后根据行的id
值在输出数组中分配临时一级键。如果第一次遇到id
,请将行的数据与空数组合并;否则,合并结果数组中预先存在的行数据。要在循环后删除第一级密钥,请调用array_values()
。
代码:(演示(
$a = [
['rank' => '579', 'id' => '1'],
['rank' => '251', 'id' => '2'],
];
$b = [
['size' => 'S', 'status' => 'A', 'id' => '1'],
['size' => 'L', 'status' => 'A', 'id' => '2'],
];
$result = [];
foreach (array_merge($a, $b) as $row) {
$result[$row['id']] = $row + ($result[$row['id']] ?? []);
}
var_export(array_values($result));
如果两个数据集在其各自的id
组中存在列数据冲突,则以后遇到的值将覆盖以前存储的值,而问题的示例数据不表示该冲突。Demo为了扭转这种行为,你可以简单地交换";数组并集运算符";。请注意,数组并集在这种情况下是合适的,因为行包含非数字键。对于其他情况,使用array_merge()
或array_replace()
而不是并集运算符可能更可靠。