按2个参数排序Laravel集合


Sorting Laravel collection by 2 parameters

今天排序很有趣!叹息。我有大量的有说服力的模型,它们需要根据一个参数在数组中分组,并根据另一个参数在这些"团块"中排序。这可能很难解释:(

$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;
});