multidimensional - longitud de un array php
Fusión de dos matrices multidimensionales en clave específica (5)
Digamos que tengo matrices siguientes:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
)
[1] => Array
(
[id] => 4
[name] => Computers
)
[3] => Array
(
[id] => 7
[name] => Science
[4] => Array
(
[id] => 1
[name] => Sports
)
)
Y el segundo:
Array
(
[0] => Array
(
[id] => 1
[title] => Sport
)
[1] => Array
(
[id] => 7
[title] => Sci
)
[3] => Array
(
[id] => 4
[title] => Comp
[4] => Array
(
[id] => 5
[title] => Edu
)
)
Y el resultado deseado es:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Edu
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Comp
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Sci
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Sport
)
)
He logrado fusionar estas matrices simplemente:
foreach($first as $key => $value){
$result[$key] = array_merge($first[$key], $second[$key]);
}
Pero la salida no se combina correctamente:
Array
(
[0] => Array
(
[id] => 5
[name] => Education
[title] => Sport
)
[1] => Array
(
[id] => 4
[name] => Computers
[title] => Sci
)
[3] => Array
(
[id] => 7
[name] => Science
[title] => Comp
[4] => Array
(
[id] => 1
[name] => Sports
[title] => Edu
)
)
El problema es que me gustaría combinar estas matrices en la misma id
. La clasificación de salida deseada debe ser la misma que en la primera matriz.
¿Cómo puedo conseguir esto? Cualquier ayuda es muy apreciada.
Puede hacer un ciclo anidado y verificar si los valores de id
coinciden, luego agregar title
a $first
(o name
a $second
)
foreach($first as $key => $value){
foreach($second as $value2){
if($value[''id''] === $value2[''id'']){
$first[$key][''title''] = $value2[''title''];
}
}
}
Siempre y cuando ambas matrices siempre tengan cada identificación en ellas, ¿qué hay de ordenar las dos matrices por ese campo ''id'', y luego dejar que php realice la fusión?
function cmp($a, $b) {
return ((int) $a[''id''] < (int) $b[''id'']) ? -1 : 1;
}
usort($array1, ''cmp'');
usort($array2, ''cmp'');
$result = array_merge($array1, $array2);
No he probado el código, pero demuestra la idea.
Tu código funciona bien. Tus expectativas son simplemente incorrectas. Por ejemplo, en una matriz, la id
4º elemento contiene 1, pero en otra matriz, la id
4º elemento es 5, por lo que "fusiona estas matrices en la misma ID" no tiene sentido ya que al fusionar 4 elementos en uno también fusionas a sus hijos y id
se usa en ambas matrices, una vez el valor HAVE TO gone ya que no puede haber dos llaves iguales en la matriz.
EDITAR
tienes que fusionarte manualmente ya que las funciones de PHP se fusionan en función de las claves mientras deseas fusionarlas en función del contenido :
$result = array();
foreach( $arrayA as $keyA => $valA ) {
foreach( $arrayB as $keyB => $valB ) {
if( $valA[''id''] == $valB[''id''] ) {
$result[$keyA] = $valA + $valB;
// or if you do not care output keys, just
// $result[] = $valA + $valB;
}
}
}
No use foreach en foreach, eso podría ser demasiado lento cuando la matriz es tan grande.
$idArray = array_column($secondArray,''title'',''id'');
foreach($firstArray as $key => $val){
$firstArray[$key][''title''] = (isset($idArray[$val[''id'']]) ? $idArray[$val[''title''] : ''some title'';
}
Asegúrese de que los artículos estén en el mismo orden, entonces:
$items = array_map(function($itemFirstArray, $itemSecondArray) {
return array_merge($itemFirstArray, $itemSecondArray);
}, $firstArray, $secondArray);