首页 > 解决方案 > Laravel 从集合中提取元素,并对其进行排序

问题描述

我有一个这样的集合:

+----------+----------+
| user_id  |  city_id |
+----------+----------+
|        1 |        1 |
|        2 |        1 |
|      ... |      ... |
|      901 |        2 |
|      902 |        2 |
|      ... |      ... |
|     1501 |        3 |
|     1502 |        3 |
|      ... |      ... |
+----------+----------+

在这个例子中我有

city_id 的900个用户= 1
600 个city_id的用户= 2
300 个city_id的用户= 3

我想做的事:

以公平的方式对每个用户进行排序,最终得到如下列表:

+---------+----------+
| user_id |  city_id |
+---------+----------+
|       1 |        1 |
|       2 |        1 |
|       3 |        1 |
|     901 |        2 |
|     902 |        2 |
|    1501 |        3 |
|       4 |        1 |
|       5 |        1 |
|       6 |        1 |
|     903 |        2 |
|     904 |        2 |
|    1502 |        3 |
+---------+----------+

我将所有内容除以 300(例如),所以我每天都有:

来自城市 1的 3 个
用户, 然后来自城市 2的2个用户, 然后来自城市 3的1个用户, 然后来自城市 1的3 个用户, 然后来自城市 2的2 个用户, 然后来自城市 3的1 个用户 ......




我尝试使用 take() 函数,但它没有修改原始集合。我使用了 shift() 函数,但它只需要一项。

我试过那个代码:

while($users->isNotEmpty()){
    // $user->count() = 1800
    for ($i=0; $i<3; $i++){
        $final->push($users->where('city_id', 1)->shift());
    }
    for ($i=0; $i<2; $i++){
        $final->push($users->where('city_id', 2)->shift());
    }
    $final->push($users->where('city_id', 3)->shift());

    // $user->count() = 1800; $final->count() = 6
}

它不会从 $user 集合中转移元素。仍然有1800个元素...

谢谢 !

标签: phplaravelcollections

解决方案


推荐阅读