通过2个参数对Laravel系列进行排序
问题描述:
今天排序很有趣!叹。我有一大堆雄辩的模型,它们需要通过一个参数在数组中组合在一起,然后在基于另一个参数的“块”中排序。这可能是很难解释:(通过2个参数对Laravel系列进行排序
$主口若悬河结果的收集,我不知道如何将它们写在这里,遍历这个我可以访问所有的模型功能/关系
$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-> carry = 0产品ar最后列出。
From the example above I'd expect Object1, Object3, Object2
我试过主 - 几个不同的$>的sort()和$主 - > sortBy()的东西,但每个新的排序抛出了旧排序:(
我有目前下面的代码,这组了所有的颜色,但基于$主 - >如果不命令他们携带又
$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;
});
答
我的理解,要排序您的收藏方式如下:
- 排序的顺序截面部内存储在$顺序阵列
- 与进位= 0移动元件与端
您必须通过将实现这样的逻辑到功能$主人集合。该函数应该采取2个参数(集合的2个元件),对它们进行比较,并返回:
- 如果元素相等
- 如果第一元件比第二元件更大
- -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;
});
这真的很接近我想,非常感谢你的配偶(这是今天你第二次来到一个惊人的例子,所以啤酒就在我身上)。然而,这似乎完全抛弃了丛集所在的原始顺序(id ASC),是否有办法只将进位项目排序到每个部分的底部,而不交换每个“丛块”的顺序 - 我只是在运送物品之外实现的是收集的结束,其他一切都按照正确的顺序进行。 –
没关系,我添加了$ a-> id和$ b-> id的回报,它的工作完美。你的时间和精力非常感谢。谢了哥们!!! –
你是在哪里添加的?我将在第一个if()语句之后更新答案 –