22

配列をいくつかのチャンクに分割できることは知っていarray_chunk()ますが、要素の数に応じてチャンクの数が変わります。必要なのは、配列を常に特定の数の配列 (たとえば 4 つの配列など) に分割することです。

次のコードは、配列を 3 つのチャンクに分割します。それぞれ 2 つの要素を持つ 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

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 に答える
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

誰かがスーパーアレイをより少数の個別のアレイに分割するソリューションを探している場合。

$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 に答える