按关键因素组合阵列

  • 本文关键字:组合 阵列 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
        )
)

通过其"路由"键组合它们(如果在 $array 2 中设置)

$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上搜索过,但找不到类似的问题。但也许是因为我不知道这种操作的技术术语。

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

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

你可以"还原"这两个数组,方法是创建一个结构,将routeID映射到数组索引,对于它们来说:你遍历每个数组并构建类似的东西:

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

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

然后,您遍历$revArr1的键,并为每个键检查$revArr2中是否有相应的键。如果是,则您已准备好获取$array2[$correspondingIndex]这是与要在$array1中丰富的路由相对应的子数组。

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

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

嵌套数组需要双循环:

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

}

最新更新