472084
472084

Reputation: 17885

Split array into chunks of alternating sizes

I have an array:

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

I want to split the array into alternating chunks. (size 2 then 3 then 2 then 3 etc)

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

    [1] => Array
        (
            [0] => 3
            [1] => 4
        )

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

    [3] => Array
        (
            [0] => 8
            [1] => 9
        )

)

Upvotes: 1

Views: 5772

Answers (6)

mickmackusa
mickmackusa

Reputation: 47894

Iterated calls of array_splice() seems like a great way to go. Here is a cleaner version of István Őri's answer. Subtracting from 5 removes the need to use the modulus operator.

Code: (Demo)

$array = range(1, 10);

$chunks = [];
$chunkSize = 3;

while ($array) {
    $chunkSize = 5 - $chunkSize;
    $chunks[] = array_splice($array, 0, $chunkSize);
}
var_export($chunks);

This snippet modifies $array as it iterates. array_splice() keeps removing elements from the front of the array. Eventually the array will become empty and the while() condition will fail -- breaking the loop.

Upvotes: 2

Satyajyoti
Satyajyoti

Reputation: 1

$tobechunked_arr = array(0,1,2,3,4,5,6,7,8,9);
$chunk_size_arr = array(3,2,3,2);
$j = 0;
foreach($chunk_size_arr as $key => $val)
{
    for($i = 0; $i < $val; $i++)
    {
        $result_arr[$key][] = $tobechunked_arr[$j];
        $j++;
    }
}

echo "<pre>";
print_r($result_arr);

Upvotes: 0

Istv&#225;n Őri
Istv&#225;n Őri

Reputation: 288

That should work:

$a = array(0 => 0,1 => 1,2 => 2,3 => 3,4 => 4, 5 => 5, 6 => 6,7 => 7,8 => 8,9 => 9);
$chunks = array();
$i=1;
while(count($a)){
    $chunks[] = array_splice($a, 0,(2+($i%2)),array());

    $i++;
}

echo "<pre>";
var_dump($chunks);

Upvotes: 5

Fluffeh
Fluffeh

Reputation: 33512

You could use this, it isn't the most elegant, but it will just do the trick for you - and you can modify it nicely and adapt it to suit your purposes further:

<?php

$originalArray = array(0,1,2,3,4,5,6,7,8,9);


$counter=count($originalArray);
$isTwo=true;
$newArray=array();
$arrElement=0;
$i=0;
while($i<$counter)
{
    if($isTwo)
    {
        $newArray[$arrElement]= array();
        for($j=0; $j<2; $j++)
        {
            $newArray[$arrElement][$j]=$originalArray[$i+$j];
        }
        $i+=2;
        $isTwo=false;
        $arrElement++;
    }
    else
    {
        $newArray[$arrElement]= array();
        for($j=0; $j<3; $j++)
        {
            $newArray[$arrElement][$j]=$originalArray[$i+$j];
        }
        $i+=3;
        $isTwo=true;
        $arrElement++;
    }
}
    var_dump($newArray);
?>

Output:

array(4) {
  [0]=>
  array(2) {
    [0]=>
    int(0)
    [1]=>
    int(1)
  }
  [1]=>
  array(3) {
    [0]=>
    int(2)
    [1]=>
    int(3)
    [2]=>
    int(4)
  }
  [2]=>
  array(2) {
    [0]=>
    int(5)
    [1]=>
    int(6)
  }
  [3]=>
  array(3) {
    [0]=>
    int(7)
    [1]=>
    int(8)
    [2]=>
    int(9)
  }
}

Upvotes: 0

Abid Hussain
Abid Hussain

Reputation: 7762

try this

<?php
$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));
?>

Update

<?php 
$myArray = array("abc","def","ghi","jkl","mno","pqr","stu","vwx","yz");
$newArray = array_chunk($myArray, 2, false);
// Now process the multidimensional array made from array_chunk()
$i = 0;
foreach ($newArray as $inner_array) {
    $i++;
    echo "<h2>Chunk $i</h2>";
    while (list($key, $value) = each($inner_array)) {    
        echo "$key: $value <br />"; 
    }
}
?>

Output

Chunk 1

0: abc

1: def

Chunk 2

0: ghi

1: jkl

Chunk 3

0: mno

1: pqr

Chunk 4

0: stu

1: vwx

Chunk 5

0: yz

Upvotes: -1

Praveen Kumar Purushothaman
Praveen Kumar Purushothaman

Reputation: 167182

You can use array_splice for splitting the array, but you need to set conditions right? On what basis do you wanna split them?

And you can use array_merge to bring them back into an array of arrays.

In case of your current code, the code will be:

PHP Code

<?php
    $array = array(0,1,2,3,4,5,6,7,8,9);
    $final = array(
        array_splice($array, 0, 3),
        array_splice($array, 1, 2),
        array_splice($array, 1, 2),
        array_splice($array, 1, 2),
    );
    print_r($final);
?>

Output

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

    [1] => Array
        (
            [0] => 4
            [1] => 5
        )

    [2] => Array
        (
            [0] => 6
            [1] => 7
        )

    [3] => Array
        (
            [0] => 8
            [1] => 9
        )

)

Fiddle here: http://codepad.org/JzxcZ2Q1

Upvotes: 1

Related Questions