如何在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',)

// 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的确切顺序对它进行分块。

解决方法

您可以创建一个为您对数组进行分区的函数。您可以先传入数组,然后传入所需的块。

function partition($arr,...$chunks) {
    $res = [];
    foreach($chunks as $n)
        $res[] = array_splice($arr,$n);
    return $res;
}

$arr = ['a','f','j','r','c','d'];
print_r(partition($arr,2,3,2));

使用array_splice()进行分区,这将就地更改数组。每次调用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

,
  • 浏览您的数据。
  • 将当前块计数长度保留在变量中。
  • 保持递减计数并将所有循环元素添加到临时数组。
  • 如果计数达到0,则添加当前块(如临时数组中的块)作为结果,然后继续进行下一个块。
  • 以下代码也可用于不规则的块大小或数据大小。

代码段:

<?php

$chunks_size = [7,9,11,16,12];
$data = ['a','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_size0,则可以抛出异常,因为遍历所有元素没有意义。