将数组拆分为N个数组 - PHP

Dan*_*ris 25 php arrays split multidimensional-array

我有一个18个值的数组:

$array = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r');
Run Code Online (Sandbox Code Playgroud)

我想将这个数组拆分成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')
)
Run Code Online (Sandbox Code Playgroud)

我的功能似乎不起作用

function array_split($array, $parts){
    return array_chunk($array, ceil(count($array) / $parts));
}

$result = array_split($array, 12);
Run Code Online (Sandbox Code Playgroud)

因为我得到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')
)
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?谢谢.

Bab*_*aba 32

这个简单的功能对你有用:

用法

$array = range("a", "r"); // same as your array
print_r(alternate_chunck($array,12));
Run Code Online (Sandbox Code Playgroud)

产量

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
        )

)
Run Code Online (Sandbox Code Playgroud)

更新以上内容可能对大多数情况没用...这里是另一种类型的块

$array = range("a", "r"); // same as your array
print_r(fill_chunck($array, 5));
Run Code Online (Sandbox Code Playgroud)

产量

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
        )

)
Run Code Online (Sandbox Code Playgroud)

这将确保该组在任何时间都不超过另一个没有限制的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;
}
Run Code Online (Sandbox Code Playgroud)


mic*_*usa 7

请允许我第一个提供基于数学的无循环解决方案。

数学中的神奇之处在于确定哪部分元素属于第一组块,其中所有列都填充在每行中,而哪些元素属于第二组(如果该组甚至应该存在),其中除了最右边的所有列列已满。

让我画出我正在谈论的内容。标记>两个分块数组之间的划分。

$size = 9;        -------------    $size = 9;        -------------
$maxRows = 4;   1 | A , B , C |    $maxRows = 3;     | A , B , C |
$columns = 3;   > |-----------|    $columns = 3;   1 | D , E , F |
$fullRows = 1;    | D , E |        $fullRows = 3;    | G , H , I |
                2 | F , G |                        > -------------
                  | H , I |                        2      n/a
                  ---------


$size = 18;        ---------    $size = 17;       -------------------------------------
$maxRows = 12;     | A , B |    $maxRows = 2;   1 | A , B , C , D , E , F , G , H , I |
$columns = 2;      | C , D |    $columns = 9;   > -------------------------------------
$fullRows = 6;     | E , F |    $fullRows = 1;  2 | J , K , L , M , N , O , P , Q |
                 1 | G , H |                      ---------------------------------
                   | I , J |
                   | K , L |
                 > ---------
                   | M |
                   | N |
                   | O |
                 2 | P |
                   | Q |
                   | R |
                   -----
Run Code Online (Sandbox Code Playgroud)

代码:(演示

function double_chunk($array, $maxRows) {
    $size = count($array);
    $columns = ceil($size / $maxRows);
    $lessOne = $columns - 1;
    $fullRows = $size - $lessOne * $maxRows;
    
    if ($fullRows == $maxRows) {
        return array_chunk($array, $fullRows);  // all columns have full rows, don't splice
    }
    return array_merge(
               array_chunk(
                   array_splice($array, 0, $columns * $fullRows),  // extract first set to chunk
                   $columns
               ),
               array_chunk($array, $lessOne)   // chunk the leftovers
           );
}
var_export(double_chunk(range('a', 'i'), 3));
Run Code Online (Sandbox Code Playgroud)

如果您不介意迭代array_splice()调用,这会更简短,并且可能更容易理解(...也许不是):

代码:(演示

function custom_chunk($array, $maxRows) {
    $size = count($array);
    $columns = ceil($size / $maxRows);
    $lessOne = $columns - 1;
    $fullRows = $size - $lessOne * $maxRows;
    
    for ($i = 0; $i < $maxRows; ++$i) {
        $result[] = array_splice($array, 0, ($i < $fullRows ? $columns : $lessOne));
    }
    return $result;
}
var_export(custom_chunk(range('a', 'r'), 12));
Run Code Online (Sandbox Code Playgroud)


iir*_*iro 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;
}
Run Code Online (Sandbox Code Playgroud)

将返回

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
        )

)
Run Code Online (Sandbox Code Playgroud)