как разделить массив на две равные части с помощью php

#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 новых массива и не хотите, чтобы какие-либо элементы удалялись из исходного массива.