通过2个参数对Laravel集合进行排序

时间:2015-08-13 15:00:12

标签: php sorting laravel laravel-5 eloquent

今天排序很有趣!叹。我有一大堆雄辩的模型,需要通过一个参数在数组中组合在一起,并在那些“clumps'基于另一个参数。这可能很难解释:(

$ master是一个Eloquent结果的集合,我不知道如何在这里写出来,循环这个我可以访问所有模型函数/关系

$screen-md-max: 100000px;

这些属性需要作为排序的基础,下面的属性示例

$master = [];

我想对这些大量的集合进行排序,以便每个$ master->部分都在一个' clump'在数组和里面的那个' clump'最后列出$ master-> carry = 0产品。

//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-> sort()和$ master-> sortBy()的东西,但是每个新的排序都会抛出旧的排序:(

我目前已经获得了以下代码,它将所有颜色分组,但它并没有根据$ master->进行订购

From the example above I'd expect Object1, Object3, Object2

1 个答案:

答案 0 :(得分:2)

据我了解,您希望按以下方式对收藏品进行排序:

  • $ order 数组
  • 中存储的顺序按部分排序
  • 在部分内将进位= 0 的元素移动到结尾

您需要将实现此类逻辑的函数传递给 $ master 集合。这个函数应该有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;
});