2024 日本 PHP 研討會

array_chunk

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

array_chunk將陣列分割成多個區塊

說明

array_chunk(陣列 $array, 整數 $length, 布林值 $preserve_keys = false): 陣列

將一個陣列分割成多個具有 length 個元素的陣列。最後一個區塊可能包含少於 length 個元素。

參數

array

要處理的陣列

length

每個區塊的大小

preserve_keys

設定為 true 時,鍵值將會被保留。預設值為 false,這將會重新以數字索引區塊。

返回值

返回一個以數字索引的多維陣列,從零開始,每個維度包含 length 個元素。

錯誤/例外

如果 length 小於 1,將會拋出 ValueError

更新日誌

版本 說明
8.0.0 如果 length 小於 1,現在將會拋出 ValueError;先前,會引發層級為 E_WARNING 的錯誤,並且函式返回 null

範例

範例 #1 array_chunk() 範例

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

以上範例將輸出:

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
        )

)

參見

新增註記

使用者貢獻的註記 19 則註記

71
azspot at gmail dot com
17 年前
嘗試使用下方 (#56022) 的 array_chunk_fixed 範例,將一個陣列「分割」或劃分成所需數量的分割列表——這是一個將物件或文字項目「分塊」成欄,或分割任何類型資料資源的有用程序。 然而,array_chunk_fixed 似乎存在缺陷——例如,嘗試使用包含九個項目的列表和四個分割區。 它會產生 3 個包含 3 個項目的條目,然後是一個空白陣列。

所以,以下是我自己在此問題上的一些嘗試的輸出

<?php

函式 partition( $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 ) );

?>

陣列
(
[0] => 陣列
(
[0] => Black Canyon City
[1] => Chandler
[2] => Flagstaff
[3] => Gilbert
[4] => Glendale
[5] => Globe
)

[1] => 陣列
(
[0] => Mesa
[1] => Miami
[2] => Phoenix
[3] => Peoria
[4] => Prescott
[5] => Scottsdale
)

[2] => 陣列
(
[0] => Sun City
[1] => Surprise
[2] => Tempe
[3] => Tucson
[4] => Wickenburg
)

)
25
Andrew Martin
6 年前
要反轉 array_chunk 的結果,可以使用 array_merge,並將區塊作為可變參數傳遞。

<?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]
?>
6
dustin at fivetechnology dot com
8 年前
需要將一個實作了 ArrayAccess、Iterator 和 Countable 介面的物件分塊。`array_chunk` 無法處理這種情況。以下程式碼應該適用於任何類似的列表。

<?php
$listOfThings
= array(1,2,3,4,5,6,7,8,9,10,11,12,13);
print_r(chunk_iterable($listOfThings, 4);

function
chunk_iterable($listOfThings, $size) {
$chunk = 0;
$chunks = array_fill(0, ceil(count($listOfThings) / $size) - 1, array());
$index = 0;
foreach(
$listOfThings as $thing) {
if (
$index && $index % $size == 0) $chunk++;
$chunks[$chunk][] = $thing;
$index++;
}
return
$chunks;
}
?>
9
suisuiruyi at aliyun dot com
8 年前
垂直分塊陣列

$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]
*/
8
匿名
3 年前
最簡單的陣列分割方法

<?php

$arr
= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

print_r(array_chunk($arr, ceil(count($arr) / 2)));
// 回傳:[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

print_r(array_chunk($arr, ceil(count($arr) / 3)));
// 回傳:[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

?>
18
nate at ruggfamily dot com
14 年前
如果你只想從陣列中擷取一部分,你應該使用 array_slice()。
20
匿名
18 年前
這是我的 array_chunk_values() 函式,它可以將值按行分配(欄的數量盡可能平衡)。

<?php
function array_chunk_vertical($data, $columns) {
$n = count($data) ;
$per_column = floor($n / $columns) ;
$rest = $n % $columns ;

// 建立映射
$per_columns = array( ) ;
for (
$i = 0 ; $i < $columns ; $i++ ) {
$per_columns[$i] = $per_column + ($i < $rest ? 1 : 0) ;
}

$tabular = array( ) ;
foreach (
$per_columns as $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 (
$data as $row ) {
foreach (
$row as $value ) {
printf('[%2s]', $value) ;
}
echo
"\r\n" ;
}

/*
輸出:

[ 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]
*/
?>
18
OIS
16 年前
回覆 azspot at gmail dot com 的分割函式。

$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)));

輸出
陣列
(
[0] => 陣列
(
[0] => Black Canyon City
[1] => Chandler
[2] => Flagstaff
[3] => Gilbert
[4] => Glendale
[5] => Globe
)

[1] => 陣列
(
[0] => Mesa
[1] => Miami
[2] => Phoenix
[3] => Peoria
[4] => Prescott
[5] => Scottsdale
)

[2] => 陣列
(
[0] => Sun City
[1] => Surprise
[2] => Tempe
[3] => Tucson
[4] => Wickenburg
)

)
5
siddharthundare at gmail dot com
9 年前
<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;

function
for_chunk($chunk_data){

echo
"<td><table>";

foreach(
$chunk_data as $key => $chunk_value)
{
echo
"<tr><td>";
echo
$chunk_value;
echo
"</td></tr>";
}
echo
"</table></td>";

}

foreach(
$chunk as $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>
/*
輸出
1
2
3
4
5

10
9
8
7
6

11
12
13
14
15

20
19
18
17
16

21
22
23
24
25
*/
13
phpm at nreynolds dot me dot uk
19 年前
`array_chunk()` 函式在構建具有已知欄數但值數未知的表格時非常有用,例如月曆。範例:

<?php

$values
= range(1, 31);
$rows = array_chunk($values, 7);

print
"<table>\n";
foreach (
$rows as $row) {
print
"<tr>\n";
foreach (
$row as $value) {
print
"<td>" . $value . "</td>\n";
}
print
"</tr>\n";
}
print
"</table>\n";

?>

輸出:

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

藉由本說明最下方包含的一個函式,也可以實現另一個方向的排列。將以下這一行
$rows = array_chunk($values, 7);

改成這樣
$rows = array_chunk_vertical($values, 7);

會產生一個七欄的垂直日曆

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

您也可以指定 $size 指的是列數,而不是欄數
$rows = array_chunk_vertical($values, 7, false, false);

會產生以下結果

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

函式如下:

<?php

function array_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 (
$input as $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;
}

?>
6
mick at vandermostvanspijk dot nl
20 年前
【編者註:此函式基於 gphemsley at nospam users dot sourceforge.net 先前編寫的函式。】

對於需要在 PHP < 4.2.0 版本中使用 array_chunk() 的使用者,這個函式應該可以派上用場。

<?php
if (!function_exists('array_chunk')) {
function
array_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;
}
}
?>
8
dead dot screamer at seznam dot cz
15 年前
此函式可用於還原 <?php array_Chunk() ?> 的效果。
<?php
函式 array_Unchunk($array)
{
傳回
call_user_func_array('array_merge',$array);
}

header('Content-Type: text/plain');
$array=陣列(
陣列(
'Black Canyon City',
'Chandler',
'Flagstaff',
'Gilbert',
'Glendale',
'Globe',
),
陣列(
'Mesa',
'Miami',
'Phoenix',
'Peoria',
'Prescott',
'Scottsdale',
),
陣列(
'Sun City',
'Surprise',
'Tempe',
'Tucson',
'Wickenburg',
),
);
var_dump(array_Unchunk($array));
?>

輸出
陣列(17) {
[0]=>
字串(17) "Black Canyon City"
[1]=>
字串(8) "Chandler"
[2]=>
字串(9) "Flagstaff"
[3]=>
字串(7) "Gilbert"
[4]=>
字串(8) "Glendale"
[5]=>
字串(5) "Globe"
[6]=>
字串(4) "Mesa"
[7]=>
字串(5) "Miami"
[8]=>
字串(7) "Phoenix"
[9]=>
字串(6) "Peoria"
[10]=>
字串(8) "Prescott"
[11]=>
字串(10) "Scottsdale"
[12]=>
字串(8) "Sun City"
[13]=>
字串(8) "Surprise"
[14]=>
字串(5) "Tempe"
[15]=>
字串(6) "Tucson"
[16]=>
字串(10) "Wickenburg"
}
5
stratboy
11 年前
嗨,我寫了一個函式,可以根據想要的欄數將一個陣列分割成塊。例如

<?php $a = 陣列(1,2,3,4,5,6,7,8); ?>

目標(例如,3 欄)

<?php
陣列(
陣列(
1,2,3),
陣列(
4,5,6),
陣列(
7,8)
);
?>

<?php
function get_array_columns($array, $columns){

$columns_map = array();
for(
$i=0; $i<$columns; $i++){ $columns_map[] = 0; }//初始化欄位

//建立映射
$count = count($array);
$position = 0;
while(
$count > 0){
$columns_map[$position]++;
$position = ($position < $columns-1) ? ++$position : 0;
$count--;
}

//根據映射分割陣列
$chunked = array();
foreach(
$columns_map as $map){
$chunked[] = array_splice($array,0,$map);
}

return
$chunked;
}
//get_array_columns 結束
?>
1
leon at valkenb dot org
3 年前
找不到現成函式,所以我寫了一個
它會將項目平均分配到固定數量的群組中,同時也會將排序後位置相近的項目保留在相同的輸出群組中。
<?php
function distributed_array_chunk(array $items, int $groups, bool $preserveKeys = false) {

$grouped = [];
$groupsPerItem = $groups / count($items);
$progress = 0.00;

foreach (
$items as $key => $value) {

$index = floor($progress += $groupsPerItem);

if (
$preserveKeys) {
$grouped[$index][$key] = $value;
}
else{
$grouped[$index][] = $value;
}
}

return
$grouped;
}
?>
5
magick dit crow ot gmail dit com
19 年前
這個函數會取陣列中每幾個元素並計算它們的平均值。然後將這些平均值放入一個新的陣列中。它用於平滑數據。例如,假設您有一整年的網站點擊數據,並且您想要按週繪製圖表。那麼可以使用大小為 7 的桶子,並繪製函數輸出的圖表。

function array_bucket($array, $bucket_size) // 桶子過濾器
{
if (!is_array($array)) return false; // 不接受空陣列
$buckets=array_chunk($array,$bucket_size); // 將陣列切成桶子大小的單位
foreach ($buckets as $bucket) $new_array[key($buckets])=array_sum($bucket)/count($bucket);
return $new_array; // 返回新的平滑陣列
}
1
normiridium at gmail dot com
8 年前
按組劃分,允許有多餘元素

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]

更多範例

[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]

範例報告

$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;
1
webmaster at cafe-clope dot net
19 年前
基於相同的語法,可用於製作欄位

<?php
function array_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:固定子項數量 ----
陣列(
[0] => 陣列(
[0] => 1
[1] => 2
)
[1] => 陣列(
[0] => 3
[1] => 4
)

[2] => 陣列(
[0] => 5
)
)

---- array_chunk:固定欄數 ----
陣列(
[0] => 陣列(
[0] => 1
[1] => 2
[2] => 3
)
[1] => 陣列(
[0] => 4
[1] => 5
)
)
-2
magick dit crow ot gmail dit com
19 年前
誤用了 key,沒有達到預期效果。這是一個修正。

function array_bucket($array,$bucket_size)// 分桶過濾器
{
if (!is_array($array)) return false;
$buckets=array_chunk($array,$bucket_size);// 將陣列切成指定大小的桶
$I=0;
foreach ($buckets as $bucket)
{
$new_array[$I++]=array_sum($bucket)/count($bucket);
}
return $new_array;// 返回新陣列
}
-5
匿名
10 年前
無法讓 array_chunk_values() 正常運作,所以最後使用了這個實作方式

<?php
function array_chunk_columns($data, $num_columns) {
$n = count($data);
$per_column = floor($n / $num_columns);
$rest = $n % $num_columns;

$columns = array();
$index = 0;
for (
$i = 0; $i < $num_columns; $i++) {
// 在欄數小於餘數時,為每一欄新增一個額外項目。
$add_rest = ($rest && ($i < $rest)) ? 1 : 0;
$number = $per_column + $add_rest;
$columns[] = array_slice($data, $index, $number);
$index += $number;
}

return
$columns;
}

?>
To Top