2014-11-24 51 views
1

我有两个数组,它们是从用户定义类似路由计划的表单中获得的。这种形式是独立进程并返回这两个数组。我想用下面的逻辑结合:按关键因子组合数组

$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 
     ) 

) 

通过它的“路线”键组合它们(如果在$数组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 
     ) 

) 

我tryed几个不同的阵列功能,但没有成功。我想我必须手动循环,但我不知道如何。

我已经在Stackoverflow上搜索,但无法找到类似的问题。但也许是因为我不知道这种操作的技术词汇。

+0

是'$阵列1 => route'总是一个更大然后键? – caramba 2014-11-24 14:07:22

+0

是的。但在$ array2上只存储有检查点的路由 – Th3Alchemist 2014-11-24 14:16:39

回答

1

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

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

工程,但这可能会做一些无关的迭代。 – Gabriel 2014-11-24 14:22:51

+0

我没有得到正确的结果,我认为:http://viper-7.com/1tnqoC – Th3Alchemist 2014-11-24 14:32:58

+1

@ Th3Alchemist你var倾销'$ value2' :)应该是'var_dump($ array1)' – Ghost 2014-11-24 14:34:39

1

你可以“还原”了两个数组,通过创建,你映射路由ID到数组索引,对他们俩的结构:你遍历每个阵列,并建立类似:

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

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

然后,你遍历$revArr1的键和每个键您检查是否有在$revArr2一个对应的按键。 如果是,则准备取$array2[$correspondingIndex]这是您想要在$array1中丰富的路线对应的子阵列。

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

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

1

嵌套数组需要一个双循环:

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

}