【问题标题】:Merging two PHP arrays with same numeric key合并两个具有相同数字键的 PHP 数组
【发布时间】:2016-04-23 06:36:06
【问题描述】:

尝试使用相同的数字键合并两个数组时遇到一些困难。我试过array_merge()array_merge_recursive(),但似乎所做的只是附加第二个数组。

第一个数组的形式如下:

Array
(
    [384] => Array
        (
            [name] => SomeMovieName1
            [age] => 12.2 hrs
            [IMDBLink] => 
            [IMDBRating] => 
            [coverArt] => 
        )

    [452] => Array
        (
            [name] => SomeMovieName2
            [age] => 13.1 hrs
            [IMDBLink] => 
            [IMDBRating] => 
            [coverArt] => 
        )

    [945] => Array
        (
            [name] => SomeMovieName3
            [age] => 13.6 hrs
            [IMDBLink] => 
            [IMDBRating] => 
            [coverArt] => 
        )
)

这是我想与第一个合并/合并的第二个数组:

Array
(
    [384] => Array
        (
            [IMDBRating] => 7.2
            [IMDBLink] => http://www.imdb.com/LinkToMovie1
            [coverArt] => http://www.SomeLinkToCoverArt.com/1
        )

    [452] => Array
        (
            [IMDBRating] => 8.2
            [IMDBLink] => http://www.imdb.com/LinkToMovie2
            [coverArt] => http://www.SomeLinkToCoverArt.com/2
        )

    [945] => Array
        (
            [IMDBRating] => 6.2
            [IMDBLink] => http://www.imdb.com/LinkToMovie3
            [coverArt] => http://www.SomeLinkToCoverArt.com/3
        )
)

合并后,我希望结果是:

Array
(
    [0] => Array
        (
            [name] => SomeMovieName1
            [age] => 12.2 hrs
            [IMDBRating] => 7.2
            [IMDBLink] => http://www.imdb.com/LinkToMovie1
            [coverArt] => http://www.SomeLinkToCoverArt.com/1
        )

    [1] => Array
        (
            [name] => SomeMovieName2
            [age] => 13.1 hrs
            [IMDBRating] => 8.2
            [IMDBLink] => http://www.imdb.com/LinkToMovie2
            [coverArt] => http://www.SomeLinkToCoverArt.com/2
        )

    [2] => Array
        (
            [name] => SomeMovieName3
            [age] => 13.6 hrs
            [IMDBRating] => 6.2
            [IMDBLink] => http://www.imdb.com/LinkToMovie3
            [coverArt] => http://www.SomeLinkToCoverArt.com/3
        )
)

不确定是否是因为内部数组导致无法直接与array_merge()array_merge_recursive() 一起使用的问题。任何帮助将不胜感激,

谢谢。

【问题讨论】:

  • 为什么合并后的数组的$key值从[384][452][945]变为[0][1][2]
  • 我正在使用一个 ID 字段,我分配给两个数组中的每个键,这样当我稍后将它们组合起来时,我可以使用这些键来知道哪个 IMDB/etc 元素与以后的组合。我确信我可以用不同的方式来做,但这是我想到的第一个尝试的想法。

标签: php arrays merge nested


【解决方案1】:

您可以尝试以下代码来合并数组。代码生成您所需的所需输出。我使用了您给出的示例数组:

<?php
    $arr1=array(
        "384"=>array("name"=>"SomeMovieName1","age"=>"12.2 hrs","IMDBLink"=>"","IMDBRating"=>"", "coverArt"=>""),
        "452"=>array("name"=>"SomeMovieName2","age"=>"15.2 hrs","IMDBLink"=>"","IMDBRating"=>"", "coverArt"=>""),
        "954"=>array("name"=>"SomeMovieName3","age"=>"4.2 hrs","IMDBLink"=>"","IMDBRating"=>"", "coverArt"=>"")
    );
    $arr2=array(
       "384" => array("IMDBLink" => "7.2", "IMDBRating" => "http://www.imdb.com/LinkToMovie1", "coverArt" => "http://www.SomeLinkToCoverArt.com/1"),
       "452" => array("IMDBLink" => "5","IMDBRating" => "http://www.imdb.com/LinkToMovie2", "coverArt" => "http://www.SomeLinkToCoverArt.com/2"),
       "954"=>array("IMDBLink" => "8","IMDBRating" => "http://www.imdb.com/LinkToMovie3", "coverArt" => "http://www.SomeLinkToCoverArt.com/3")
    );
    $arr3 = array();
    foreach($arr1 as $key=>$val)
    {
         $arr3[] = array_merge($val, $arr2[$key]);
    }
    echo "<pre>";
    print_r($arr3);
?>

【讨论】:

  • 谢谢,完美。我的直觉告诉我,我可能需要使用 foreach 遍历其中一个数组并使用 array_merge()
【解决方案2】:

array_merge_recursive 不起作用,因为您的外部数组有数字键,而不是字符串键。当array_mergearray_merge_recursive 被赋予数值数组时,它们会追加它们而不是合并具有相同键的元素。

相反,您可以映射数组并合并相应的元素。

$result = array_map('array_merge', $array1, $array2);

请注意,此代码假定两个输入数组具有相同顺序的所有相同键。如果它们的顺序不同,您可以先在它们上使用ksort 重新排列它们。

但是,如果它们可以有不同的键,则需要不同的解决方案,例如 Webang 答案中的循环。

【讨论】:

  • 这两个数组可能有不同的键顺序,但我想我可以在使用您的解决方案之前对它们进行排序。感谢您的意见。
【解决方案3】:

在 foreach 循环中运行数组可能更容易,只需将每个值插入到初始数组中即可。让我们调用第一个数组$myFirstArray 和第二个数组$mySecondArray

foreach ($myFirstArray as $key => $value)
{
  $myFirstArray[$key][IMDBRating] = $mySecondArray[$key][IMDBRating];
  $myFirstArray[$key][IMDBLink] = $mySecondArray[$key][IMDBLink];
  $myFirstArray[$key][coverArt] = $mySecondArray[$key][coverArt];
}

【讨论】:

    【解决方案4】:

    没有对此进行测试,但它应该可以工作:

    调用你的第一个数组 $ar1,第二个 $ar2

    $result=array();
    foreach($ar1 as $k=>$v)
    {
     //if there is a corresponding array2 element
     if( isset($ar2[$k]) ){ 
           $result[] = array( $v['name], $v['age'], $ar2[$k]['IMDBLink'], $ar2[$k]['IMDBRating'],$ar2['coverArt']);
     }
    }
    
    //result
    print_r($result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2014-03-04
      • 2014-03-12
      • 1970-01-01
      • 2016-04-16
      • 2015-01-21
      • 2021-12-09
      相关资源
      最近更新 更多