【问题标题】:Find interception of two arrays and then merge the two找到两个数组的交集,然后将两者合并
【发布时间】:2015-04-01 19:55:54
【问题描述】:

我有一个大型主机名数组及其对应的位置。

 Array ( [ABC01] => Array ( [hostid] => 12345 
                            [lat] => 123
                            [lon] => 123
                            [adr] => 126 Foo Street
                            [city] => Rocky Hill 
                            [state] => Connecticut
                            [country] => USA ) 
         [ABC02] => Array ( [hostid] => 12346 
                            [lat] => 345
                            [lon] => 345
                            [adr] => 123 Foo Street 
                            [city] => Boston 
                            [state] => Massachusetts
                            [country] => USA )

         [ABC03] => Array ( [hostid] => 12346 
                            [lat] => 345
                            [lon] => 345
                            [adr] => 123 Foo Street 
                            [city] => New York City
                            [state] => New York
                            [country] => USA )
          .....)

我将它与一个更小的数组进行比较 - 主机名相同,但它链接到 IP 地址:

 Array ( [ABC01] => Array ( [ip] => 192.168.2.1 ) 
         [ABC02] => Array ( [ip] => 192.168.2.2 )
         [ABC03] => Array ( [ip] => 192.168.2.3 )
       )

我想创建以下数组:

         [ABC02] => Array ( [hostid] => 12346 
                            [lat] => 345
                            [lon] => 345
                            [adr] => 123 Foo Street 
                            [city] => Boston 
                            [state] => Massachusetts
                            [country] => USA
                            [ip] => 192.168.2.1)

我正在尝试找到数组的交集,然后将两者合并(找到相同的键然后合并)。我尝试了各种功能,但最终的结果从来都不是我想要的。

我设法找到了一个函数here 来合并公共键,但是它返回了一个数组中的IP,该数组包含另一个数组中的位置字段,如下所示:

Array ( [ABC02] => Array ( [0] => Array ( [hostid] => 12346 
                           [lat] => 345
                           [lon] => 345
                           [adr] => 123 Foo Street 
                           [city] => Boston 
                           [state] => Massachusetts
                           [country] => USA
                           [1] => Array ( [ip] => 192.168.2.1) ) )

有更简单的方法吗?

【问题讨论】:

    标签: php arrays merge


    【解决方案1】:

    使用内置 PHP 函数非常简单:

    $result = array_merge_recursive($large, $small);
    

    根据您的评论仅获取常见的值,然后合并。这假设$small 中的所有键都在$large 中:

    $result = array_merge_recursive(array_intersect_key($large, $small), $small);
    

    不做假设,如果其中一个中的键可能不在另一个中,那么:

    $result = array_merge_recursive(array_intersect_key($large, $small),
                                    array_intersect_key($small, $large));
    

    【讨论】:

    • 对不起,我没有指定:我不想要两者的完全合并 - 我想要截取两者,然后将较大数组中的相应值合并到较小的数组中。使用 array_merge_recursive,我得到了完整的列表。我知道我可以用较小的数组再次执行 array_intercept_key 来给我想要的东西 - 它似乎是重复的。
    • 已编辑。如果我现在明白了,那还是很简单的。
    • 谢谢 - 成功了!我开始做一个前端项目,所以我现在才回到这个看似乏味的任务。
    • 实际上.. 我刚刚打印出数组,它是只有 IP 的主机,而不是位置字段:(
    猜你喜欢
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多