Matriz Array na multidimensional array

Ou eu sou cego ou não consigo encontrar este problema em qualquer lugar aqui SO. Ontem eu tive um problema com a fusão de arrays, que eu poderia consertar com a ajuda de SO. Hoje, eu tenho, novamente, um problema com mesas de fusão, mas desta vez é com Arrays multidimensionais.

Eu tenho uma matriz $usergroup['groups'] e uma matriz $usergroup['lang']

$usergroup['groups'] parece assim:

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

E $usergroup['lang'] parece assim:

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

Eu quero que minha matriz mesclada pareça assim:

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

O que tentei?

Eu tentei várias funções de mesclagem ( array_merge() e array_merge_recursive() ) de PHP, o resultado mais próximo que recebi foi que a segunda Array ( ['lang'] ) substituiu a primeira Array ( ['groups'] ). Para corrigir isso, tentei remover os valores vazios na matriz de lang (que é sempre id ). Mas isso não conserta isso. O código – no momento – parece assim:

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

O array_merge () no comando de retorno não parece fazer nada, então provavelmente não estou reunindo os dados corretamente ou eu perdi algo com os Arrays (esquecendo de adicionar [], ou eu não sei. …). Eu meio que sinto falta da floresta para as trees aqui.

Alguma sugestão em que direção eu poderia ir?

Editar: Com o código fornecido por Pé de Leão, consegui resolver o problema. Minha function agora se parece com isto:

 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; } 

E o resultado é exatamente como eu queria.

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

talvez não seja o mais inteligente, mas você também pode tentar isso:

 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; } 

A chave da matriz retornada será o id do grupo nesse exemplo.

Eu nunca array_merge () com objects antes. Eu suspeito que você precisaria ter classs como a UNION para que ela funcione (ou seja, dados públicos).

  • Asserção: esta é a sua estrutura de dados e não vai mudar muito.
  • Asserção: se você tivesse fornecido a saída var_export () em vez de print_r () nas amostras no topo, eu poderia ter executado o seguinte (para testá-lo) …
  • Seria melhor usar uma class mais específica na última declaração de casting usada, mas não conheço sua hierarquia de class ~ Usergroup_Model?
  • Esta resposta ignora qualquer coisa a ver com getDefaultLanguage (), pois isso não fazia parte da pergunta.

     $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]; } }