Movatterモバイル変換


[0]ホーム

URL:


    array_column »
    « array_change_key_case

    array_chunk

    (PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

    array_chunkSplit an array into chunks

    Description

    array_chunk(array$array,int$length,bool$preserve_keys =false):array

    Chunks an array into arrays withlength elements. The last chunk may contain less thanlength elements.

    Parameters

    array

    The array to work on

    length

    The size of each chunk

    preserve_keys

    When set totrue keys will be preserved. Default isfalse which will reindex the chunk numerically

    Return Values

    Returns a multidimensional numerically indexed array, starting with zero, with each dimension containinglength elements.

    Errors/Exceptions

    Iflength is less than1, aValueError will be thrown.

    Changelog

    VersionDescription
    8.0.0 Iflength is less than1, aValueError will be thrown now; previously, an error of levelE_WARNING has been raised instead, and the function returnednull.

    Examples

    Example #1array_chunk() example

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

    The above example will output:

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

    See Also

    Found A Problem?

    Learn How To Improve This PageSubmit a Pull RequestReport a Bug
    add a note

    User Contributed Notes18 notes

    azspot at gmail dot com
    18 years ago
    Tried to use an example below (#56022) for array_chunk_fixed that would "partition" or divide an array into a desired number of split lists -- a useful procedure for "chunking" up objects or text items into columns, or partitioning any type of data resource. However, there seems to be a flaw with array_chunk_fixed — for instance, try it with a nine item list and with four partitions. It results in 3 entries with 3 items, then a blank array.So, here is the output of my own dabbling on the matter:<?phpfunctionpartition($list,$p) {$listlen=count($list);$partlen=floor($listlen/$p);$partrem=$listlen%$p;$partition= array();$mark=0;    for ($px=0;$px<$p;$px++) {$incr= ($px<$partrem) ?$partlen+1:$partlen;$partition[$px] =array_slice($list,$mark,$incr);$mark+=$incr;    }    return$partition;}$citylist= array("Black Canyon City","Chandler","Flagstaff","Gilbert","Glendale","Globe","Mesa","Miami","Phoenix","Peoria","Prescott","Scottsdale","Sun City","Surprise","Tempe","Tucson","Wickenburg");print_r(partition($citylist,3) );?>Array(    [0] => Array        (            [0] => Black Canyon City            [1] => Chandler            [2] => Flagstaff            [3] => Gilbert            [4] => Glendale            [5] => Globe        )    [1] => Array        (            [0] => Mesa            [1] => Miami            [2] => Phoenix            [3] => Peoria            [4] => Prescott            [5] => Scottsdale        )    [2] => Array        (            [0] => Sun City            [1] => Surprise            [2] => Tempe            [3] => Tucson            [4] => Wickenburg        ))
    Andrew Martin
    7 years ago
    To reverse an array_chunk, use array_merge, passing the chunks as a variadic:<?php$array= [1,2,3,4,5,6,7,8,9];$chunks=array_chunk($array,3);// $chunks = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]$de_chunked=array_merge(…$chunks);// $de_chunked = [1, 2, 3, 4, 5, 6, 7, 8, 9]?>
    nate at ruggfamily dot com
    15 years ago
    If you just want to grab one chunk from an array, you should use array_slice().
    Anonymous
    4 years ago
    Most easy way split array to parts<?php$arr= [1,2,3,4,5,6,7,8,9,10];print_r(array_chunk($arr,ceil(count($arr) /2)));// return: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]print_r(array_chunk($arr,ceil(count($arr) /3)));// return: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]?>
    Anonymous
    19 years ago
    Here my array_chunk_values( ) with values distributed by lines (columns are balanced as much as possible) :<?phpfunctionarray_chunk_vertical($data,$columns) {$n=count($data) ;$per_column=floor($n/$columns) ;$rest=$n%$columns;// The map$per_columns= array( ) ;        for ($i=0;$i<$columns;$i++ ) {$per_columns[$i] =$per_column+ ($i<$rest?1:0) ;        }$tabular= array( ) ;        foreach ($per_columnsas$rows) {            for ($i=0;$i<$rows;$i++ ) {$tabular[$i][ ] =array_shift($data) ;            }        }        return$tabular;    }header('Content-Type: text/plain') ;$data=array_chunk_vertical(range(1,31),7) ;    foreach ($dataas$row) {        foreach ($rowas$value) {printf('[%2s]',$value) ;        }        echo"\r\n";    }/*        Output :        [ 1][ 6][11][16][20][24][28]        [ 2][ 7][12][17][21][25][29]        [ 3][ 8][13][18][22][26][30]        [ 4][ 9][14][19][23][27][31]        [ 5][10][15]    */?>
    OIS
    17 years ago
    Response to azspot at gmail dot com function partition.$columns = 3;$citylist = array('Black Canyon City', 'Chandler', 'Flagstaff', 'Gilbert', 'Glendale', 'Globe', 'Mesa', 'Miami', 'Phoenix', 'Peoria', 'Prescott', 'Scottsdale', 'Sun City', 'Surprise', 'Tempe', 'Tucson', 'Wickenburg');print_r(array_chunk($citylist, ceil(count($citylist) / $columns)));Output:Array(    [0] => Array        (            [0] => Black Canyon City            [1] => Chandler            [2] => Flagstaff            [3] => Gilbert            [4] => Glendale            [5] => Globe        )    [1] => Array        (            [0] => Mesa            [1] => Miami            [2] => Phoenix            [3] => Peoria            [4] => Prescott            [5] => Scottsdale        )    [2] => Array        (            [0] => Sun City            [1] => Surprise            [2] => Tempe            [3] => Tucson            [4] => Wickenburg        ))
    suisuiruyi at aliyun dot com
    9 years ago
    chunk array vertically$arr    = range(1, 19);function array_chunk_vertical($arr, $percolnum){    $n = count($arr);    $mod    = $n % $percolnum;    $cols   = floor($n / $percolnum);    $mod ? $cols++ : null ;    $re     = array();    for($col = 0; $col < $cols; $col++){        for($row = 0; $row < $percolnum; $row++){            if($arr){                $re[$row][]   = array_shift($arr);            }        }    }    return $re;}$result = array_chunk_vertical($arr, 6);foreach($result  as $row){    foreach($row as $val){        echo '['.$val.']';    }    echo '<br/>';}/*[1][7][13][19][2][8][14][3][9][15][4][10][16][5][11][17][6][12][18] */
    dustin at fivetechnology dot com
    9 years ago
    Had need to chunk an object which implemented ArrayAccess Iterator Countable.  array_chunk wouldn't do it.  Should work for any list of things<?php   $listOfThings= array(1,2,3,4,5,6,7,8,9,10,11,12,13);print_r(chunk_iterable($listOfThings,4);  functionchunk_iterable($listOfThings,$size) {$chunk=0;$chunks=array_fill(0,ceil(count($listOfThings) /$size) -1, array());$index=0;      foreach($listOfThingsas$thing) {        if ($index&&$index%$size==0)$chunk++;$chunks[$chunk][] =$thing;$index++;      }      return$chunks;  }?>
    siddharthundare at gmail dot com
    10 years ago
    <table><tr><?php$array_chunkdata= array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25);$chunk=array_chunk($array_chunkdata,5);$rev_counter=2;functionfor_chunk($chunk_data){    echo"<td><table>";      foreach($chunk_dataas$key=>$chunk_value)      {        echo"<tr><td>";        echo$chunk_value;        echo"</td></tr>";      }      echo"</table></td>";   }foreach($chunkas$key=>$chunk_data){    if($rev_counter%2==0)    {for_chunk($chunk_data);    }    else    {$chunk_data=array_reverse($chunk_data);for_chunk($chunk_data);         }$rev_counter++;}?> </tr></table>/*Output:12345    109876    1112131415    2019181716    2122232425*/
    phpm at nreynolds dot me dot uk
    20 years ago
    array_chunk() is helpful when constructing tables with a known number of columns but an unknown number of values, such as a calendar month. Example:<?php$values=range(1,31);$rows=array_chunk($values,7);print"<table>\n";foreach ($rowsas$row) {    print"<tr>\n";    foreach ($rowas$value) {        print"<td>".$value."</td>\n";    }    print"</tr>\n";}print"</table>\n";?>Outputs:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 The other direction is possible too, with the aid of a function included at the bottom of this note. Changing this line:  $rows = array_chunk($values, 7);To this:  $rows = array_chunk_vertical($values, 7);Produces a vertical calendar with seven columns:1 6  11 16 21 26 31 2 7  12 17 22 27 3 8  13 18 23 28 4 9  14 19 24 29 5 10 15 20 25 30 You can also specify that $size refers to the number of rows, not columns:  $rows = array_chunk_vertical($values, 7, false, false);Producing this:1 8  15 22 29 2 9  16 23 30 3 10 17 24 31 4 11 18 25 5 12 19 26 6 13 20 27 7 14 21 28 The function:<?phpfunctionarray_chunk_vertical($input,$size,$preserve_keys=false,$size_is_horizontal=true){$chunks= array();        if ($size_is_horizontal) {$chunk_count=ceil(count($input) /$size);    } else {$chunk_count=$size;    }        for ($chunk_index=0;$chunk_index<$chunk_count;$chunk_index++) {$chunks[] = array();    }$chunk_index=0;    foreach ($inputas$key=>$value)    {        if ($preserve_keys) {$chunks[$chunk_index][$key] =$value;        } else {$chunks[$chunk_index][] =$value;        }                if (++$chunk_index==$chunk_count) {$chunk_index=0;        }    }        return$chunks;}?>
    mick at vandermostvanspijk dot nl
    21 years ago
    [Editors note: This function was based on a previous function by gphemsley at nospam users dot sourceforge.net]For those of you that need array_chunk() for PHP < 4.2.0, this function should do the trick:<?phpif (!function_exists('array_chunk')) {    functionarray_chunk($input,$size,$preserve_keys=false) {        @reset($input);$i=$j=0;        while( @list($key,$value) = @each($input) ) {            if( !( isset($chunks[$i] ) ) ) {$chunks[$i] = array();            }            if(count($chunks[$i] ) <$size) {                if($preserve_keys) {$chunks[$i][$key] =$value;$j++;                } else {$chunks[$i][] =$value;                }            } else {$i++;                if($preserve_keys) {$chunks[$i][$key] =$value;$j++;                } else {$j=0;$chunks[$i][$j] =$value;                }            }        }        return$chunks;    }}?>
    dead dot screamer at seznam dot cz
    16 years ago
    This function can be used to reverse effect of<?php array_Chunk()?>.<?phpfunctionarray_Unchunk($array){    returncall_User_Func_Array('array_Merge',$array);}header('Content-Type: text/plain');$array=array(    array('Black Canyon City','Chandler','Flagstaff','Gilbert','Glendale','Globe',    ),    array('Mesa','Miami','Phoenix','Peoria','Prescott','Scottsdale',    ),    array('Sun City','Surprise','Tempe','Tucson','Wickenburg',    ),);var_Dump(array_Unchunk($array));?>Output:array(17) {  [0]=>  string(17) "Black Canyon City"  [1]=>  string(8) "Chandler"  [2]=>  string(9) "Flagstaff"  [3]=>  string(7) "Gilbert"  [4]=>  string(8) "Glendale"  [5]=>  string(5) "Globe"  [6]=>  string(4) "Mesa"  [7]=>  string(5) "Miami"  [8]=>  string(7) "Phoenix"  [9]=>  string(6) "Peoria"  [10]=>  string(8) "Prescott"  [11]=>  string(10) "Scottsdale"  [12]=>  string(8) "Sun City"  [13]=>  string(8) "Surprise"  [14]=>  string(5) "Tempe"  [15]=>  string(6) "Tucson"  [16]=>  string(10) "Wickenburg"}
    stratboy
    12 years ago
    Hi, I've made  a function to split an array into chunks based on columns wanted. For example:<?php $a= array(1,2,3,4,5,6,7,8);?>goal (say, for 3 columns):<?phparray(   array(1,2,3),   array(4,5,6),   array(7,8));?><?phpfunctionget_array_columns($array,$columns){$columns_map= array();        for($i=0;$i<$columns;$i++){$columns_map[] =0; }//init columns                //create map$count=count($array);$position=0;        while($count>0){$columns_map[$position]++;$position= ($position<$columns-1) ? ++$position:0;$count--;        }//chunk the array based on map$chunked= array();        foreach($columns_mapas$map){$chunked[] =array_splice($array,0,$map);        }                return$chunked;    }//end get_array_columns?>
    leon at valkenb dot org
    4 years ago
    With no luck finding a function; here is the one I wrote:It will evenly distribute items into a fixed amount of groups but also keeps items that were sorted close together to be in the same output groups.<?phpfunctiondistributed_array_chunk(array$items,int $groups,bool $preserveKeys=false) {$grouped= [];$groupsPerItem=$groups/count($items);$progress=0.00;    foreach ($itemsas$key=>$value) {$index=floor($progress+=$groupsPerItem);        if ($preserveKeys) {$grouped[$index][$key] =$value;        }        else{$grouped[$index][] =$value;        }        }    return$grouped;}?>
    magick dit crow ot gmail dit com
    20 years ago
    This function takes each few elements of an array and averages them together. It then places the averages in a new array. It is used to smooth out data. For example lets say you have a years worth of hit data to a site and you want to graph it by the week. Then use a bucket of 7 and graph the functions output.function array_bucket($array, $bucket_size)  // bucket filter{    if (!is_array($array)) return false; // no empty arrays    $buckets=array_chunk($array,$bucket_size);  // chop up array into bucket size units    foreach ($buckets as $bucket) $new_array[key($buckets])=array_sum($bucket)/count($bucket);    return $new_array;  // return new smooth array}
    normiridium at gmail dot com
    9 years ago
    A breakdown by groups with excess:function array_chunk_greedy($arr, $count){    $arr = array_chunk($arr, $count);    if(($k = count($arr)-1) > 0){            if(count($arr[$k]) < $count){            $arr[$k-1] = array_merge($arr[$k-1], $arr[$k]);            unset($arr[$k]);        }                }    return $arr;    }$arr = range(1, 13);$arr = array_chunk_greedy($arr, 4);print_r($arr);[1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13]More examples:[1,2,3,4,5,6,7,8,9,10,11,12] —> [1,2,3,4] [5,6,7,8] [9,10,11,12][1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13][1,2,3,4,5,6,7,8,9,10,11,12,13,14] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14][1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14,15][1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] —> [1,2,3,4] [5,6,7,8] [9,10,11,12] [13,14,15,16]Example report:$arr = range(1, 45);$arr = array_chunk_lazy($arr, 10);$arr = array_map(function($sub_value) {            return implode('<br>', $sub_value);        }, $arr);$title = '<h2>title</h2>';$arr = $title.implode($title, $arr).$title;echo $arr;
    webmaster at cafe-clope dot net
    20 years ago
    based on the same syntax, useful about making columns :<?phpfunctionarray_chunk_fixed($input,$num,$preserve_keys=FALSE) {$count=count($input) ;    if($count)$input=array_chunk($input,ceil($count/$num),$preserve_keys) ;$input=array_pad($input,$num, array()) ;    return$input;}$array= array(1,2,3,4,5) ;print_r(array_chunk($array,2)) ;print_r(array_chunk_fixed($array,2)) ;?>---- array_chunk : fixed number of sub-items ----Array(    [0] => Array(            [0] => 1            [1] => 2        )    [1] => Array(            [0] => 3            [1] => 4        )    [2] => Array(            [0] => 5        ))---- array_chunk : fixed number of columns ----Array(    [0] => Array(            [0] => 1            [1] => 2            [2] => 3        )    [1] => Array(            [0] => 4            [1] => 5        ))
    magick dit crow ot gmail dit com
    20 years ago
    Mistake key did not do what I thought. A patch.function array_bucket($array,$bucket_size)// bucket filter{    if (!is_array($array)) return false;    $buckets=array_chunk($array,$bucket_size);// chop up array into bucket size units    $I=0;    foreach ($buckets as $bucket)    {        $new_array[$I++]=array_sum($bucket)/count($bucket);    }    return $new_array;// return new array}
    add a note
    To Top
    and to navigate •Enter to select •Esc to close •/ to open
    PressEnter without selection to search using Google

    [8]ページ先頭

    ©2009-2025 Movatter.jp