如何动态组合两个阵列,同时确保它们均匀分布?

时间:2015-04-01 02:59:55

标签: php arrays sorting merge

我正在尝试组合两个数组,但第二个数组在第一个数组中均匀分布。如果有一个很好的循环解决方案,我正在尝试解决我只是构建一个新数组的问题,我愿意不合并它们。

数组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短。

重复阵列猫和狗仅用于说明目的。这些数组的实际值可以是任何东西,所以假设每个数组都是它自己的。

3 个答案:

答案 0 :(得分: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;

}

答案 1 :(得分: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

答案 2 :(得分: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]));
}

奇怪的是,第二个数组需要包装在一个数组中,否则它不会将其作为嵌套数组插入。希望这能让你走上正轨。