按关联值合并多维数组
Merge a multidimensional array by associative value
我搜索了很多 SOF 线程,似乎没有人坚持我的问题。什么样的有线因为这应该是一个很好讨论的问题:)
可能我找错了...
场景:
我有 2 个数组
$a = [
['id' => 5, 'name' => 'bruce'],
['id' => 7, 'name' => 'wayne']
];
// 2 elements
和
$b = [
['id' => 6, 'name' => 'chuck'],
['id' => 8, 'name' => 'norris'],
['id' => 7, 'name' => 'wayne'] //also exists in array $a
];
// 3 elements
我的目标是
$c = [
['id' => 6, 'name' => 'chuck'],
['id' => 8, 'name' => 'norris'],
['id' => 7, 'name' => 'wayne'],
['id' => 5, 'name' => 'bruce']
];
// 4 elements (no duplicates)
我真的不关心数组中的顺序,但我想将两者合并为一个,不要重复。
我尝试了 array_merge 和 array_merge_recursive。没有人工作。可能是因为函数不知道标识每个条目的标识符。有没有简单的解决方案,还是我真的必须为此创建一个自己的 method/function?
也许有一个我可以使用的闭包?
$temp = array_merge($b, $a);
foreach ($temp as $v) {
$c[$v['id']] = $v;
}
如果找到相同的id,则$c中的元素将被覆盖
您可以使用 PHP
的非常简单的内置函数来做到这一点
$c = array_unique(array_merge($a,$b), SORT_REGULAR);
print_r( $c )
print_r 的输出是
Array
(
[0] => Array
(
[id] => 5
[name] => bruce
)
[1] => Array
(
[id] => 7
[name] => wayne
)
[2] => Array
(
[id] => 6
[name] => chuck
)
[3] => Array
(
[id] => 8
[name] => norris
)
)
我不知道它的性能如何,但仅使用 phps 数组操作函数我得到:
>>> array_values(array_merge(array_combine(array_column($a, 'name'), $a), array_combine(array_column($b, 'name'), $b)));
=> [
[
"id" => 5,
"name" => "bruce",
],
[
"id" => 7,
"name" => "wayne",
],
[
"id" => 6,
"name" => "chuck",
],
[
"id" => 8,
"name" => "norris",
],
]
这是一种在键排序后使用序列化散列每个数组的方法:
<?php
$a = [
['id' => 5, 'name' => 'bruce'],
['id' => 7, 'name' => 'wayne']
];
$b = [
['id' => 6, 'name' => 'chuck'],
['name' => 'wayne', 'id' => 7],
['id' => 8, 'name' => 'norris']
];
$merged = array_merge($a, $b);
foreach($merged as $k => $v) {
ksort($v);
$hashes[$k] = serialize($v);
}
$hashes = array_unique($hashes);
var_export(array_intersect_key($merged, $hashes));
输出:
array (
0 =>
array (
'id' => 5,
'name' => 'bruce',
),
1 =>
array (
'id' => 7,
'name' => 'wayne',
),
2 =>
array (
'id' => 6,
'name' => 'chuck',
),
4 =>
array (
'id' => 8,
'name' => 'norris',
),
)
如果您将它们编入唯一 id
索引,则只需添加它们。结果将在 id
上建立索引,这很方便:
$result = array_column($a, null, 'id') + array_column($b, null, 'id');
我搜索了很多 SOF 线程,似乎没有人坚持我的问题。什么样的有线因为这应该是一个很好讨论的问题:)
可能我找错了...
场景:
我有 2 个数组
$a = [
['id' => 5, 'name' => 'bruce'],
['id' => 7, 'name' => 'wayne']
];
// 2 elements
和
$b = [
['id' => 6, 'name' => 'chuck'],
['id' => 8, 'name' => 'norris'],
['id' => 7, 'name' => 'wayne'] //also exists in array $a
];
// 3 elements
我的目标是
$c = [
['id' => 6, 'name' => 'chuck'],
['id' => 8, 'name' => 'norris'],
['id' => 7, 'name' => 'wayne'],
['id' => 5, 'name' => 'bruce']
];
// 4 elements (no duplicates)
我真的不关心数组中的顺序,但我想将两者合并为一个,不要重复。
我尝试了 array_merge 和 array_merge_recursive。没有人工作。可能是因为函数不知道标识每个条目的标识符。有没有简单的解决方案,还是我真的必须为此创建一个自己的 method/function?
也许有一个我可以使用的闭包?
$temp = array_merge($b, $a);
foreach ($temp as $v) {
$c[$v['id']] = $v;
}
如果找到相同的id,则$c中的元素将被覆盖
您可以使用 PHP
的非常简单的内置函数来做到这一点$c = array_unique(array_merge($a,$b), SORT_REGULAR);
print_r( $c )
print_r 的输出是
Array
(
[0] => Array
(
[id] => 5
[name] => bruce
)
[1] => Array
(
[id] => 7
[name] => wayne
)
[2] => Array
(
[id] => 6
[name] => chuck
)
[3] => Array
(
[id] => 8
[name] => norris
)
)
我不知道它的性能如何,但仅使用 phps 数组操作函数我得到:
>>> array_values(array_merge(array_combine(array_column($a, 'name'), $a), array_combine(array_column($b, 'name'), $b)));
=> [
[
"id" => 5,
"name" => "bruce",
],
[
"id" => 7,
"name" => "wayne",
],
[
"id" => 6,
"name" => "chuck",
],
[
"id" => 8,
"name" => "norris",
],
]
这是一种在键排序后使用序列化散列每个数组的方法:
<?php
$a = [
['id' => 5, 'name' => 'bruce'],
['id' => 7, 'name' => 'wayne']
];
$b = [
['id' => 6, 'name' => 'chuck'],
['name' => 'wayne', 'id' => 7],
['id' => 8, 'name' => 'norris']
];
$merged = array_merge($a, $b);
foreach($merged as $k => $v) {
ksort($v);
$hashes[$k] = serialize($v);
}
$hashes = array_unique($hashes);
var_export(array_intersect_key($merged, $hashes));
输出:
array (
0 =>
array (
'id' => 5,
'name' => 'bruce',
),
1 =>
array (
'id' => 7,
'name' => 'wayne',
),
2 =>
array (
'id' => 6,
'name' => 'chuck',
),
4 =>
array (
'id' => 8,
'name' => 'norris',
),
)
如果您将它们编入唯一 id
索引,则只需添加它们。结果将在 id
上建立索引,这很方便:
$result = array_column($a, null, 'id') + array_column($b, null, 'id');