Разделить массив на N массивов - PHP
У меня есть массив из 18 значений:
$array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r');
Я хочу разбить этот массив на 12 разных массивов, чтобы он выглядел так:
array(
0 => array('a', 'b'),
1 => array('c', 'd'),
2 => array('e', 'f'),
3 => array('g', 'h'),
4 => array('i', 'j'),
5 => array('k', 'l'),
6 => array('m'),
7 => array('n'),
8 => array('o'),
9 => array('p'),
10 => array('q'),
11 => array('r')
)
Моя функция не работает
function array_split($array, $parts){
return array_chunk($array, ceil(count($array) / $parts));
}
$result = array_split($array, 12);
потому что я получаю 9 разных массивов вместо 12. Он вернет
array(
0 => array('a', 'b'),
1 => array('c', 'd'),
2 => array('e', 'f'),
3 => array('g', 'h'),
4 => array('i', 'j'),
5 => array('k', 'l'),
6 => array('m', 'n'),
7 => array('o', 'p'),
8 => array('q', 'r')
)
Как мне это сделать? Спасибо.
Ответы
Ответ 1
Эта простая функция будет работать для вас:
Использование
$array = range("a", "r"); // same as your array
print_r(alternate_chunck($array,12));
Выход
Array
(
[0] => Array
(
[0] => a
[1] => b
)
[1] => Array
(
[0] => c
[1] => d
)
[2] => Array
(
[0] => e
[1] => f
)
[3] => Array
(
[0] => g
[1] => h
)
[4] => Array
(
[0] => i
[1] => j
)
[5] => Array
(
[0] => k
[1] => l
)
[6] => Array
(
[0] => m
)
[7] => Array
(
[0] => n
)
[8] => Array
(
[0] => o
)
[9] => Array
(
[0] => p
)
[10] => Array
(
[0] => q
)
[11] => Array
(
[0] => r
)
)
Обновление Вышеупомянутое может быть неприменимо для большинства случаев... вот еще один тип фрагмента
$array = range("a", "r"); // same as your array
print_r(fill_chunck($array, 5));
Выход
Array
(
[0] => Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
[1] => Array
(
[0] => e
[1] => f
[2] => g
[3] => h
)
[2] => Array
(
[0] => i
[1] => j
[2] => k
[3] => l
)
[3] => Array
(
[0] => m
[1] => n
[2] => o
[3] => p
)
[4] => Array
(
[0] => q
[1] => r
)
)
Это позволит убедиться, что группа в данный момент больше, чем 5 элементов, в которых у другого нет ограничений.
Используемая функция
function alternate_chunck($array, $parts) {
$t = 0;
$result = array();
$max = ceil(count($array) / $parts);
foreach(array_chunk($array, $max) as $v) {
if ($t < $parts) {
$result[] = $v;
} else {
foreach($v as $d) {
$result[] = array($d);
}
}
$t += count($v);
}
return $result;
}
function fill_chunck($array, $parts) {
$t = 0;
$result = array_fill(0, $parts - 1, array());
$max = ceil(count($array) / $parts);
foreach($array as $v) {
count($result[$t]) >= $max and $t ++;
$result[$t][] = $v;
}
return $result;
}
Ответ 2
Ты сказал:
У меня есть 13 категорий в БД, которые я хочу сгруппировать в 12 массивы. Если есть более 12 категорий, которые есть, то вставьте оставшиеся значения, начиная с первого массива.
Это работает, но что должно быть результатом, если у вас есть больше элементов во входном массиве?
$array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm');
function s($array, $am) {
$r = array();
$d = count($array) - $am+1;
foreach ($array as $k => $v) {
if ($k < $d) {
if (!isset($r[0])) {
$r[0] = array($v);
} else {
$r[0] = array_merge($r[0], array($v));
}
} else {
$r[] = array($v);
}
}
return $r;
}
вернет
Array
(
[0] => Array
(
[0] => a
[1] => b
)
[1] => Array
(
[0] => c
)
[2] => Array
(
[0] => d
)
[3] => Array
(
[0] => e
)
[4] => Array
(
[0] => f
)
[5] => Array
(
[0] => g
)
[6] => Array
(
[0] => h
)
[7] => Array
(
[0] => i
)
[8] => Array
(
[0] => j
)
[9] => Array
(
[0] => k
)
[10] => Array
(
[0] => l
)
[11] => Array
(
[0] => m
)
)
Ответ 3
Вы можете использовать array_chunk
и array_merge
для этой проблемы:
<?php
$array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r');
$chunked_arr = array_chunk($array,12);
$j = 0;
for($i = 0; $i < count($chunked_arr[0]); $i++){
if(!($i % 2 == 0)){
$first_combined[$j][$i % 2] = $chunked_arr[0][$i];
$j++;
} else {
$first_combined[$j][$i % 2] = $chunked_arr[0][$i];
}
}
$merged_array = array_merge($first_combined, $chunked_arr[1]);
echo '<pre>';
print_r($merged_array);
?>
И вы получите результат следующим образом:
Array
(
[0] => Array
(
[0] => a
[1] => b
)
[1] => Array
(
[0] => c
[1] => d
)
[2] => Array
(
[0] => e
[1] => f
)
[3] => Array
(
[0] => g
[1] => h
)
[4] => Array
(
[0] => i
[1] => j
)
[5] => Array
(
[0] => k
[1] => l
)
[6] => m
[7] => n
[8] => o
[9] => p
[10] => q
[11] => r
)
Это то, что вы хотите.
Live Demo Here " >
Ответ 4
ceil(count($array) / $parts)
даст 2, поэтому каждый массив заполняется двумя предметами, пока у вас не останется 2 предметов. следовательно, последний имеет 1 элемент. это будет работать, когда у вас есть огромное количество данных в массиве, но не так много, когда у вас есть небольшой объем данных.
Ответ 5
То, что вы описываете, - это не то, для чего создан array_chunk. Вы должны использовать array_slice() и вычислить, какие части массива вы хотите получить в виде новых массивов. (и используйте цикл for для итерации по вашему исходному массиву)
Update:
Некоторые вычисления, которые могут вам помочь:
minimum_fill = floor(array_length / nr_buckets)
bigger_buckets_amount = array_length - (minimum_fill / nr_buckets)
Алгоритм заполнения ковшей:
Переверните массив, заполните первое количество bigger_buckets_amount
ведер с помощью (minimum_fill + 1)
, заполните остальные ведра minimum_fill
Ответ 6
Скомпилируйте это и посмотрите, не делает ли это для вас:
<?php
$array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm');
$sliceA = 0;
$sliceB = 2;
$final = array(array_slice($array, $sliceA, $sliceB));
for ($i=$sliceB; $i<sizeof($array); $i++)
{
$final[$sliceB-1] = array($array[$i]);
$sliceB++;
}
var_dump($final);
Ответ 7
<?php
$array = range('a','r');
$length = array(2=>6,1=>6); // 2=>6 means -- first six elements of new array will have 2 elements each and then, 1=>6 means -- next six elements of new array will have 1 element each
$target = array(); // or use [] in PHP 5.4
foreach($length as $i=>$times) {
while($times>0){
$target[] = array_splice($array, 0, $i);
$times--;
}
}
print_r($target);
?>
Ответ 8
Это сделает это за вас!
Здесь я использовал функцию smallify(), чтобы разбить массив из 15 элементов на 3 массива по 5 элементов.
<?php
$bigArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
echo ("<pre>");
print_r (smallify($bigArray, 3));
echo ("<pre/>");
function smallify($arr, $numberOfSlices){
$sliceLength = sizeof($arr) /$numberOfSlices;
for($i=1; $i<=$numberOfSlices; $i++){
$arr1 = array_chunk($arr, $sliceLength*$i);
return $arr1;
unset($arr1);
}
}
?>
Результат
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
[1] => Array
(
[0] => 6
[1] => 7
[2] => 8
[3] => 9
[4] => 10
)
[2] => Array
(
[0] => 11
[1] => 12
[2] => 13
[3] => 14
[4] => 15
)
)
Ответ 9
Я считаю, что проблема в том, что вы используете размер 2 при использовании array_chunk. Это гарантирует, что каждый созданный новый массив имеет по возможности два элемента. Это заставляет функцию запускать переменные, чтобы поместить в новые массивы к моменту, когда вы доберетесь до 10. Вы можете найти руководство по функции здесь http://php.net/manual/en/function.array-chunk.php Надеюсь, что это поможет