2015-04-01 45 views
0

我想結合兩個數組,但有第二個數組均勻分佈在第一個數組中。我打算不合並他們,如果有一個很好的循環解決方案,我正在試圖解決的地方,我只是建立一個新的數組。如何動態組合兩個數組,同時確保它們均勻分佈?

陣列1是這樣的:

$array_1 = array(
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat') 
    ); 

陣列2的樣子:

$array_2 = array(
    array('dog'), 
    array('dog'), 
    array('dog'), 
    array('dog') 
); 

我想這些合併成一個。唯一踢球是我想在陣列1.均勻空間出數組2爲了說明我的問題,這是它大概會喜歡什麼:

$array_1 = array(
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 

     array('dog'), 

     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 

     array('dog'), 

     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 

     array('dog'), 

     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 
     array('cat'), 

     array('dog'), 

     array('cat'), 
     array('cat'), 
     array('cat') 
    ); 

這也必須是動態的,因爲我們不知道的數組1或2的大小(它們將隨時間變化)。它需要考慮奇數或偶數,並儘可能完美地分佈。唯一真正的常數是陣列2將總是比陣列1短。

重複數組貓和狗只用於說明目的。這些數組的實際值可以是任何東西,所以假設每個數組都是它自己的。

回答

1

您可以使用以下功能。我認爲兩個數組中的元素可能具有不同的值,並且數組鍵可能不會被排序。

function distribute($container, $distributed) { 

    // reindex arrays 
    $container = array_values($container); 
    $distributed = array_values($distributed); 

    $containerSize = count($container); 
    $distributedSize = count($distributed); 

    $partSize = floor($containerSize/$distributedSize); 

    $newArray = array(); 

    $distributedKey = 0; 
    $newArrayKey = 0; 

    foreach ($container as $containerKey => $containerValue) { 

     if (($containerKey >= $partSize) && (($containerKey % $partSize) == 0)) { 

      $newArray[$newArrayKey] = $distributed[$distributedKey][0]; 
      $distributedKey++; 
      $newArrayKey++; 

     } 

     $newArray[$newArrayKey] = $container[$containerKey][0]; 
     $newArrayKey++; 

    } 

return $newArray; 

} 
0

對此可以有很多答案,但另一種方法是使用array_chunk來相應地分配/分配它們,然後將第二個數組中的每個內容推入其中。當然,在分塊之後,你需要再將它們弄平。

$data = array_chunk($array_1, floor(count($array_1)/count($array_2))); 
$result = array(); 
foreach($data as &$d) { 
    if(!empty($array_2)) { 
     $d[] = array_shift($array_2); // push inside the batch 
    } 
    $result = array_merge($result, $d); // flatten 
} 

Sample Output

0

我知道這是骯髒的,但它的作品。所以我接受捐款:

$catCount = count($array_1); 
$dogCount = count($array_2); 
$offset = $catCount/$dogCount; 

for ($i = 0; $i < $dogCount; $i++) { 
    array_splice($array_1, ($offset * ($i + 1)), 0, array($array_2[$i])); 
} 

奇怪的是,第二陣列需要被包裹在一個陣列或者它不會將它插入一個嵌套數組。希望這能讓你走上正軌。