我需要:
- 按每個組合的總價格對陣列進行排序。
- 只回傳總價最高的 40% 。
$combinations = '[
[ //1st combination
{"id":1,"price":11900},
{"id":2,"price":499},
{"id":3,"price":2099}
],
[ //2nd combination
{"id":1,"price":11900},
{"id":2,"price":499},
{"id":4,"price":999}
],
[ //3rd combination
{"id":1,"price":11900},
{"id":2,"price":499},
{"id":5,"price":899}
],
[ //4th combination
{"id":1,"price":11900},
{"id":2,"price":499},
{"id":6,"price":2999}
]
]';
uj5u.com熱心網友回復:
<?php
$json = json_decode('[
[{"id":1,"price":11900},{"id":2,"price":499},{"id":3,"price":2099}],
[{"id":1,"price":11900},{"id":2,"price":499},{"id":4,"price":999}],
[{"id":1,"price":11900},{"id":2,"price":499},{"id":5,"price":899}],
[{"id":1,"price":11900},{"id":2,"price":499},{"id":6,"price":2999}]
]');
// var_dump($json);
// ($a, $b) for ASC sorting
// ($b, $a) for DESC sorting
usort($json, function ($b, $a) {
$a_prices = 0;
foreach($a as $aa)
$a_prices = $aa->price;
$b_prices = 0;
foreach($b as $bb)
$b_prices = $bb->price;
return $a_prices - $b_prices;
});
// Find where 40% stops
// It is up to you to choose between round(), ceil() or floor()
$breakpoint = round(sizeof($json) * 40 / 100);
$sorted_chunk = array_slice($json, 0, $breakpoint);
var_dump($sorted_chunk);
uj5u.com熱心網友回復:
雖然@medilis 的答案簡單而正確,但這是一種更經濟的資料排序方式。如果我們正在處理一個大型資料集,那么直接計算可能會變得相當昂貴——因為必須為每個與比較usort重新計算比較值。相反,我們可以預先計算總和并使用“快取”值進行比較。$a$b
// Here's the data; decoded as an array:
$json = json_decode('[
[{"id":1,"price":11900},{"id":2,"price":499},{"id":3,"price":2099}],
[{"id":1,"price":11900},{"id":2,"price":499},{"id":4,"price":999}],
[{"id":1,"price":11900},{"id":2,"price":499},{"id":5,"price":899}],
[{"id":1,"price":11900},{"id":2,"price":499},{"id":6,"price":2999}]
]', true);
// Calculate the sums for all prices per row up-front.
// Map array into sums: Get the sum for each row's "price" columns
$sums = array_map(fn($v) => array_sum(array_column($v, 'price')), $json);
// Use $sums in our key-based sorter for the comparison values:
uksort($json, function($b, $a) use ($sums) {
return $sums[$a] <=> $sums[$b];
});
// See the sums, get the sorted data:
var_dump($sums, $json);
這里我們使用uksort代替usort,因為我們只需要知道被排序的陣列成員的鍵。我們的“比較快取”或$sums具有與目標陣列匹配的鍵的陣列被傳遞use()給排序函式。在函式內部,我們只是比較 和 中的匹配值,$sums[$a]而$sums[$b]不是重復總和計算。演示:https ://3v4l.org/sNluJ#v8.1.3
在這種情況下,需要一個大型資料集才能產生顯著差異。如果需要更昂貴的迭代(例如,多個“繁重的”函式呼叫)來獲得要比較的值,那么“預先且僅一次”的評估將節省大量不必要的計算周期。
回傳 OP 想要的最終前 40% 結果時,請參考接受的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/434364.html
