2016-05-09 9 views
1

最小配列SUMに基づいてオブジェクト配列をソートしようとしています。これは動作していますが、私は、私の関数usortにオブジェクトを優先する別の比較関数を追加したいと思います。マイオブジェクト:2つの値に基づいてusortを使用したPHPソートオブジェクト

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]があります。これは存在しない1つの製品があるためです。

したがって、商品の存在に基づいて注文したい場合は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を使用する必要がありますか?フィールド(と私はそれがソートされなければならない存在するすべてのカートの製品の大きな割合、高いと想定)

私はあなたが単純なカウントを取得するためにarray_filter使うことをお勧め「存在」でソートするには

答えて

0

どれだけ多くの製品が「存在する」対全部を有するか

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

次に、比較される2つのバスケットの計算された$existsの値を比較します。 exists

+0

お返事をお寄せいただきありがとうございますけれどもによって、その後sum最初によるソート -

は、複数のフィールド(合計が存在し、その後)私はあなたがために、二回usortを呼び出す必要があります信じることでソートするには私はよく見過ごさない。これはうまくいきません。 usort($ h_basket [$ i]、function($ a、$ b){$ a-> sum> $ b-> sum;}); usort($ h_basket [$ i]は、関数($、$ b)は{ $存在=カウント( array_filter( $ A->製品、 関数($製品){ リターン$製品 - >が存在します。 }) )/カウント($ A->製品); $ exists2 =カウント( array_filter( $ B->製品、 関数($製品){ リターン$製品 - >存在し; } ) )/ count($ b-> products); return $ exists2> $ exists; }); – Michal

関連する問題