2015-04-01 152 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])); 
} 

奇怪的是,第二阵列需要被包裹在一个阵列或者它不会将它插入一个嵌套数组。希望这能让你走上正轨。