【问题标题】:Merging arrays with the same keys合并具有相同键的数组
【发布时间】:2011-08-18 09:29:27
【问题描述】:

在一个软件中,我用array_merge函数合并了两个数组。但我需要将相同的数组(当然,使用相同的键)添加到现有数组中。

问题:

 $A = array('a' => 1, 'b' => 2, 'c' => 3);
 $B = array('c' => 4, 'd'=> 5);

 array_merge($A, $B);

 // result
 [a] => 1 [b] => 2 [c] => 4 [d] => 5

如您所见,'c' => 3 丢失了。

那么我怎样才能用相同的键合并所有的

【问题讨论】:

  • 数组应该有唯一的键...这是数组的基本属性
  • 你如何想象一个有两个相同键的数组?
  • 正如他们所说,键必须是唯一的。考虑使用二维数组而不是关联数组,然后您可以合并它们而不会产生任何冲突。即array(array('a', 1), array('b', 2), array('c', 3), array('c', 4), array('d', 5))跨度>
  • @Nemoden - 是的,这太奇怪了。但是我的 DB 类需要合并 WHERE 和 PARAMS 以在 mysqli 中绑定。无论如何,所以我需要合并它们:)
  • 工作代码如下。它构建实际的 where 语句,但不构建绑定。希望对您有所帮助。

标签: php array-merge


【解决方案1】:

数组中的两个条目不能共享一个键,您需要更改重复的键

【讨论】:

    【解决方案2】:

    您需要使用array_merge_recursive 而不是array_merge。当然,数组中只能有一个等于'c'的键,但关联的值将是一个同时包含34的数组。

    【讨论】:

    • 嗯...奇怪...我已将 array_merge 更改为 array_merge_recursive 并得到相同的结果(数组键重新编号)。在 PHP.net 网站上,array_merge 下的示例 #3 中有一条注释:“如果您想将第二个数组中的数组元素附加到第一个数组,同时不覆盖第一个数组中的元素,并且 不重新索引,使用 + 数组联合运算符"。在我的情况下,这变成了真的。您在哪里读到 array_merge_recursive 不会重新编号键?
    • @trejder:此问题中没有整数键,因此此处不适用重新索引。我是这样回答的。
    • @jon 您提供的答案链接已损坏。如果还有的话,能否内联代码?
    • @AdamCameron 使用问题中的代码,只是使用array_merge_recursive 而不是“普通”版本。
    • @Elyor array_mergearray_merge_recursive 被记录为对字符串和整数键具有不同的行为,并且有充分的理由:如果它们没有,那么 array_merge([1], [2]) 的结果将是 @ 987654335@,这至少是“意外”。所以他们假设如果你有整数键,那么它们并不重要。如果您有重要的整数键,那么您必须提供考虑到这一点的显式逻辑。
    【解决方案3】:

    试试array_merge_recursive

    $A = array('a' => 1, 'b' => 2, 'c' => 3);
    $B = array('c' => 4, 'd'=> 5);
    $c = array_merge_recursive($A,$B);
    
    echo "<pre>";
    print_r($c);
    echo "</pre>";
    

    会回来

    Array
    (
        [a] => 1
        [b] => 2
        [c] => Array
            (
                [0] => 3
                [1] => 4
            )
    
        [d] => 5
    )
    

    【讨论】:

    • 赞成包含样本,而不是像接受的答案中的死链接。
    【解决方案4】:
     $A = array('a' => 1, 'b' => 2, 'c' => 3);
     $B = array('c' => 4, 'd'=> 5);
     $C = array_merge_recursive($A, $B);
     $aWhere = array();
     foreach ($C as $k=>$v) {
    
        if (is_array($v)) {
            $aWhere[] = $k . ' in ('.implode(', ',$v).')';
        }
        else {
            $aWhere[] = $k . ' = ' . $v;
        }
     }
     $where = implode(' AND ', $aWhere);
     echo $where;
    

    【讨论】:

      【解决方案5】:
      $arr1 = array(
         "0" => array("fid" => 1, "tid" => 1, "name" => "Melon"),
         "1" => array("fid" => 1, "tid" => 4, "name" => "Tansuozhe"),
         "2" => array("fid" => 1, "tid" => 6, "name" => "Chao"),
         "3" => array("fid" => 1, "tid" => 7, "name" => "Xi"),
         "4" => array("fid" => 2, "tid" => 9, "name" => "Xigua")
      );
      

      如果你想把这个数组转换成如下:

      $arr2 = array(
         "0" => array(
                "0" => array("fid" => 1, "tid" => 1, "name" => "Melon"),
                "1" => array("fid" => 1, "tid" => 4, "name" => "Tansuozhe"),
                "2" => array("fid" => 1, "tid" => 6, "name" => "Chao"),
                "3" => array("fid" => 1, "tid" => 7, "name" => "Xi")
          ),
      
          "1" => array(
                "0" =>array("fid" => 2, "tid" => 9, "name" => "Xigua")
           )
      );
      

      所以,我的答案是这样的:

      $outer_array = array();
      $unique_array = array();
      foreach($arr1 as $key => $value)
      {
          $inner_array = array();
      
          $fid_value = $value['fid'];
          if(!in_array($value['fid'], $unique_array))
          {
                  array_push($unique_array, $fid_value);
                  unset($value['fid']);
                  array_push($inner_array, $value);
                  $outer_array[$fid_value] = $inner_array;
      
      
          }else{
                  unset($value['fid']);
                  array_push($outer_array[$fid_value], $value);
      
          }
      }
      var_dump(array_values($outer_array));
      

      希望这个答案会在某个时候对某人有所帮助。

      【讨论】:

        【解决方案6】:

        我刚刚写了这个函数,它应该可以为你解决问题,但它确实离开了

        public function mergePerKey($array1,$array2)
            {
                $mergedArray = [];
        
                foreach ($array1 as $key => $value) 
                {
                    if(isset($array2[$key]))
                     {
                       $mergedArray[$value] = null;
        
                       continue;
                     }
                    $mergedArray[$value] = $array2[$key];
                }
        
                return $mergedArray;
            }
        

        【讨论】:

        • 非常感谢,这正是我正在寻找的合并类型!!
        【解决方案7】:

        试试这个:

        $array_one = ['ratio_type'];
        $array_two = ['ratio_type', 'ratio_type'];
        $array_three = ['ratio_type'];
        $array_four = ['ratio_type'];
        $array_five = ['ratio_type', 'ratio_type', 'ratio_type'];
        $array_six = ['ratio_type'];
        $array_seven = ['ratio_type'];
        $array_eight = ['ratio_type'];
        
        $all_array_elements = array_merge_recursive(
            $array_one,
            $array_two,
            $array_three,
            $array_four,
            $array_five,
            $array_six,
            $array_seven,
            $array_eight
        );
        
        foreach ($all_array_elements as $key => $value) {
            echo "[$key]" . ' - ' . $value . PHP_EOL;
        }
        
        // OR
        var_dump($all_array_elements);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          • 2018-02-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多