2013-10-07 41 views
0

假設,即我有3個數組:如何有效地合併和可能卷積兩個數組?

$a = [ 1, 2, 3 ];  // victim #1 
$b = [ 4, 5, 6, 7, 8]; // victim #2 
$result = [];   // result 

我需要合併$a$b以這樣順序,即$a數組的每個元素之後,應當陣列$b的元件。然而,$b數組的元素可能會相互跟隨。

例如:

1 4 2 5 6 3 7 8 

我已經試過這樣:這使所需的輸出

while($a || $b) 
    { 
     $bool = rand(1, 100) >= 50; 

     if($a) 
      { 
       $result[] = array_shift($a); 
      } 

     if($b) 
      { 
       $result[] = array_shift($b); 
      } 

     if($bool && $b) 
      { 
       $result[] = array_shift($b); 
      } 
    } 

Array 
(
    [0] => 1 
    [1] => 4 
    [2] => 5 
    [3] => 2 
    [4] => 6 
    [5] => 7 
    [6] => 3 
    [7] => 8 
) 

不過,我認爲,這可能是效率低下s的array_shift() s和if() s在那裏出現太多次了。

問題:有沒有更有效的方法來做到這一點?

P.S:謝謝,但我真的不知道如何使用array_merge()。這不是RTM問題。

+0

我覺得你的輸出是不完全你的意思。你說每個'$ a'元素都必須跟着'$ b'元素。這意味着你的結果必須是[1,2,3,4,5,6,7,8] – david

+1

'$ a'元素應該在'$ b'的每2個元素之後。如果不是,在什麼時間間隔之後,每個'$ a'跟隨'$ b'? – aaron

+0

@aaron至少有一個'$ b',如果有'$ b'元素的話。 – BlitZ

回答

1
foreach ($a as $value) { 
    $result[] = $value; 
    do { 
     $bool = rand(0,1) == 1; 
     $result[] = array_shift($b); 
    } while ($bool); 
} 
// insert the remaining of value $b in the $result 
foreach ($b as $value) 
    $result[] = $value; 
+0

它不會按該順序混合元素。 – BlitZ

+0

這將得到您的問題的結果1,2,3,4,5,6,7,8基地 – david

+0

請參閱示例。 Quote:'每$元素應該後面是$ b元素'。 – BlitZ

0
$a = array(1, 2, 3);  // victim #1 
$b = array(4, 5, 6, 7, 8); // victim #2 


foreach($a as $first) 
{ 
    $result[] = $first; 
} 

foreach($b as $second) 
{ 
    $result[] = $second; 
} 

或者

$a = array(1, 2, 3, 9);  // victim #1 
$b = array(4, 5, 6, 7, 8); // victim #2 
$result = array_merge($a,$b);