【问题标题】:How to sort collection by array?如何按数组对集合进行排序?
【发布时间】:2017-11-20 09:32:34
【问题描述】:

如何对给定的集合进行排序

Collection {
    #items: array:3 [
        0   => MenuPosition,    // ->label = "About Us"
        1   => MenuPosition,    // ->label = "Homepage"
        2   => MenuPosition     // ->label = "Shop"
    ]
}

借助这个数组

$correctOrder = [
    'Homepage',
    'Shop',
    'About Us'
];

所以最后我会得到

Collection {
#items: array:3 [
    0   => MenuPosition,    // ->label = "Homepage"
    1   => MenuPosition,    // ->label = "Shop"
    2   => MenuPosition     // ->label = "About Us"
]

MenuPosition 是 Eloquent 模型的一个实例

【问题讨论】:

    标签: php laravel sorting collections


    【解决方案1】:

    假设$collection 持有菜单项,试试这个:

    $collection = 
        /*
        Collection {
            #items: array:3 [
                0   => MenuPosition,
                1   => MenuPosition,
                2   => MenuPosition
            ]
        }
        */
    
    $correctOrder = [
        'Homepage',
        'Shop',
        'About Us'
    ];
    
    $sorted = $collection->sortBy(function($menuItem, $key) use ($correctOrder) {
        return array_search($menuItem->label, $correctOrder);
    });
    

    array_search() 为您提供数组中值的索引。

    请记住,集合的 label$correctOrder 中的值必须具有相同的大小写才能正常工作。不过,这不是一种非常灵活的方法,因为名称可能会改变。

    【讨论】:

    • 谢谢,这看起来很简单,转换成Collection宏会更简单:)
    【解决方案2】:

    编辑

    您可以使用combine() 实现此目的。来自文档:

    combine 方法将集合的键与另一个数组或集合的值组合起来

    因此,将索引作为 $correctOrder 数组中的键并将集合映射到这些键。

    https://laravel.com/docs/5.4/collections#method-combine

    【讨论】:

    • 不,很确定他的意思是按给定数组对集合进行排序,所以$somePointlessOrder
    • 很难说没有他想要排序的例子。
    • 我用例子把我的问题改成了更正确的情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多