2013-03-30 11 views
13

So che array_chunck consente di dividere un array in diversi chuncks, ma il numero di chuncks cambia in base al numero di elementi. Quello che mi serve è dividere sempre la matrice in un numero specifico di matrici come 4 matrici, per esempio.Dividi array in un numero specifico di chuncks

Il seguente codice divide l'array in 3 chunk, due chuncks con 2 elementi ciascuno e 1 chunch con 1 elemento. Quello che vorrei è dividere l'array sempre in 4 chunk, indipendentemente dal numero di elementi totali della matrice, ma sempre cercando di dividere gli elementi in modo uniforme nei chuncks come fa la funzione array_chunck. Come posso realizzare questo? C'è qualche funzione PHP per questo?

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

Grazie.

risposta

36

Si può provare

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

print_r(partition($input_array, 4)); 

uscita

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

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

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

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

) 

Funzione Utilizzato

/** 
* 
* @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; 
} 
+0

Haha, ben fatto. Sono venuto a pubblicare la mia versione e ho visto che hai già avuto variabili meglio etichettate. =] – Jon

+0

Grazie amico mio! – SnitramSD

+0

Grazie ragazzi ... siete i benvenuti .... – Baba

3

Dividere la dimensione dell'array con il numero di blocchi che si desidera e fornire come dimensione di ogni blocco.

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(); 
} 
+0

Grazie. Ma usando quel codice se ho un array con 5 elementi e voglio dividere in 4 chuncks ottengo 5 chunk anziché 4. Forse posso sempre unire gli ultimi due array? – SnitramSD

+1

usa ['ceil'] (http://php.net/manual/en/function.ceil.php) invece di' intval' - vuoi assicurarti di arrotondare sempre. – Emissary

+0

Grazie. L'utilizzo di 3 chuncks funziona ma quando provo a ottenere 4 chuncks da un array con 5 elementi ottengo sempre 3 chuncks. Ho anche provato a cambiare intval a ceil. – SnitramSD

0

Questo dovrebbe funzionare:

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

Questo ciò che scrivo e funziona bene 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; 
} 
1

Un'altra implementazione simile alla funzione di @ 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)) 
0

Se qualcuno è alla ricerca di una soluzione per dividere il super array in un numero inferiore di array separati.

$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; 
    } 
} 
Problemi correlati