2013-07-25 173 views
2

要麼我是盲人,要麼我在這裏的任何地方都找不到這個問題。 昨天我遇到了合併陣列的問題,我可以在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 
     ) 

) 

What have I tried?

我試過幾個合併功能PHP,我是最接近的結果(array_merge()array_merge_recursive()),第二陣列(['lang'])覆蓋了第一陣列(['groups'])。爲了解決這個問題,我嘗試刪除lang陣列上的空值(總是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()的返回指令似乎並沒有做任何事情,所以我可能無法正確採集數據或我擺烏龍與數組(忘記添加[],或者我不知道...)。我有點想念這裏的樹林。

我可以去哪個方向的任何建議?

編輯:隨着PédeLeã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; 
} 

而結果正是我想要的!

+0

使用'array_merge_recursive' - http://php.net/manual/en/function.array-merge-recursive.php – maximkou

+0

我做到了,但結果是一樣的。 'lang'覆蓋'groups' –

+0

如果你有和數組,試試這個'$ resultArray = $ usergroup ['groups'] + $ usergroup ['lang']' – maximkou

回答

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

也許它不是最聰明的,但你可以嘗試這樣的,太:

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

返回數組的關鍵將是該組的ID在這個例子中。

0

我從來沒有array_merge()與之前的對象。我懷疑你需要像UNION這樣的類才能工作(即公共數據)。

  • 聲明:這是你的數據結構,它不會有太大的變化。
  • 斷言:如果您在頂部的示例中提供了var_export()輸出而不是print_r(),我可以執行以下操作(測試它)...
  • 使用更多在上次使用的強制轉換語句中使用了特定的類,但我不知道您的類層次結構〜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]; 
        } 
    }