#php #arrays #slice
#php #массивы #разрезать
Вопрос:
как разделить массив на две равные части с помощью array_slice() в PHP?
Это мое требование:
Первый массив содержит: 0-1200
Второй массив содержит: 1200-end
Ответ №1:
Из документации для array_slice все, что вам нужно сделать, это указать array_slice
смещение и длину.
В вашем случае:
$firsthalf = array_slice($original, 0, 1200);
$secondhalf = array_slice($original, 1200);
Другими словами, этот код говорит array_slice
:
take the first 1200 records;
then, take all the records starting at index 1200;
Поскольку индекс 1200 равен элементу 1201, это должно быть то, что вам нужно.
Ответ №2:
$quantity = count($original_collection);
$collection1 = array_slice($original_collection, 0, intval($quantity / 2), true);
$collection2 = array_diff_key($original_collection, $collection1);
Комментарии:
1. Я знаю, что он указал числа, но этот вариант лучше, поскольку он фактически делит любой диапазон на 2, а не только на 2400 от владельца вопроса. Это отвечает на заголовок этого вопроса.
2. Итак, в чем преимущество использования обоих
array_slice
иarray_diff_key
вместо того, чтобы использоватьarray_splice
только один раз?
Ответ №3:
$array1 = array_slice($array, 0, 1199);
$array2 = array_slice($array, 1200);
Ответ №4:
Я думаю, array_chunk
было бы проще, тем более что вам не нужно знать, сколько элементов в массиве.
array array_chunk ( array $input , int $size [, bool $preserve_keys = false ] )
<?php
$input_array = array('a', 'b', 'c', 'd', 'e');
$size = ceil(count($input_array)/2));
print_r(array_chunk($input_array, $size));
print_r(array_chunk($input_array, $size, true));
?>
Комментарии:
1. У вас правильная идея, но это разбило бы массив на множество массивов длиной 2, а не разделило бы массив пополам. Вместо этого измените $size на половину длины массива (используя
floor(count($input)/2)
), чтобы в результате получилось два массива, содержащих половину записей.2. Это хорошая идея, но не сработает в случае, когда размер массива будет четным числом. Он разделит массив на 3 части: первые два массива будут одинакового размера, а последним будет массив с одним элементом.
Ответ №5:
$array1 = array_slice($input, 0, 1200);
$array2 = array_slice($input, 1200);
Комментарии:
1. Разве это не должно быть 0-1201 и 1201?
2. @deceze @webarto Я так не думаю. Я обновил свой ответ до того, каким, по моему мнению, он должен быть. Сначала,
take 1200 records
затемstart at record 1200
, которая на самом деле является записью 1201.3. @rock Оператору требуется «запись 0-1200» (которая равна 1201 записи) и «запись 1200 — end» (которая начиналась бы со смещения 1201)… Я думаю, что операция отключена в этой спецификации, так что не беспокойтесь. 😉
4. @deceze, что-то вроде этого 🙂
Ответ №6:
Как насчет:
$array1; // your original array with all records
$array2 = array_splice($array1, ceil(count($array1)/2));
// or per your requirement of 1200 in the first array:
$array2 = array_splice($array1, 1200);
Это просто удаляет вторую половину элементов из вашего исходного массива и помещает их во второй массив. Не уверен, в чем преимущество использования array_slice
дважды, как упоминалось в других ответах, если только вы не хотите 2 новых массива и не хотите, чтобы какие-либо элементы удалялись из исходного массива.