通过关联值合并多维数组

时间:2019-10-11 11:36:40

标签: php merge closures array-merge

我搜索了许多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 。没有人工作。可能是因为函数不知道标识每个条目的标识符。有没有简单的解决方案,或者我真的必须为此创建自己的方法/函数吗?

也许有一个我可以使用的闭包?

5 个答案:

答案 0 :(得分:3)

您可以使用非常简单的PHP内置函数来做到这一点

             DateTime Shift
0 2019-01-01 06:00:00 A
1 2019-01-01 18:00:00 D
2 2019-01-02 06:00:00 A
3 2019-01-02 18:00:00 B
4 2019-01-03 06:00:00 A
5 2019-01-03 18:00:00 B
.
.
.

print_r的输出为

noFILT_Y = abs(fft(y, Nf));

subplot(2,1,2)
stem(fasis(1:N2),FILT_Y(1:N2),'.');box('off'); axis tight;
subplot(2,1,1)
stem(fasis(1:N2),noFILT_Y(1:N2),'.');box('off'); axis tight;

答案 1 :(得分:1)

$temp = array_merge($b, $a);
foreach ($temp as $v) {
    $c[$v['id']] = $v;
}

如果找到相同的ID,则该元素将被$ c覆盖

答案 2 :(得分:1)

我不知道它的性能如何,但是仅使用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",
     ],
   ]

答案 3 :(得分:1)

这是一种在键排序后使用序列化对每个数组进行哈希处理的方法:

<?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',
    ),
  )

答案 4 :(得分:1)

如果您在唯一的id上为其建立索引,则只需添加它们即可。结果将在id上索引,这很方便:

$result = array_column($a, null, 'id') + array_column($b, null, 'id');