2013-03-30 13 views
13

array_chunckはアレイを複数のチャンクに分割することができますが、チャンクの数は要素の数に応じて変化します。私が必要とするのは、配列を常に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)); 

ありがとうございます。

答えて

36

あなたは試すことができます

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

ハハ、うまくいった。私は私のバージョンを投稿するようになり、ラベル付きの変数を既に持っているのを見た。 =] – Jon

+0

私の友人に感謝します! – SnitramSD

+0

ありがとうございました..あなたは歓迎です.... – Baba

3

アレイのサイズを必要なチャンクの数で割って、各チャンクのサイズとして指定します。

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

ありがとうございます。しかし、もし私が5つの要素を持つ配列を持っていて、4つのチャンクに分割したいのであれば、そのコードを使うと、4つではなく5つのチャンクが得られます。最後の2つの配列をいつもマージできますか? – SnitramSD

+1

'' intval'の代わりに['ceil'](http://php.net/manual/en/function.ceil.php)を使用してください。常に丸めてください。 – Emissary

+0

ありがとうございます。 3つのチャンクを使うと、5つの要素を持つ配列から4つのチャンクを取得しようとすると、常に3つのチャンクが得られます。私はintvalをceilに変更しようとしました。 – SnitramSD

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

これは私が書いてよく働くものです。 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

@ 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

スーパーアレイをより小さい数の別々のアレイに分割するソリューションを探している人がいる場合。

$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; 
    } 
} 
関連する問題