今天排序很有趣!叹息。我有大量的有说服力的模型,它们需要根据一个参数在数组中分组,并根据另一个参数在这些"团块"中排序。这可能很难解释:(
$master是一个Eloquent结果的集合,我不确定如何在这里写出来,在这个上面循环我可以访问所有的模型函数/关系
$master = [];
这些有2个属性需要作为排序的基础,下面的属性的例子
//Object 1
$master->carry = 0;
$master->section = 'red';
//Object 2
$master->carry = 1;
$master->section = 'blue';
//Object 3
$master->carry = 0;
$master->section = 'blue';
我想对这些数据的大量集合进行排序,以便每个$master->部分在数组中的一个'簇'中,并且在'簇'中最后列出$master->carry=0的产品。
From the example above I'd expect Object1, Object3, Object2
我已经尝试了一些不同的$master->sort()和$master->sortBy()的东西,但每一个新的排序抛出旧的排序:(
我现在有下面的代码,它把所有的颜色分组,但它还没有根据$master->carry来排序
$order = array('red', 'blue', 'green');
$master = $master->sort(function ($a, $b) use ($order) {
$pos_a = array_search($a->sectionheader, $order);
$pos_b = array_search($b->sectionheader, $order);
return $pos_a - $pos_b;
});
据我所知,您希望按照以下方式对集合进行排序:
- 按存储在$order array 中的顺序排序
- 将carry = 0的元素移到section的末尾
你需要传递一个函数来实现这样的逻辑到$master collection。这个函数应该接受2个参数(集合的2个元素),比较它们并返回:
- 0如果元素相等
- 1如果第一个元素大于第二个元素
- -1如果第一个元素小于第二个元素
在你的例子中,下面的回调应该可以工作:
$master = $master->sort(function ($a, $b) use ($order) {
// get order of first element's section
$pos_a = array_search($a->section, $order);
// get order of second element's section
$pos_b = array_search($b->section, $order)
// if sections are different the value of carry doesn't matter
// as element's sections are enough to determine which of them is larger
if ($pos_a != $pos_b) {
return $pos_a - $pos_b;
}
// carry values are equal, so consider elements equal
if ($a->carry == $b->carry) {
return 0;
}
if (!$a->carry) {
// if $a->carry is equal to 0 it should be put at the end, so after $b
return 1;
}
if (!$b->carry) {
// if $b->carry is equal to 0 it should be put at the end, so after $a
return -1;
}
// otherwise elements can be considered equal
return 0;
});