Разделить массив на определенное количество символов

Я знаю, что array_chunck позволяет разделить массив на несколько chuncks, но количество chuncks изменяется в зависимости от количества элементов. Мне нужно всегда разбивать массив на определенное количество массивов, например, на 4 массива.

Следующий код разбивает массив на 3 строки, два chancks с 2 элементами каждый и 1 chunch с 1 элементом. Я бы хотел разделить массив всегда на 4 строки, независимо от количества общих элементов, которые имеет массив, но всегда пытается разделить элементы равномерно в chuncks, как это делает функция 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)); 

Спасибо.

Можешь попробовать

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

Разделите размер массива с количеством блоков, которые вы хотите, и поставьте его как размер каждого куска.

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

Другая реализация аналогична функции partition() @ 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)) 

Это должно работать:

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

Это то, что я пишу и хорошо работаю 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; } 

Если кто-то ищет решение для деления супер-массива на меньшее количество отдельных массивов.

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