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:
- Unir
- Eliminar duplicados
- 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ámetronull
deja los objetos sin modificar eid
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 alusort()
másusort()
para ordenar porid
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
)
)