今天排序很有趣!叹。我有很多雄辩的模型集合,这些模型需要通过一个参数在数组中分组在一起,并根据另一个参数在这些“簇”中排序。这可能很难解释:(
$ master是一个雄辩的结果的集合,我不确定如何在这里写出来,遍历这个我可以访问所有模型的函数/关系
$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-> section在数组的一个“簇”中,并且在该“簇”中,最后列出$ 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;
});
据我了解,您希望通过以下方式对集合进行排序:
您需要将实现此类逻辑的函数传递给$ master集合。此函数应采用2个参数(集合的2个元素),对其进行比较并返回:
在您的情况下,以下回调应该起作用:
$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;
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句