Либо я слепой, либо я не могу найти эту проблему нигде здесь. Вчера у меня возникла проблема с объединением массивов, которые я мог бы исправить с помощью 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, чтобы он работал (т.е. публичные данные).
Этот ответ игнорирует все, что связано с 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]; } }