最小配列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つの製品があるためです。
したがって、商品の存在に基づいて注文したい場合はsort
でSUM
となります。 私はこれを持っているが、それは動作しません:
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使うことをお勧め「存在」でソートするには
お返事をお寄せいただきありがとうございますけれどもによって、その後
は、複数のフィールド(合計が存在し、その後)私はあなたが逆ために、二回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