Как разбить массив на части в PHP

Всем привет, я снова с Вами дорогие друзья. В сегодняшнем уроке я расскажу Вам, как разбить массив на части в PHP. Для реализации данной задачи нам потребуется функция, под названием array_chunk. Именно она поможем нам в реализации нашей задачи.
Данная функция разбивает массив на составные части. При этом мы получаем двумерный массив. Функция может принимать три параметра, первый из которых отвечает за массив, который мы будем разбивать. Второй за, количество элементов, которые будут находиться в каждом подмассиве. Если у нас в массиве находится восемь элементов, и в качестве второго параметра мы укажем цифру три, то получим в результате три внутренних массива, в двух будут находиться по три элемента и в последнем два элемента, при этом индекс массивов будет начинаться с нуля.
Однако при необходимости Вы можете указать третьим параметром булево значение true, и тогда ключи исходного массива будут сохранены, но следует помнить, что по умолчанию данный параметр принимает значение false.
А теперь для усвоения информации рассмотрим все на примере:
$array = array( «one» , «two» , «three» , «four» , «five» , «six» , «seven» , «eight» );
$array_result = array_chunk( $array , 3 );
print_r ($array_result) ;
?>
?php>
Мы создали массив со значениями, и применили к нему изучаемую функцию, в которую добавили два параметра. Исходный массив, и количество элементов, которые будут находиться в каждом внутреннем массиве. В результате получили вот такой результат:

Однако если бы массив был изначально ассоциативным и мы задали третий параметр — true, то ключи были бы сохранены, и мы могли бы спокойно к ним обращаться. Считаю, что приводить этот пример не нужно, а Вы самостоятельно при необходимости сможете разобраться. И на этом мы смело можем завершать тему, ведь мы с Вами уже научились разбивать массивы на части. До скорого!
5 последних свежих статей:

Методы alert, prompt, confirm в JavaScript
И снова я приветствую Вас в очередной теме посвященной языку JavaScript, в которой мы разберем методы alert, prompt, confrim.

Конструкция switch-case в JavaScript
Всем привет, сегодня мы рассмотрим с Вами конструкцию switch-case в языке JavaScript.

Всплывающая подсказка на CSS
Здравствуйте дорогие друзья, сегодня мы с Вами изучим еще одну тему посвященную языку CSS. И научимся реализовывать всплывающие подсказки на CSS.

Псевдокласс target в CSS
Сегодня мы рассмотрим еще одну возможность, которую предоставляет нам CSS3, а именно поговорим о псевдоклассе target, для чего он нам может быть нужен, и рассмотрим один из самых популярных способов его применения.

Как вставить видео с YouTube
Довольно часто Вы видите на различных ресурсах видео, которое хранится на сервисе youtube, но каким-то образом его можно воспроизвести на данном сайте. Об этом сегодня пойдет речь, и я расскажу Вам, как вставить видео с YouTube.
Разделить один массив на два
Задача такая — есть массив который нужно разделить на два массива Все элементы которые попадут в массивы должны быть случайные. $list — Базовый массив $red_team — первый массив $blue_team — второй массив Ниже приведен не рабочий код
$list = array("foo", "bar", "hallo", "world"); if (count($list) % 2 == 0) < $rand_list = array_rand($list, count($list) / 2); for ($i = 0; $i >
На что сервер ответил так
NOTICE Undefined variable: list on line number 9 NOTICE Undefined variable: list on line number 10 NOTICE Undefined variable: list on line number 11 NOTICE Undefined offset: 2 on line number 9 NOTICE Undefined variable: list on line number 9 NOTICE Undefined offset: 2 on line number 10 NOTICE Undefined variable: list on line number 10 NOTICE Undefined variable: list on line number 11
Отслеживать
задан 17 ноя 2017 в 12:38
Саша Адамов Саша Адамов
97 1 1 серебряный знак 11 11 бронзовых знаков
А зачем вы делаете unset ($list); ? Буквально на второй итерации цикла он, естественно, уже будет undefined
17 ноя 2017 в 12:42
shuffle($list); list($red, $blue) = array_chunk($list, ceil(count($list)/2));
17 ноя 2017 в 12:45
@rjhdby unset($list[$rand_list[$i]]); удаляет случайный элемент массива а потом там остается лишние элементы которые я перевожу в $blue_team. Дальше я не вижу смысла в существования $list
17 ноя 2017 в 12:45
@Мелкий очень интересный код в котором я ничего не понял ;0 . На исходе точно будет два массива $red и $blue
17 ноя 2017 в 12:48
два массива из случайных элементов начального списка, нечёное число элементов даст +1 элемент в первой группе. Предусловие забыл, count($list) >= 2 . На массиве из 1 элемента замечание будет всё-таки.
17 ноя 2017 в 12:51
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Не вдаваясь в разбирательства с исходным кодом, задачу можно решить буквально в 2 строки:
shuffle($list); list($red, $blue) = array_chunk($list, ceil(count($list)/2));
shuffle перемешает элементы массива случайным образом, array_chunk распилит на части указанной величины. ceil от половины массива даст в результате распиливание массива ровно пополам с переносом нечётного элемента в первый список.
Разбиение будет выполнено с ошибкой для списка из 0 или 1 элемента. Но это очевидно должно проверяться сильно раньше по логике приложения. Делить одного игрока на две команды (очевидно из наименований переменных) — штука странная.
Или простым флагом перекладывать в нужные массив
shuffle($list); $red = $blue = []; $isOdd = true; foreach ($list as $el) < if ($isOdd) < $red[] = $el; >else < $blue[] = $el; >$isOdd = !$isOdd; >
Или взять пару array_slice
shuffle($list); $slice = floor(count($list)/2); // можно ceil, разница только на нечётном объёме $list $red = array_slice($list, 0, $slice); $blue = array_slice($list, $slice);
Вторые два варианта корректно обрабатывают и пустые списки тоже.
В общем, shuffle для не криптостойкого перемешивания более чем достаточно, а распилить затем неупорядоченный массив на две части можно разными способами.
array_chunk
Разбивает массив на несколько массивов размером в length элементов. Последний массив из полученных может содержать меньшее количество значений, чем указано в length .
Список параметров
Размер каждой части
Если установлено в true , ключи оригинального массива будут сохранены. По умолчанию установлено в false , что переиндексирует каждую часть с числовыми ключами
Возвращаемые значения
Возвращает многомерный массив с числовыми индексами, начинающимися с нуля, каждый элемент которого содержит length элементов из оригинального массива.
Ошибки
Если параметр length меньше 1 , будет выброшено исключение ValueError .
Список изменений
| Версия | Описание |
|---|---|
| 8.0.0 | Если параметр length меньше 1 , будет выброшено исключение ValueError ; ранее, вместо этого выдавалась ошибка уровня E_WARNING и функция возвращала null . |
Примеры
Пример #1 Пример использования array_chunk()
$input_array = array( ‘a’ , ‘b’ , ‘c’ , ‘d’ , ‘e’ );
print_r ( array_chunk ( $input_array , 2 ));
print_r ( array_chunk ( $input_array , 2 , true ));
?>?php
Результат выполнения данного примера:
Array ( [0] => Array ( [0] => a [1] => b ) [1] => Array ( [0] => c [1] => d ) [2] => Array ( [0] => e ) ) Array ( [0] => Array ( [0] => a [1] => b ) [1] => Array ( [2] => c [3] => d ) [2] => Array ( [4] => e ) )
Смотрите также
- array_slice() — Выбирает срез массива
User Contributed Notes 20 notes
16 years ago
Tried to use an example below (#56022) for array_chunk_fixed that would «partition» or divide an array into a desired number of split lists — a useful procedure for «chunking» up objects or text items into columns, or partitioning any type of data resource. However, there seems to be a flaw with array_chunk_fixed — for instance, try it with a nine item list and with four partitions. It results in 3 entries with 3 items, then a blank array.
So, here is the output of my own dabbling on the matter:
function partition ( $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 ;
>
$citylist = array( «Black Canyon City» , «Chandler» , «Flagstaff» , «Gilbert» , «Glendale» , «Globe» , «Mesa» , «Miami» ,
«Phoenix» , «Peoria» , «Prescott» , «Scottsdale» , «Sun City» , «Surprise» , «Tempe» , «Tucson» , «Wickenburg» );
print_r ( partition ( $citylist , 3 ) );
?>
Array
(
[0] => Array
(
[0] => Black Canyon City
[1] => Chandler
[2] => Flagstaff
[3] => Gilbert
[4] => Glendale
[5] => Globe
)
[1] => Array
(
[0] => Mesa
[1] => Miami
[2] => Phoenix
[3] => Peoria
[4] => Prescott
[5] => Scottsdale
)
[2] => Array
(
[0] => Sun City
[1] => Surprise
[2] => Tempe
[3] => Tucson
[4] => Wickenburg
)
Метод split
Метод split разбивает строки в массив по указанному в первом параметре разделителю. Если он не задан — вернется вся строка. Если он задан как пустые кавычки, то каждый символ строки попадет в отдельный элемент массива. Вторым необязательным параметром можно указать максимальное количество элементов в получившемся массиве.
Синтаксис
строка.split([разделитель], [максимальное количество элементов]);
Пример
Пусть дана некоторая строка с дефисами. Давайте разобьем эту строку в массив по разделителю ‘-‘ :
let str = ‘ab-cd-ef’; let arr = str.split(‘-‘); console.log(arr);
Результат выполнения кода:
Пример
Давайте опять разобьем строку по разделителю ‘-‘ , однако вторым параметром укажем максимальное количество элементов в получившемся массиве, например, 2 . В этом случае в массив запишется только 2 элемента:
let str = ‘ab-cd-ef’; let arr = str.split(‘-‘, 2); console.log(arr);
Результат выполнения кода:
Пример
Давайте каждый символ строки запишем в отдельный элемент массива:
let str = ‘abcde’; let arr = str.split(»); console.log(arr);
Результат выполнения кода:
Пример
Давайте первые 3 символа строки запишем в отдельные элементы массива:
let str = ‘abcde’; let arr = str.split(», 3); console.log(arr);
Результат выполнения кода:
Пример
Давайте с помощью split разобьем строку с числами. Обратите внимание на то, что в результате получится массив строк, а не массив чисел:
let str = ‘12345’; let arr = str.split(»); console.log(arr);
Результат выполнения кода:
Пример . Применение
Давайте перевернем символы строки в обратном порядке. Для этого разобьем строку в массив с помощью split по разделителю » (это разместит каждый символ строки в отдельный элемент массива), перевернем этот массив с помощью reverse и затем сольем перевернутый массив обратно с помощью join :
let str = ‘123456789’; let arr1 = str.split(»); let arr2 = arr1.reverse(); let res = arr2.join(»); console.log(res);
Результат выполнения кода:
Пример . Применение
Упростим решение предыдущей задачи — сольем все команды в цепочку:
let str = ‘123456789’; let res = str.split(»).reverse().join(»); console.log(res);
Результат выполнения кода:
Пример . Применение
Дана строка с цифрами. Найдем сумму цифр из этой строки. Для этого разобьем строку в массив, а затем переберем этот массив и найдем его сумму. Нас ждет подвох: split возвращает строки, поэтому при суммировании преобразуем эти цифры-строки в настоящие числа с помощью Number :
let str = ‘12345’; let arr = str.split(»); let sum = 0; for (let i = 0; i < arr.length; i++) < sum += Number(arr[i]); >console.log(sum);
Результат выполнения кода:
Пример . Применение
Дано число. Давайте запишем каждую цифру этого числа в отдельный элемент массива. Тут есть подвох — split применяется только к строкам, а у нас число. Преобразуем вначале число к строке с помощью String , а затем применим split :
let num = 12345; let str = String(num); let arr = str.split(»); console.log(arr);
Результат выполнения кода:
Смотрите также
- метод join ,
который сливает элементы массива в строку - метод split ,
который разбивает строку по регулярке - метод reverse ,
который изменяет порядок элементов в массиве на обратный - свойство length ,
которое позволяет узнать длину строки