【问题标题】:PHP array_merge problemPHP array_merge 问题
【发布时间】:2010-10-25 21:26:28
【问题描述】:
$a = array('matches' => 
        array(
            '5' => array('weight' => 6),
            '15' => array('weight' => 6),
        )
    );

    $b = array('matches' => 
        array(
            '25' => array('weight' => 6),
            '35' => array('weight' => 6),
        )
    );

    $merge = array_merge($a, $b);

    print_r($merge);

这个脚本的结果是

Array
(
    [matches] => Array
        (
            [25] => Array
                (
                    [weight] => 6
                )

            [35] => Array
                (
                    [weight] => 6
                )

        )

)

但是为什么呢?

我想要的结果是这样的:

Array
(
    [matches] => Array
        (
            [5] => Array
                (
                    [weight] => 6
                )

            [15] => Array
                (
                    [weight] => 6
                )
            [25] => Array
                (
                    [weight] => 6
                )

            [35] => Array
                (
                    [weight] => 6
                )

        )

) 

【问题讨论】:

    标签: php array-merge


    【解决方案1】:

    因为第一个数组中的键 'matches' 被第二个数组中的相同键覆盖。你需要这样做:

    $merge = array('matches' => array());
    $a = array(
        'matches' => array(
            '5' => array('weight' => 6),
            '15' => array('weight' => 6)
        )
    );
    
    $b = array(
        'matches' => array(
            '25' => array('weight' => 6),
            '35' => array('weight' => 6)
        )
    );
    
    $merge['matches'] = array_merge($a['matches'], $b['matches']);
    
    print_r($merge);
    

    更新

    为了保留数字键,您必须这样做:

    $merge['matches'] = $a['matches'] + $b['matches'];
    

    如果像这样使用数组联合运算符,请记住 php.net 中的以下内容:

    第一个数组中的键将被保留。如果两个数组中都存在数组键,则将使用第一个数组中的元素,而忽略第二个数组中匹配键的元素。

    http://php.net/manual/en/function.array-merge.php

    【讨论】:

    • 如何保存“关键”匹配项?需要“5,15,25,35”,但有“0,1,2,3”
    • 您必须停止使用 array_merge。根据 PHP 文档,array_merge 将始终对数字键重新编号,即使您尝试在 array('1' => 'something', '2' => 'something'); 之类的字符串中使用数字也是如此。为了保留密钥,您必须使用 + 数组联合。我会更新我的答案。
    • @Isis:很酷的功能!当您不知道数组的结构时很有用。但是,当您确切知道自己的结构(例如手头的问题)时,我会建议您采用更加外科手术的方法。
    【解决方案2】:

    尝试使用array_merge_recursive 而不是array_merge

    【讨论】:

      【解决方案3】:

      嗯,你可以手动完成:

          $mergedArray = array();    
      
          foreach($a as $key => $value)
          {
              $mergedArray[$key] = $value;
          }
      
          foreach($b as $key => $value)
          {
              $mergedArray[$key] = $value;
          }
      

      【讨论】:

      • 这将导致与原始海报完全相同的问题。事实上,他会得到与他建议他试图修复的相同的输出。
      【解决方案4】:

      您正在合并数组的顶层。 array_merge() 函数发现它们都包含一个“匹配”元素,因此它选择一个作为合并结果。

      如果你想让它扫描得更深,你需要在数组的下一层运行 array_merge()。在这种情况下,它相对简单,因为每个数组的顶层只有一个元素,所以你只需要一行 - 像这样:

      $merge['matches'] = array_merge($a['matches'], $b['matches']);
      

      不过,更复杂的数组结构需要更多的工作。

      希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        试试:

        $merge = array();
        $merge['matches'] = array_merge($a['matches'], $b['matches']);
        

        您的问题是您正在将顶级 $a 数组与 $b 合并,并且这两个数组都有一个“匹配”索引,因此它接受了该元素的 $b 版本。您可以通过显式合并该索引的数组 ($a['matches'] 与 $b['matches']) 并将其分配给合并数组 ($merge['matches']) 来解决此问题,这将导致预期的行为。

        或者array_merge_recursive 会做你想做的事。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-28
          • 2012-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-21
          • 2011-07-11
          • 2010-10-22
          相关资源
          最近更新 更多