按关键因素组合阵列

时间:2014-11-24 13:59:15

标签: php arrays

我有两个数组,这些数组是从用户定义类似路由计划的表单中获取的。此表单是分开处理并返回以下两个数组。我想结合以下逻辑:

$array1 = Array
(
    [0] => Array
        (
            [route] => 1
            [origin] => zurich
            [target] => madrid
        )

    [1] => Array
        (
            [route] => 2
            [origin] => lisbon
            [target] => dublin
        )

    [2] => Array
        (
            [route] => 3
            [origin] => rome
            [target] => paris
        )

)

$array2 = Array
(
    [0] => Array
        (
            [route] => 2
            [checkpoint] => london
        )

)

通过“route”键(如果在$ array2中设置)

组合它们
$desired = Array
(
    [0] => Array
        (
            [route] => 1
            [origin] => zurich
            [target] => madrid
        )

    [1] => Array
        (
            [route] => 2
            [origin] => lisbon
            [target] => dublin
            [checkpoint] => london
        )

    [2] => Array
        (
            [route] => 3
            [origin] => rome
            [target] => paris
        )

)

我尝试了几种不同的数组函数但没有成功。我想我必须手动循环它们,但我不确定如何。

我在Stackoverflow上搜索但找不到类似的问题。但也许是因为我不知道这种操作的技巧。

3 个答案:

答案 0 :(得分:1)

您可以先循环array2,然后再循环搜索array1中的相应路由。如果匹配,只需将它们合并:

foreach ($array2 as $value) {
    foreach ($array1 as &$value2) {
        if($value2['route'] == $value['route']) {
            $value2 = array_merge($value2, $value); // just join them
        }
    }
}

答案 1 :(得分:1)

你可以通过创建一个将routeID映射到数组索引的结构来“恢复”这两个数组:对于这两个数组:你遍历每个数组并构建类似的东西:

$revArr1 = Array
(
  '1' => 0,
  '2' => 1,
  '3' => 2
)

$revArr2 = Array
(
  '2' => 0
)

然后,您迭代$revArr1的密钥,并为每个密钥检查$revArr2中是否有相应的密钥。 如果是,您就可以获取$array2[$correspondingIndex],这是与您要在$array1中丰富的路线相对应的子阵列。

它需要您完成$array1的2次完整迭代和$array2的1次完整迭代。 另外,如果$array2中的重新路线没有出现在$array1中,则会有额外的循环。

可能有更高效的算法来做到这一点。请尝试查看array_filterarray_map

答案 2 :(得分:1)

嵌套数组需要双循环:

foreach($array1 as $key => $value){
foreach( $array2 as $checkpoint){
    if( $checkpoint['route'] === $array1[$key]['route'] ){
       $array1[$key]['checkpoint'] =  $checkpoint['checkpoint'];       
    }    
}

}