it-swarm.com.ru

Как объединить два массива объекта в PHP

У меня есть следующие два массива объектов:

Первый массив: $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
        )
)
16
M. Ahmad Zafar

Эти 3 простых шага сделали работу:

//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 помог мне прийти к этому простому решению

27
M. Ahmad Zafar

ОБНОВЛЕНИЕ

Теперь я публикую здесь полный список кодов вместо ранее опубликованного основного кода, печатая как ввод, так и вывод. Вы можете просто скопировать и вставить этот код для проверки.

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

)
4
Software Guy

Назначение:

  1. Сливаться
  2. Удалить дубликаты
  3. Сортировать по id

Хорошая новость: Назначение временных ключей с использованием значений id делает всю тяжелую работу за вас. Нет необходимости сериализации.

  • array_merge() объединяет массивы вместе.
  • array_column() с параметром null 2 оставляет объекты неизмененными, а 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);
print_r(array_values($merged_keyed));

Результат:

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
        )    
)
0
mickmackusa