web-dev-qa-db-fra.com

Fractionner le tableau en un nombre spécifique de morceaux

Je sais que array_chunck permet de diviser un tableau en plusieurs tronçons, mais le nombre de tronçons change en fonction du nombre d'éléments. Ce dont j'ai besoin est de toujours diviser le tableau en un nombre spécifique de tableaux, comme 4 tableaux par exemple.

Le code suivant divise le tableau en 3 tronçons, 2 tronçons avec 2 éléments chacun et 1 tronçon avec 1 élément. Ce que j'aimerais, c'est scinder le tableau en 4 tronçons, quel que soit le nombre total d'éléments contenus dans le tableau, mais en essayant toujours de diviser les éléments de manière uniforme dans les tronçons, comme le fait la fonction array_chunck. Comment puis-je accomplir cela? Y at-il une fonction php pour cela?

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

Je vous remercie.

14
SnitramSD

Tu peux essayer

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

print_r(partition($input_array, 4));

Sortie

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

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

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

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

)

Fonction utilisé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;
}
41
Baba

Divisez la taille de la matrice par le nombre de morceaux de votre choix et indiquez-le comme la taille de chaque morceau.

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

    return array();
}
3
Jakob Pogulis

Une autre implémentation similaire à la fonction partition() de @ Baba. 

// 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)) 
1
Jamie Chong

Si quelqu'un recherche une solution pour diviser le super tableau en un plus petit nombre de tableaux distincts. 

$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;
    }
}
0
Sarthak Singhal

Cela devrait fonctionner:

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>';
0
MichaelRushton

C'est ce que j'écris et fonctionne bien 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;
}
0