Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Laravel中基于多个条件对集合进行排序_Php_Laravel_Sorting_Collections - Fatal编程技术网

Php 在Laravel中基于多个条件对集合进行排序

Php 在Laravel中基于多个条件对集合进行排序,php,laravel,sorting,collections,Php,Laravel,Sorting,Collections,我试着先按颜色排序,然后再按类型排序 我在想也许双foreach循环不是答案 以下是我到目前为止的情况 private $color_order = [ 'white', 'green', 'purple', 'blue', '' ]; private $type_order = [ 'diamond', 'square', 'circle' ]; private function sortCards($cards,

我试着先按颜色排序,然后再按类型排序

我在想也许双foreach循环不是答案

以下是我到目前为止的情况

private $color_order = [
    'white',
    'green',
    'purple',
    'blue',     
    ''
];

private $type_order = [
    'diamond',
    'square',
    'circle'
];

private function sortCards($cards, $color_order, $type_order) {
    $collection = collect($cards);

    return $collection->sortBy(function($card) use ($color_order, $type_order) {
        foreach ($type_order as $index => $type) {
            foreach ($color_order as $index => $color) {
                if ($card->card_colors == $color && str_contains($card->card_type, $type)) {
                    return $index;
                }
            }
        }
    })->values();
}

这里有一个宏可以为您实现这一点。将宏放在
app/Providers/AppServiceProvider.php
'a
boot()
方法中:

use Illuminate\Support\Collection;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Collection::macro('sortByMany', function($params) {
            return $this->sortBy(function($item) use ($params) {
                $sort = '';
                foreach($params as $property => $sortOrder) {
                    $key = array_search($item->{$property}, $sortOrder);
                    $sort .= $key === false ? count($sortOrder) + 1 : $key;
                }
                return (int) $sort;
            });
        });
    }
}
然后可以使用排序顺序数组调用它,如
['objectProperty'=>['sortorder'],'otherProp'=>['otherSortOrder']]
。它将按照属性传递给方法的顺序对属性进行排序。在您的示例中,它将是:

private function sortCards($cards, $color_order, $type_order)
{
    return collect($cards)->sortByMany(['card_colors' => $color_order, 'card_type' => $type_order])->values();
}

我就是这样解决的。我知道会更好

也许其他人可以提供更优雅的解决方案,而不需要越来越深入的if语句

private function sortCards($cards, $color_order, $type_order) {
    return $cards->sort(function($a, $b) use ($color_order, $type_order) {
        $pos_a = array_search($a->card_colors, $color_order);
        $pos_b = array_search($b->card_colors, $color_order);

        if ($pos_a == $pos_b) {
            $pos_a = array_search($a->card_types, $type_order);
            $pos_b = array_search($b->card_types, $type_order);

            if ($pos_a == $pos_b) return 0;
            return $pos_a - $pos_b;
        }
        return $pos_a - $pos_b;
    });
}

它是按颜色而不是按类型排序的?你能给出前后的样本数据集吗?我刚刚解决了它,我发布了我的解决方案。如果你的方法奏效的话,那会很不错。美元卡有什么价值?