Fusión de matriz en matriz multidimensional

5 minutos de lectura

avatar de usuario
patricio manser

O estoy ciego o no puedo encontrar este problema en SO. Ayer tuve un problema con la fusión de matrices, que pude solucionar con la ayuda de SO. Hoy tengo, nuevamente, un problema con la fusión de matrices, pero esta vez es con matrices multidimensionales.

tengo una matriz $usergroup['groups'] y una matriz $usergroup['lang']

$usergroup['groups'] Se ve como esto:

Array
(
    [0] => Usergroup_Model Object
        (
            [id] => 1
            [deleted] => 0
        )

    [1] => Usergroup_Model Object
        (
            [id] => 2
            [deleted] => 0
        )

    [2] => Usergroup_Model Object
        (
            [id] => 3
            [deleted] => 0
        )

)

Y $usergroup['lang'] Se ve como esto:

Array
(
    [0] => Usergroup_Model Object
        (
            [id] => 
            [id_usergroup] => 1
            [name] => Administratoren
            [id_lang] => 1
        )

    [1] => Usergroup_Model Object
        (
            [id] => 
            [id_usergroup] => 2
            [name] => Benutzer
            [id_lang] => 1
        )

    [2] => Usergroup_Model Object
        (
            [id] => 
            [id_usergroup] => 3
            [name] => Gäste
            [id_lang] => 1
        )

)

Quiero que mi matriz fusionada se vea así:

Array
(
    [0] => Usergroup_Model Object
        (
            [id] => 1
            [id_usergroup] => 1
            [name] => Administratoren
            [id_lang] => 1
            [deleted] => 0
        )

    [1] => Usergroup_Model Object
        (
            [id] => 2
            [id_usergroup] => 2
            [name] => Benutzer
            [id_lang] => 1
            [deleted] => 0
        )

    [2] => Usergroup_Model Object
        (
            [id] => 3
            [id_usergroup] => 3
            [name] => Gäste
            [id_lang] => 1
            [deleted] => 0
        )

)

¿Qué he probado?

He probado varias funciones de fusión (array_merge() y array_merge_recursive()) de PHP, el resultado más cercano que obtuve fue que el segundo Array (['lang']) sobrescribió la primera matriz (['groups']). Para arreglar eso, traté de eliminar los valores vacíos en el lang Array (que siempre es id). Pero eso no lo arregla. El código, por el momento, se ve así:

public static function getAll()
{
  $usergroup['groups'] = self::find();
  $usergroup['lang'] = self::findInTable(array(
    'id_lang' => Language_Model::getDefaultLanguage()
  ), self::dbTranslationTable);
  foreach ($usergroup as $ug) {
    $ug = array_filter($ug, function($val) {
      return $val != '';
    });
  }
  return array_merge($ug);
}

El array_merge() en el comando de retorno no parece hacer nada en absoluto, por lo que probablemente no esté recopilando los datos correctamente o arruine algo con los arreglos (olvidando agregar [], o no sé…). Extraño un poco el bosque por los árboles aquí.

¿Alguna sugerencia en qué dirección podría ir?

Editar: Con el código proporcionado por Pé de Leão pude resolver el problema. Mi función ahora se ve así:

public static function getAll()
{
  $usergroup['groups'] = self::find();
  $usergroup['lang'] = self::findInTable(array(
    'id_lang' => Language_Model::getDefaultLanguage()
  ), self::dbTranslationTable);
  $out = array();
  foreach ($usergroup['groups'] as $key => $value) {
    $out[] = (object) array_merge((array) $usergroup['lang'][$key], (array) $value);
  }
  return $out;
}

¡Y el resultado es exactamente como lo quería!

  • Usar array_merge_recursivephp.net/manual/en/function.array-merge-recursivo.php

    – maximkou

    25 de julio de 2013 a las 6:14

  • Lo hice, pero el resultado es el mismo. lang anula groups

    –Patrick Manser

    25 de julio de 2013 a las 6:18

  • Si tiene matrices de suma, intente esto $resultArray = $usergroup['groups'] + $usergroup['lang']

    – maximkou

    25 de julio de 2013 a las 6:20


  • ¿Cómo tengo que entender esto? acabo de intentar return $usergroup['groups'] + $usergroup['lang'] y ahora el lang la matriz falta por completo.

    –Patrick Manser

    25 de julio de 2013 a las 6:23

  • Tal vez esto sea de ayuda: kohanaframework.org/3.3/guide-api/Arr#merge Depende de Arr::is_assoc que se puede encontrar en la misma página.

    – Sueños asombrosos

    25 de julio de 2013 a las 6:31


$out = array();
foreach ($arr1 as $key => $value){
    $out[] = (object)array_merge((array)$arr2[$key], (array)$value);
}
print_r($out)

  • ¿Puedes explicar por qué usaste (matriz) entre array_merge y $arr2?[$key]. o una referencia en detalle sería útil

    – Dhruv Thakkar

    12 de marzo de 2019 a las 14:09


  • @DhruvThakkar Eso es tipo de fundición para garantizar que el parámetro se interprete como una matriz.

    – Expedito

    13 de marzo de 2019 a las 9:53

tal vez no sea lo más inteligente, pero también puedes intentarlo así:

public static function getAll()
{
  $groups = self::find();
  $lang = self::findInTable(array(
    'id_lang' => Language_Model::getDefaultLanguage()
  ), self::dbTranslationTable);

  $n = array();
  foreach($groups as $g) {
      $id = $g['id'];
      $n[$id] = $g;
  }

  foreach($lang as $a) {
      $id = $a['id_usergroup'];
      if(!isset($n[$id])){ $n[$id] = array(); }
      $n[$id]['id_usergroup'] = $a['id_usergroup'];
      $n[$id]['name'] = $a['name'];
      $n[$id]['id_lang'] = $a['id_lang'];
  }

  return $n;
}

la clave de la matriz devuelta será la identificación del grupo en este ejemplo.

Nunca he array_merge() con objetos antes. Sospecho que necesitaría tener clases como UNION para que funcione (es decir, datos públicos).

  • Afirmación: esta es su estructura de datos y no cambiará mucho.
  • Afirmación: si hubiera proporcionado la salida var_export() en lugar de print_r() en las muestras en la parte superior, podría haber ejecutado lo siguiente (para probarlo)…
  • Sería mejor usar una clase más específica en la última declaración de conversión utilizada, pero no conozco su jerarquía de clases ~ ¿Modelo de grupo de usuarios?
  • Esta respuesta ignora cualquier cosa que tenga que ver con getDefaultLanguage() ya que eso no era parte de la pregunta.

    $ITEMS=count($usergroup['groups']);
    $out=array();
    for($i=0; $i<$ITEMS; $i++) {
        if(isset($usergroup['lang'][$i])) {
            $out[]=(object)array_merge((array)$usergroup['groups'][$i], (array)$usergroup['lang'][$i]);
        } else {
            $out[]=$usergroup['groups'][$i];
        }
    }
    

if(count($array1) >= count($array2)){
    $arr1 = $array1;
    $arr2 = $array2;
}else{
    $arr1 = $array2;
    $arr2 = $array1;
}

$out = array();
foreach ($arr1 as $key => $value){
    if(isset($arr2[$key])){
        $out[] = array_merge((array)$arr2[$key], (array)$value);
    }else{
        $out[] = (array)$value;
    }
}

pr($out);

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad