【问题标题】:Array merge on multidimensional array多维数组上的数组合并
【发布时间】:2013-07-25 06:12:23
【问题描述】:

要么我是盲人,要么我在 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
        )

)

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

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

结果正是我想要的!

【问题讨论】:

  • 我做了,但结果是一样的。 lang 覆盖 groups
  • 如果你有 sum 数组,试试这个$resultArray = $usergroup['groups'] + $usergroup['lang']
  • 我该如何理解这一点?我刚刚尝试了return $usergroup['groups'] + $usergroup['lang'],现在lang 数组完全丢失了。
  • 也许这会有所帮助:kohanaframework.org/3.3/guide-api/Arr#merge 这取决于可以在同一页面上找到的 Arr::is_assoc。

标签: php arrays multidimensional-array


【解决方案1】:
$out = array();
foreach ($arr1 as $key => $value){
    $out[] = (object)array_merge((array)$arr2[$key], (array)$value);
}
print_r($out)

【讨论】:

  • 你能解释一下为什么你在array_merge和$arr2[$key]之间使用(array)。或详细的参考会有所帮助
  • @DhruvThakkar 那是type casting,以确保将参数解释为数组。
【解决方案2】:

也许它不是最聪明的,但你也可以这样尝试:

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。

【讨论】:

    【解决方案3】:

    我以前从未使用过 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];
          }
      }
      

    【讨论】:

      【解决方案4】:
      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多