3

私は目が見えないか、SOのどこにもこの問題が見つかりません。昨日、配列のマージで問題が発生しましたが、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
        )

)

私は何を試しましたか?

PHP のいくつかのマージ関数 (array_merge()および) を試しましたが、得られた最も近い結果は、2 番目の配列 ( ) が最初の配列 ( ) を上書きしたというものでした。これを修正するために、配列の空の値を削除しようとしました(これは常にです)。しかし、それはそれを修正しません。現時点でのコードは次のようになります。array_merge_recursive()['lang']['groups']langid

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

return コマンドの array_merge() はまったく何もしていないように見えるので、おそらくデータを正しく収集していないか、配列を台無しにしています ([] を追加するのを忘れているか、わかりません。 ..)。ここの木にとって森が恋しいです。

私が行くことができる方向に何か提案はありますか?

編集: 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;
}

そして、結果はまさに私が望んでいた方法です!

4

4 に答える 4

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 になります。

于 2013-07-25T06:35:24.260 に答える
0
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);
于 2019-01-08T12:00:47.707 に答える