PHP排序/平衡多维数组


PHP Sort/Balance multidimensional array

大家好!有人能帮我解决这个问题吗?我有一个由大约15000个元素随机创建的数组,结构如下:

<?php
$array = array(
    array(
        "id" => 134,
        "vertical_id" => 1
    ),   
    array(
        "id" => 52,
        "vertical_id" => 3
    ),   
    array(
        "id" => 334,
        "vertical_id" => 2
    ),   
    array(
        "id" => 123,
        "vertical_id" => 2
    ),   
    array(
        "id" => 153,
        "vertical_id" => 1
    ),   
    array(
        "id" => 176,
        "vertical_id" => 3
    ),   
    ...
);

_

我想对数组进行排序,这样最终的结果是这样的:

<?php
$array = array(
    array(
        "id" => 134,
        "vertical_id" => 1
    ),   
    array(
        "id" => 334,
        "vertical_id" => 2
    ),   
    array(
        "id" => 52,
        "vertical_id" => 3
    ),   
    array(
        "id" => 153,
        "vertical_id" => 1
    ),   
    array(
        "id" => 123,
        "vertical_id" => 2
    ),   
    array(
        "id" => 176,
        "vertical_id" => 3
    ),   
    ...
);

_

因此,如果我做一个array_slice,我"保证"每个垂直方向都有相同数量的元素。

有什么建议吗?

_

首先你的问题不清楚,你想让它们也按id排序吗?id的顺序重要吗?

为了给你一个想法,你需要根据一些逻辑(你想按升序或降序排列哪个键(编写自己的排序函数my_cmp((,并将该函数传递给usort。

例如,

function my_cmp($a, $b) 
    {
        // I'm sorting based on id field in ascending order
        return $a['id'] - $b['id'];
    }
usort($array1, "my_cmp");

对于给定的数组,上面的代码将产生

Array
(
    [0] => Array
        (
            [id] => 52
            [vertical_id] => 3
        )
    [1] => Array
        (
            [id] => 123
            [vertical_id] => 2
        )
    [2] => Array
        (
            [id] => 134
            [vertical_id] => 1
        )
    [3] => Array
        (
            [id] => 153
            [vertical_id] => 1
        )
    [4] => Array
        (
            [id] => 176
            [vertical_id] => 3
        )
    [5] => Array
        (
            [id] => 334
            [vertical_id] => 2
        )
)

只需使用此示例,然后按任意方式对数组进行排序。干杯

首先,您可以将数组转换为具有相同vertical_id的项目组的多维数组。

foreach ($array as $item) {
    $groups[$item['vertical_id']][] = $item;
}

然后按关键字对组进行排序。由于我们使用vertical_id作为外部数组的密钥,这将确保组的顺序正确。

ksort($groups);

然后,您可以在组上重复循环,从组中弹出项目,直到其中一个变为空,然后将其项目添加到新数组中。

while (true) {
    // with each iteration of the foreach loop, you will get an item with vertical_id=1, 
    // vertical_id=2, and vertical_id=3 (in that order, because of the ksort.)
    foreach ($groups as &$group) { 
        // using a reference to $group because otherwise foreach will just make a copy
        if (!$group) break 2; // the 2 means it breaks out of the while loop 
        $sorted_array[] = array_pop($group); // add the item to the sorted array
    }
}

如果每个vertical_id没有相等数量的项目,则不会使用所有项目;它将继续进行,直到用完一个CCD_ 4的项目为止。