合并两个二维数组并删除重复行

问题描述 投票:0回答:5

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

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

php merge closures array-merge
5个回答
3
投票

您可以使用非常简单的 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
        )

)

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

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


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

1
投票

如果您在唯一的

id
上对它们进行索引,那么只需添加它们即可。 结果将在
id
上建立索引,很方便:

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

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",
     ],
]
© www.soinside.com 2019 - 2024. All rights reserved.