unir objetos juntar asociativos php arrays sorting

objetos - unir dos arrays asociativos php



Cómo fusionar dos matrices de objeto en PHP (3)

Tengo las siguientes dos matrices de objetos:

Primera matriz: $array1

Array ( [0] => stdClass Object ( [id] => 100 [name] => Muhammad ) [1] => stdClass Object ( [id] => 102 [name] => Ibrahim ) [2] => stdClass Object ( [id] => 101 [name] => Sumayyah ) )

Segunda matriz: $array2

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

Quiero fusionar estas dos matrices de objetos (eliminar todos los duplicados) y ordenarlas de acuerdo con la id .

Salida deseada:

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


Asignaciones:

  1. Unir
  2. Eliminar duplicados
  3. Ordenar por id

La buena noticia es que: la asignación de claves temporales mediante los valores de id hace todo el trabajo por usted. No se necesita serialización.

  • array_merge() une los arreglos.
  • array_column() con un segundo parámetro null deja los objetos sin modificar e id como el tercer parámetro asigna las claves temporales. Debido a que las matrices no pueden tener claves duplicadas, los objetos duplicados se eliminan en este paso.
  • Ahora que tenemos claves, ksort() evita llamar al usort() más usort() para ordenar por id ascendente.
  • Finalmente, llame a array_values() para volver a indexar la matriz resultante (eliminar las claves temporales).

Código: ( Demo )

$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));

Salida:

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


Estos 3 simples pasos hicieron el trabajo:

//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 );

Nota: La respuesta de @Kamran me ayudó a llegar a esta solución simple


ACTUALIZAR

Estoy publicando el código completo aquí ahora en lugar del código principal publicado anteriormente, imprimiendo tanto la entrada como la salida. Simplemente puede copiar y pegar este código para probar.

<?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>";

se emitirá lo siguiente:

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