2009-10-29 98 views
0

我有以下2个数组,并希望将它们组合。我对键值比对它们的值更感兴趣。我想借此分组关联数组键 - 在相同的顺序

$arr1 = array(
    'tom' => "1", 
    'sally' => "20" // unique 
    'larry' => "2", 
    'kate' => "3", 
    'dave' => "23" //unique 
); 

$arr2 = array(
    'tom' => "11", 
    'larry' => "12", 
    'drummer' => "2", // unique 
    'kate' => "7", 
    'nick' => "3"  //unique 
); 

,并把它变成像这样

$arr = array(
    'tom', 
    'sally',  //unique from arr1, ended up here because she's before larry 
    'drummer', //unique from arr2, ended up here because he's after larry 
    'larry', 
    'kate', 
    'dave',  //unique from arr1, ended up here because he's after the last 2 similar 
    'nick'  //unique from arr2, ended up here because he's after the last 2 similar 
); 

诀窍是,我需要什么之前插入任何基于这是在正确的位置/顺序独特/后它。 谢谢

+2

顺序没有道理给我。如果“鼓手”是在最后阵列中的“larry”之后,这将是合乎逻辑和可实施的。在你的例子中,它们与原始数组相比倒序排列,看起来相当随意。那么为什么在“凯特”之前也没有“昵称”呢? – 2009-10-29 08:10:41

+0

woops,错字:) wil编辑。 – drummer 2009-10-29 08:18:54

回答

2

通常你想要的是一个非平凡的算法。它被称为序列匹配或longest common subsequence problem。我不认为有一个内置的PHP函数来计算。匹配完成后,您可以处理它们之间不匹配的项目。请注意,可以存在多个常见的子序列,因此如果您真的想要这种合并,那么对于所有项目而言,并不总是可以与原始数组中的顺序相同。

如果不需要最好的结果,你可以尝试这样的近似,这是贪婪地内4个下一项目寻找匹配:

$result = array(); 

$i = 0; 
$j = 0; 
while ($i < count($arr1)) { 
    // Look for a matching item in the next four items of $arr2 
    $k = 0; 
    while ($k < 4) { 
     // Do we have a match? 
     if ($arr1[$i] == $arr2[$j+$k]) { 
      // Add items from $arr2 that are before the matching item 
      while ($k-- > 0) { 
       $result[] = $arr2[$j]; 
       $j++; 
      } 
      $j++; 
      break; 
     } 
     $k++; 
    } 
    // Add the current item fro $arr1 
    $result[] = $arr1[$i]; 
    $i++; 
} 
// Add the remaining items from $arr2 
while ($j < count($arr2)) { 
    $result[] = $arr2[$j]; 
    $j++; 
} 

$result = array_unique($result); 
+0

出于某种原因,我的编辑/尝试未显示在帖子中。可能需要一段时间才能显示已编辑的新内容。但是你在说什么是对的卢卡斯。根据逻辑预期,鼓手现在在larry之后 – drummer 2009-10-29 08:24:57

+0

是的,这个答案是基于当前版本的。对于之前的订单,您仍然需要获得LCS,但是不匹配项目的顺序不会那么清晰。 – 2009-10-29 08:26:44

+0

你有什么想法让我接受它。这不是一个绝对必要的功能,但它会很高兴,所以我想为什么不试着让它工作。我认为我的情况下LCS可能不需要。我在想通过第二个数组,看看是否有独特的东西,然后尝试匹配它适合的地方。 – drummer 2009-10-29 08:33:06