2016-01-05 81 views
-1

初始:如何获取多维数组的多个交点?

Array 
(
    [0] => Array 
     (
      [0] => a 
      [1] => b 
     ) 

    [1] => Array 
     (
      [0] => a 
      [1] => c 
     ) 

    [2] => Array 
     (
      [0] => c 
      [1] => b 
     ) 
    [3] => Array 
     (
      [0] => d 
      [1] => e 
     )   
) 

结果:

Array 
(
    [0] => Array 
     (
      [0] => a 
      [1] => b 
      [2] => c 
     ) 
    [1] => Array 
     (
      [0] => d 
      [1] => e 
     )   
) 

前三个初始阵列的项都与不彼此但最后一个。我认为这可以通过使用Floyd-Warshall算法来解决。请帮助我获得结果。

+2

堆栈溢出的问题,预计将显示一些努力自己解决这些问题。 –

+0

@Dagon,对不起,伙计 - 我回答了: - [ – Reloecc

+1

@Reloecc我有一份工作要做,我可以把它发给你免费做吗? ;) –

回答

1

不知道弗洛伊德 - 沃肖尔algorhitm是什么,不知道你的optimatization的需求,但我做到了这一点:

$array = array(
    ['a', 'b'], 
    ['a', 'c'], 
    ['c', 'b'], 
    ['d', 'e'] 
); 

$result = array(); 
foreach($array as $itemOriginal){ //passing every array from the original array 
    $passed = false; 

    foreach($result as &$itemResult){ //passing every array from the new array (empty in the start) 
     foreach($itemOriginal as $item){ //passing every item from original arrays 
     if(in_array($item, $itemResult)){ //checking if the item is in one of earlier passed array transfered into new array already 
      $itemResult = array_unique(array_merge($itemResult, $itemOriginal)); //merging items into new array if one of their items equals 
      $passed = true; //no need to check another item from the current original array 
      break; 
     } 
     } 

     if($passed == true) //no need to find any of original items in new array 
     break; 
    } 

    if($passed == false) //for case the none of checked original items are in new array 
     $result[] = $itemOriginal; 
} 

echo '<pre>'; 
print_r($result); //to check it 
+0

完美。谢谢@Reloecc – user3757515

+0

@ user3757515很乐意提供帮助。 – Reloecc

+0

对于你的改变,包括一个解释是一个更好的主意,所以汤匙喂食不是太明显。 – CubeJockey

0
$result = array(); 
foreach ($array as $item) { 
    // If we're just getting started, get started 
    if (count($result) === 0) { 
     $result[] = $item; 
    // Otherwise, look for merge opportunities 
    } else { 
     $merged = false; 
     // Loop existing items 
     foreach ($result as $k => $resultItem) { 
      // If there's a match, merge & break 
      if (count(array_intersect($resultItem, $item)) > 0) { 
       $result[$k] = array_merge($resultItem, $item); 
       $merged = true; 
       break; 
      } 
     } 
     // If no match was found, create a new element 
     if (!$merged) { 
      $result[] = $item; 
     } 
    } 
} 
+0

array_merge不关心重复性,我用array_unique解决了这个问题 – Reloecc

+0

感谢您的回答。 – user3757515