Разделить массив на 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')
)

как бы я это сделал? Спасибо.

9 ответов


эта простая функция будет работать для вас:

использование

$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 элементов, где другой не имеет ограничений


Вы сказали:

у меня есть 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
        )

)

можно использовать 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
)

это именно то, что вы хотите.

Демо>>Тут


ceil(count($array) / $parts) даст 2, поэтому каждый массив заполняется 2 элементами, пока у вас не останется 2 элемента. следовательно, последний имеет 1 пункт. это будет работать, когда у вас есть огромный объем данных в массиве, но не так много, когда у вас есть небольшой объем данных.


то, что вы описываете, не то, для чего создан array_chunk. Вы должны использовать array_slice () и вычислить себя, какие части массива вы хотите в конечном итоге в качестве новых массивов. (и используйте цикл for для итерации по исходному массиву)

обновление:

некоторые расчеты, которые могли бы помочь вам:

minimum_fill = floor(array_length / nr_buckets)
bigger_buckets_amount = array_length - (minimum_fill / nr_buckets)

алгоритм заполнения ведер: Петля над массивом, заполнить первый bigger_buckets_amount количество ведер с (minimum_fill + 1) заполните остальные ведра с minimum_fill


скомпилируйте это и посмотрите, делает ли это для вас:

<?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);

<?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);
?>

это сделает это за вас!
Здесь я использовал свою функцию 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
    )

)

Я считаю, что проблема в том, что вы используете размер 2 при использовании array_chunk. Это гарантирует, что каждый новый созданный массив содержит два элемента, если это возможно. Это заставляет функцию запускать переменные для ввода в новые массивы к моменту получения 10. Вы можете найти Руководство по функции здесь http://php.net/manual/en/function.array-chunk.php Надеюсь, это поможет