PHP排序对象,带有基于两个值的usort

时间:2016-05-09 09:12:39

标签: php sorting object usort array-multisort

我正在尝试基于最小SUM对对象数组进行排序。这是有效的,但我想在我的usort函数中添加另一个比较,它将更喜欢object,它将有一个值为true。我的目标:

object(Basket)[33]
      public 'products' => 
        array (size=2)
          0 => 
            object(Product)[13]
              public 'name' => string 'Name ONE' (length=8)
              public 'price' => float 0.75
              public 'exist' => boolean true
          1 => 
            object(Product)[7]
              public 'name' => string 'Name TWO' (length=8)
              public 'price' => float 2.39
              public 'exist' => boolean true
      public 'sum' => float 3.14

object(Basket)[34]
      public 'products' => 
        array (size=2)
          0 => 
            object(Product)[19]
              public 'name' => string 'Name ONE' (length=8)
              public 'price' => float 0.75
              public 'exist' => boolean true
          1 => 
            object(Product)[72]
              public 'name' => string 'Name TWO' (length=8)
              public 'price' => null
              public 'exist' => boolean false
      public 'sum' => float 0.75

object(Basket)[35]
      public 'products' => 
        array (size=2)
          0 => 
            object(Product)[1]
              public 'name' => string 'Name ONE' (length=8)
              public 'price' => float 0.75
              public 'exist' => boolean true
          1 => 
            object(Product)[2]
              public 'name' => string 'Name TWO' (length=8)
              public 'price' => float 1.75
              public 'exist' => boolean true
      public 'sum' => float 2.5

如果我sort,则订单为Basket[34],Basket[35],Basket[33]

但是我想要Basket[35],Basket[33]并且最后Basket[34],因为他有一个产品,它不存在。

所以我想根据产品的存在情况订购,然后sortSUM订购。 我有这个,但它不起作用:

usort($h_basket[$i], function($a, $b) {
    return $a->sum > $b->sum;
});
usort($h_basket[$i], function($a, $b) {
  $unfinded_a = 0;
  $unfinded_b = 0;
  foreach ($a->products as $product) {
    if(!$product->exist) {
      $unfinded_a++;
    }
  }
  foreach ($b->products as $product) {
    if(!$product->exist) {
      $unfinded_b++;
    }
  }
  if ($unfinded_a != 0 || $unfinded_b != 0)
  return $unfinded_b > $unfinded_a;
});

可以使用usort执行此操作,还是必须使用array_multisort

1 个答案:

答案 0 :(得分:0)

按"存在"排序字段(我假设存在的所有购物车产品的百分比越大,应该排序的越高)

我建议您使用array_filter来简单地计算出有多少产品存在'与总数相比。

$exists = count(
    array_filter(
        $object->products,
        function ($product) {
            return $product->exist;
        }
    )
) / count($object->products);

然后比较所比较的两个篮子的计算$exists值。

要按多个字段排序(存在,然后求和),我相信您需要按反向顺序调用usort两次 - 按sum排序首先然后exists