[英]Php sorting multidimensional array?
如何對以下數組進行排序?
我有一個多維數組,每個品牌的總小時數
$totalHours = array(
'brand' => array(),
'project' => array(),
'hours' => array()
);
輸出是這樣的(項目未填充):
array(3) {
["brand"]=>
array(3) {
[0]=>
string(4) "Nike"
[1]=>
string(9) "Coke Cola"
[2]=>
string(8) "Converse"
}
["project"]=>
array(3) {
[0]=>
string(6) "Bonobo"
[1]=>
string(4) "LDRU"
[2]=>
string(2) "US"
}
["hours"]=>
array(3) {
[0]=>
int(28)
[1]=>
int(106)
[2]=>
string(1) "2"
}
}
現在我想根據“小時”字段對數組進行排序。
我已經嘗試過array_multisort,但似乎我根本不知道這個函數是如何工作的,以及如何將它應用於這個數組。 我只能用一行值對單個數組進行排序。 如果我將此問題應用於此問題,我只對小時字段進行排序,使其他字段保持未排序狀態,因此數組已損壞。
“project”確實包含一個字符串。 它總是這樣。 在這個例子中,我沒有填寫它。
array_multisort應該工作:
$totalHours = array(
'brand' => array('Nike', 'Coke Cola', 'Converse'),
'project' => array(),
'hours' => array(28, 106, '2')
);
array_multisort($totalHours['hours'], $totalHours['brand']);
var_dump($totalHours);
這種數據格式不是很方便,因為品牌和時間之間沒有直接關聯,它們甚至坐在不同的陣列中! 另外,最后一小時是一個字符串,而不是整數。
我們將不得不創建一個中間數組來關聯它們並對它們進行排序。 然后我們將重新注入原始數組中的所有內容。
// Make sure both arrays of brands and hours and the same size
if (count($totalHours['brand']) != count($totalHours['hours'])) {
throw new Exception('Invalid data!');
}
// Make sure every hour record is an integer, not a string
$totalHours['hours'] = array_map('intval', $totalHours['hours']);
// array_combine will sort all arrays based on the sorting of the first one
array_multisort($totalHours['hours'], $totalHours['brand'], $totalHours['project']);
編輯:最初使用array_multisort
是@delprks的想法。 在這里,我將其應用於品牌和項目陣列。
你不能用一個array_ *函數來做到這一點!
如果(項目沒有填寫)總是和品牌和小時的索引相等,那么你可以這樣做:
$forsort = array_combine($totalHours["brands"],$totalHours["hours"]);
asort($forsort,SORT_NUMERIC);
$totalHours["brands"]=array_keys($forsort);
$totalHours["hours"]=array_values($forsort);
但是,這只是你問題的答案,而不是最佳實踐。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.