22

我知道这array_chunk()允许将数组拆分为几个块,但是块的数量会根据元素的数量而变化。我需要的是始终将数组拆分为特定数量的数组,例如 4 个数组。

以下代码将数组拆分为 3 个块,两个块每个包含 2 个元素,1 个块包含 1 个元素。我想要的是将数组始终拆分为 4 个块,无论数组具有的总元素数量如何,但始终尝试像 array_chunck 函数一样将元素均匀地划分在块中。我怎样才能做到这一点?是否有任何 PHP 功能?

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

谢谢你。

4

7 回答 7

55

你可以试试

$input_array = array(
        'a',
        'b',
        'c',
        'd',
        'e'
);

print_r(partition($input_array, 4));

输出

Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

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

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

    [3] => Array
        (
            [0] => e
        )

)

使用的功能

/**
 * 
 * @param Array $list
 * @param int $p
 * @return multitype:multitype:
 * @link http://www.php.net/manual/en/function.array-chunk.php#75022
 */
function partition(Array $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;
}
于 2013-03-30T20:40:49.983 回答
5

将数组的大小除以您想要的块数,并将其作为每个块的大小。

function array_chunks_fixed($input_array, $chunks=3 /*Default chunk size 3*/) {
    if (sizeof($input_array) > 0) {        
        return array_chunk($input_array, intval(ceil(sizeof($input_array) / $chunks)));
    }

    return array();
}

并这样称呼它:

array_chunks_fixed($myarray, 2); //override the default number of '3'
于 2013-03-30T20:28:32.527 回答
5

这里有很多复杂的答案。我将发布我的简单解决方案:)

function splitMyArray(array $input_array, int $size, $preserve_keys = null): array
{
    $nr = (int)ceil(count($input_array) / $size);

    if ($nr > 0) {
        return array_chunk($input_array, $nr, $preserve_keys);
    }

    return $input_array;
}

用法:

$newArray = splitMyArray($my_array, 3);

更多细节在这里: https ://zerowp.com/split-php-array-in-x-equal-number-of-elements/

于 2019-08-20T13:09:45.893 回答
1

这就是我写的很好用 print_r(array_divide($input,3));

function array_divide($array, $segmentCount) {
    $dataCount = count($array);
    if ($dataCount == 0) return false;
    $segmentLimit = 1;
    //if($segmentCount > $segmentLimit)
      //  $segmentLimit = $segmentCount;
    $outputArray = array();
    $i = 0;
    while($dataCount >= $segmentLimit) {

        if( $segmentCount  == $i)
            $i = 0;
        if(!array_key_exists($i, $outputArray))
            $outputArray[$i] = array();
        $outputArray[$i][] =  array_splice($array,0,$segmentLimit)[0] ;
        $dataCount = count($array);



       $i++;
    }
    if($dataCount > 0) $outputArray[] = $array;

    return $outputArray;
}
于 2014-04-04T11:29:36.937 回答
1

另一个类似于@Baba 的partition()功能的实现。

// http://php.net/manual/en/function.array-slice.php#94138
// split the given array into n number of pieces 
function array_split($array, $pieces=2) 
{   
    if ($pieces < 2) 
        return array($array); 
    $newCount = ceil(count($array)/$pieces); 
    $a = array_slice($array, 0, $newCount); 
    $b = array_split(array_slice($array, $newCount), $pieces-1); 
    return array_merge(array($a),$b); 
} 

// Examples: 
$a = array(1,2,3,4,5,6,7,8,9,10); 
array_split($a, 2);    // array(array(1,2,3,4,5), array(6,7,8,9,10)) 
array_split($a, 3);    // array(array(1,2,3,4), array(5,6,7), array(8,9,10)) 
array_split($a, 4);    // array(array(1,2,3), array(4,5,6), array(7,8), array(9,10)) 
于 2014-08-14T18:09:23.033 回答
0

这应该有效:

function getChunks(array $array, $chunks)
{

  if (count($array) < $chunks)
  {
    return array_chunk($array, 1);
  }

  $new_array = array();

  for ($i = 0, $n = floor(count($array) / $chunks); $i < $chunks; ++$i)
  {

    $slice = $i == $chunks - 1 ? array_slice($array, $i * $n) : array_slice($array, $i * $n, $n);

    $new_array[] = $slice;

  }

  return $new_array;

}

$input_array = array('a', 'b', 'c', 'd', 'e');

echo '<pre>' . print_r(getChunks($input_array, 4), TRUE) . '</pre>';
于 2013-03-30T20:43:08.210 回答
0

如果有人正在寻找将超级数组划分为较少数量的单独数组的解决方案。

$count = count($appArray); //$appArray contains all elements
$repoCount = 3; //No. of parts to divide

$n = floor($count/$repoCount);
$rem = $count % $repoCount;
$j=1;

while($j <= $repoCount){

   ${"arr_" . $j} = array();
   $j++;

}

$j=0;
$k=1;

for($i=0; $i < $count; $i++){

    if($j < $n){

        array_push(${"arr_" . $k}, $appArray[$i]);
        $j++;

    }
    else if($k < $repoCount){

        $j=0;
        $k++;
        --$i;

    }
    if($i >= ($count-$rem)){

        $k=1;

        for($j=0; $j < $rem; $j++, $i++, $k++){

            array_push(${"arr_" . $k},$appArray[$i]);

        }
        break;
    }
}
于 2015-11-27T17:24:43.720 回答