Слияние массива на многомерном массиве

Либо я слепой, либо я не могу найти эту проблему нигде здесь. Вчера у меня возникла проблема с объединением массивов, которые я мог бы исправить с помощью SO. Сегодня у меня снова возникает проблема с объединением массивов, но на этот раз это с многомерными массивами.

У меня есть массив $usergroup['groups'] и массив $usergroup['lang']

$usergroup['groups'] выглядит так:

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

И $usergroup['lang'] выглядит так:

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

Я хочу, чтобы мой объединенный массив выглядел так:

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

Что я пробовал?

Я пробовал несколько функций слияния ( array_merge() и array_merge_recursive() ) PHP, ближайший результат, который я получил, заключался в том, что второй массив ( ['lang'] ) перезаписал первый массив ( ['groups'] ). Чтобы исправить это, я попытался удалить пустые значения в lang Array (который всегда является id ). Но это не исправить. Код – на данный момент – выглядит так:

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

Команда array_merge () в команде return ничего не делает, поэтому я, вероятно, не собираю данные правильно, или я что-то испортил с помощью массивов (забыв добавить [], или я не знаю. ..). Я как бы скучаю по лесу за деревьями здесь.

Любые предложения в каком направлении я мог бы пойти?

Изменить: с помощью кода, предоставленного Pé de Leão, я смог решить проблему. Теперь моя функция выглядит так:

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

И результат именно в том, как я этого хотел!

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

возможно, это не самое умное, но вы можете попробовать это так:

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

ключ возвращаемого массива будет идентификатором группы в этом примере.

У меня никогда не было array_merge () с объектами раньше. Я подозреваю, что вам нужно будет иметь такие классы, как UNION, чтобы он работал (т.е. публичные данные).

  • Утверждение: это ваша структура данных, и это не сильно изменится.
  • Утверждение: если вы предоставили var_export () вывод, а не print_r () в образцах вверху, я мог бы выполнить следующее (чтобы проверить его) …
  • Было бы лучше использовать более конкретный класс в последнем использованном акте cast, но я не знаю вашу иерархию классов ~ Usergroup_Model?
  • Этот ответ игнорирует все, что связано с getDefaultLanguage (), поскольку это не было частью вопроса.

     $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]; } } находятся $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]; } }