合并两个对象数组并去除重复的对象,然后按列值排序。

22

我有以下两个对象数组:

第一个数组:$array1

Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => Muhammad
        )

    [1] => stdClass Object
        (
            [id] => 102
            [name] => Ibrahim
        )

    [2] => stdClass Object
        (
            [id] => 101
            [name] => Sumayyah
        )
)

第二个数组:$array2

Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => Muhammad
        )

    [1] => stdClass Object
        (
            [id] => 103
            [name] => Yusuf
        )
)

我想合并这两个对象数组(删除所有重复项),并按照id排序。

期望输出:

Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => Muhammad
        )

    [1] => stdClass Object
        (
            [id] => 101
            [name] => Sumayyah
        )

    [2] => stdClass Object
        (
            [id] => 102
            [name] => Ibrahim
        )

    [3] => stdClass Object
        (
            [id] => 103
            [name] => Yusuf
        )
)

为什么其中一个对象使用 StaffId 而不是 id - Ben
谢谢。您的索引看起来仍然很奇怪(例如$arr2有2个0索引)。 - Ben
3个回答

38

这三个简单的步骤解决了问题:

//both arrays will be merged including duplicates
$result = array_merge( $array1, $array2 );
//duplicate objects will be removed
$result = array_map("unserialize", array_unique(array_map("serialize", $result)));
//array is sorted on the bases of id
sort( $result );

注意: @Kamran的回答帮助我找到了这个简单的解决方案


2
如果对象很大,整个对象的序列化效率非常低!可能有一种更好的方式只使用ID。 - Grigory Ilizirov

4

更新

现在我将整个代码清单发布在这里,而不是之前发布的主要代码,同时打印输入和输出。您可以直接复制粘贴此代码进行测试。

<?php

function array_to_object($arr) {
    $arrObject = array();
    foreach ($arr as $array) {
        $object = new stdClass();
        foreach ($array as $key => $value) {
            $object->$key = $value;
        }
        $arrObject[] = $object;
    }

    return $arrObject;
}

function super_unique($array)
{
    $result = array_map("unserialize", array_unique(array_map("serialize", $array)));
    foreach ($result as $key => $value)  {
        if ( is_array($value) ) {
          $result[$key] = super_unique($value);
        }
    }
    return $result;
}

function merge_arrays($arr1, $arr2) {
    $arr1 = (array)$arr1;
    $arr2 = (array)$arr2;
    $output = array_merge($arr1, $arr2);
    sort($output);
    return super_unique($output);
}

$array1 = array(
        array("id" => "100", "name" => "muhammad"), 
        array("id" => "102", "name" => "ibrahim"), 
        array("id" => "101", "name" => "summayyah"), 
    );
$array1 = array_to_object($array1);

print "<h3>Your array 1</h3>";
print "<pre>";
print_r($array1);
print "</pre>";

$array2 = array(
        array("id" => "100", "name" => "muhammad"), 
        array("id" => "103", "name" => "yusuf"), 
    );
$array2 = array_to_object($array2);

print "<h3>Your array 2</h3>";
print "<pre>";
print_r($array2);
print "</pre>";

$result = merge_arrays($array1, $array2);

print "<h3>Your desired output</h3>";
print "<pre>";
print_r($result);
print "</pre>";
它将输出以下内容:
Your array 1
Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => muhammad
        )

    [1] => stdClass Object
        (
            [id] => 102
            [name] => ibrahim
        )

    [2] => stdClass Object
        (
            [id] => 101
            [name] => summayyah
        )

)

Your array 2
Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => muhammad
        )

    [1] => stdClass Object
        (
            [id] => 103
            [name] => yusuf
        )

)

Your desired output
Array
(
    [0] => stdClass Object
        (
            [id] => 100
            [name] => muhammad
        )

    [2] => stdClass Object
        (
            [id] => 101
            [name] => summayyah
        )

    [3] => stdClass Object
        (
            [id] => 102
            [name] => ibrahim
        )

    [4] => stdClass Object
        (
            [id] => 103
            [name] => yusuf
        )

)

谢谢,但它没有起作用。在 merge_arrays() 结束时,数组已经合并,但排序不起作用,然后 super_unique() 根本不起作用(不知道为什么)。 - M. Ahmad Zafar
我不知道为什么它没起作用。我测试了这个脚本,对我来说它仍然可以正常运行。 - Software Guy
我刚刚更新了我的答案,包括整个代码清单而不仅仅是主要代码,因此您可以复制粘贴并测试。 - Software Guy
是的,我想“array_to_object”缺失了。 - M. Ahmad Zafar

1

任务:

  1. 合并
  2. 删除重复项
  3. id排序

好消息是: 使用id值分配临时键可以为您完成所有繁重的工作。 不需要序列化。

  • array_merge()将数组连接在一起。
  • 使用null作为第二个参数的array_column()不会修改对象,id作为第三个参数分配临时键。因为数组不能具有重复的键,所以在此步骤中消除了重复对象。
  • 现在我们有了键,ksort()避免调用更复杂的usort()id升序排序。
  • 最后,调用array_values()重新索引结果数组(删除临时键)。

代码: (演示)

$array1 = [
    (object) ['id' => 100, 'name' => 'Muhammad'],
    (object) ['id' => 102, 'name' => 'Ibrahim'],
    (object) ['id' => 101, 'name' => 'Sumayyah']
];

$array2 = [
    (object) ['id' => 100, 'name' => 'Muhammad'],
    (object) ['id' => 103, 'name' => 'Yusuf']
];

$merged_keyed = array_column(array_merge($array1,$array2), NULL, 'id');
ksort($merged_keyed);
var_export(array_values($merged_keyed));

或者,您可以过滤其中一个数组以删除重复项,然后合并它们,然后对其进行排序。 sort() 将通过 id 列有效地按行对行进行排序,因为行具有相等的大小且 id 是第一个位置的元素。

代码:(演示

$result = array_merge($array1, array_udiff($array2, $array1, fn($a, $b) => $a <=> $b));
sort($result);
var_export($result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,