如何将数组划分为 php 中的特定大小?
How can I partition an array into specific sizes in php?
我有一组数字定义每个块的大小。我将如何根据这些大小对数组进行分块?
例如,假设我有块大小 2、3 和 2,和一个大小为 7 的输入数组:
array(
0 => 'a',
1 => 'f',
2 => 'j',
3 => 'r',
4 => 'c',
5 => 'j',
6 => 'd',
)
我希望将上述数组中的前 2 个元素分块到它们自己的数组中,然后将下一个 3 元素分块到他们自己的数组,最后一个 2 被分块到他们自己的数组中。这将产生以下输出:
// first 2 elements:
array(
0 => 'a',
1 => 'f',
)
// next 3 elements:
array(
0 => 'j',
1 => 'r',
2 => 'c',
)
// last 2 elements:
array(
0 => 'j',
1 => 'd',
)
我的实际输入数组有 64 个元素,我想按照大小 7、9、11、16、9 和 12 的确切顺序对它进行分块。
- 遍历你的数据。
- 将当前块计数长度保存在一个变量中。
- 保持递减计数并将所有循环元素添加到临时数组。
- 如果计数达到
0
,将当前块(如在临时数组中)添加到结果中并移动到下一个块。
- 下面的代码也适用于不规则的块大小或数据大小。
片段:
<?php
$chunks_size = [7,9,11,16,9,12];
$data = ['a','f','j', 'r', 'c', 'j','d'];
$result = [];
$chunk_ptr = 0;
$count = $chunks_size[$chunk_ptr];
$temp = [];
foreach($data as $index => $val){
$count--;
$temp[] = $val;
if($count == 0){
$result[] = $temp;
$temp = [];
if(++$chunk_ptr == count($chunks_size)){
$count = PHP_INT_MAX; // Set it to a higher value or any negative value(all remaining goes into the last chunk)
}else{
$count = $chunks_size[$chunk_ptr];
}
}
}
if(count($temp) > 0) $result[] = $temp;
print_r($result);
注意:如果$chunks_size
是0
,你可以抛出异常,因为遍历所有元素没有意义。
您可以创建一个函数来为您对数组进行分区。可以先传入数组,再传你需要的chunk。
function partition($arr, ...$chunks) {
$res = [];
foreach($chunks as $n)
$res[] = array_splice($arr, 0, $n);
return $res;
}
$arr = ['a', 'f', 'j', 'r', 'c', 'j', 'd'];
print_r(partition($arr, 2, 3, 2));
使用 array_splice()
进行分区,这将更改数组 in-place。每次调用 array_splice()
时,您都可以从数组中获取第一个 $n
元素并将它们推入结果数组。当您获取给定块的第一个 $n
个元素时,您也将它们从数组中删除。
输出:
Array
(
[0] => Array
(
[0] => a
[1] => f
)
[1] => Array
(
[0] => j
[1] => r
[2] => c
)
[2] => Array
(
[0] => j
[1] => d
)
)
查看实例 here
我有一组数字定义每个块的大小。我将如何根据这些大小对数组进行分块?
例如,假设我有块大小 2、3 和 2,和一个大小为 7 的输入数组:
array(
0 => 'a',
1 => 'f',
2 => 'j',
3 => 'r',
4 => 'c',
5 => 'j',
6 => 'd',
)
我希望将上述数组中的前 2 个元素分块到它们自己的数组中,然后将下一个 3 元素分块到他们自己的数组,最后一个 2 被分块到他们自己的数组中。这将产生以下输出:
// first 2 elements:
array(
0 => 'a',
1 => 'f',
)
// next 3 elements:
array(
0 => 'j',
1 => 'r',
2 => 'c',
)
// last 2 elements:
array(
0 => 'j',
1 => 'd',
)
我的实际输入数组有 64 个元素,我想按照大小 7、9、11、16、9 和 12 的确切顺序对它进行分块。
- 遍历你的数据。
- 将当前块计数长度保存在一个变量中。
- 保持递减计数并将所有循环元素添加到临时数组。
- 如果计数达到
0
,将当前块(如在临时数组中)添加到结果中并移动到下一个块。 - 下面的代码也适用于不规则的块大小或数据大小。
片段:
<?php
$chunks_size = [7,9,11,16,9,12];
$data = ['a','f','j', 'r', 'c', 'j','d'];
$result = [];
$chunk_ptr = 0;
$count = $chunks_size[$chunk_ptr];
$temp = [];
foreach($data as $index => $val){
$count--;
$temp[] = $val;
if($count == 0){
$result[] = $temp;
$temp = [];
if(++$chunk_ptr == count($chunks_size)){
$count = PHP_INT_MAX; // Set it to a higher value or any negative value(all remaining goes into the last chunk)
}else{
$count = $chunks_size[$chunk_ptr];
}
}
}
if(count($temp) > 0) $result[] = $temp;
print_r($result);
注意:如果$chunks_size
是0
,你可以抛出异常,因为遍历所有元素没有意义。
您可以创建一个函数来为您对数组进行分区。可以先传入数组,再传你需要的chunk。
function partition($arr, ...$chunks) {
$res = [];
foreach($chunks as $n)
$res[] = array_splice($arr, 0, $n);
return $res;
}
$arr = ['a', 'f', 'j', 'r', 'c', 'j', 'd'];
print_r(partition($arr, 2, 3, 2));
使用 array_splice()
进行分区,这将更改数组 in-place。每次调用 array_splice()
时,您都可以从数组中获取第一个 $n
元素并将它们推入结果数组。当您获取给定块的第一个 $n
个元素时,您也将它们从数组中删除。
输出:
Array
(
[0] => Array
(
[0] => a
[1] => f
)
[1] => Array
(
[0] => j
[1] => r
[2] => c
)
[2] => Array
(
[0] => j
[1] => d
)
)
查看实例 here