Split an Array into N Arrays - PHP

arrays, multidimensional-array, php, split

Solution

This simple function would work for you:

Usage

$array = range("a", "r"); // same as your array
print_r(alternate_chunck($array,12));

Output

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

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

    [2] => Array
        (
            [0] => e
            [1] => f
        )

    [3] => Array
        (
            [0] => g
            [1] => h
        )

    [4] => Array
        (
            [0] => i
            [1] => j
        )

    [5] => Array
        (
            [0] => k
            [1] => l
        )

    [6] => Array
        (
            [0] => m
        )

    [7] => Array
        (
            [0] => n
        )

    [8] => Array
        (
            [0] => o
        )

    [9] => Array
        (
            [0] => p
        )

    [10] => Array
        (
            [0] => q
        )

    [11] => Array
        (
            [0] => r
        )

)

Update The above might not be useful for most cases ... here is another type of chunk

$array = range("a", "r"); // same as your array
print_r(fill_chunck($array, 5));

Output

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

    [1] => Array
        (
            [0] => e
            [1] => f
            [2] => g
            [3] => h
        )

    [2] => Array
        (
            [0] => i
            [1] => j
            [2] => k
            [3] => l
        )

    [3] => Array
        (
            [0] => m
            [1] => n
            [2] => o
            [3] => p
        )

    [4] => Array
        (
            [0] => q
            [1] => r
        )

)

This would make sure the group at no time is more that 5 elements where the other one has no limitation

Function Used

function alternate_chunck($array, $parts) {
    $t = 0;
    $result = array();
    $max = ceil(count($array) / $parts);
    foreach(array_chunk($array, $max) as $v) {
        if ($t < $parts) {
            $result[] = $v;
        } else {
            foreach($v as $d) {
                $result[] = array($d);
            }
        }
        $t += count($v);
    }
    return $result;
}


function fill_chunck($array, $parts) {
    $t = 0;
    $result = array_fill(0, $parts - 1, array());
    $max = ceil(count($array) / $parts);
    foreach($array as $v) {
        count($result[$t]) >= $max and $t ++;
        $result[$t][] = $v;
    }
    return $result;
}

Problem

I have an array of 18 values: ``` $array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r'); ``` I want to split this array into 12 different arrays so it should look like this: ``` array( 0 => array('a', 'b'), 1 => array('c', 'd'), 2 => array('e', 'f'), 3 => array('g', 'h'), 4 => array('i', 'j'), 5 => array('k', 'l'), 6 => array('m'), 7 => array('n'), 8 => array('o'), 9 => array('p'), 10 => array('q'), 11 => array('r') ) ``` My function doesn't seem to work ``` function array_split($array, $parts){ return array_chunk($array, ceil(count($array) / $parts)); } $result = array_split($array, 12); ``` because I get 9 different arrays instead of 12. It would return ``` array( 0 => array('a', 'b'), 1 => array('c', 'd'), 2 => array('e', 'f'), 3 => array('g', 'h'), 4 => array('i', 'j'), 5 => array('k', 'l'), 6 => array('m', 'n'), 7 => array('o', 'p'), 8 => array('q', 'r') ) ``` How would I go about doing this? Thanks.

Original source