[英]How to sort JSON data using PHP & usort?
如何使用 PHP 對以下內容進行排序? (其中 wed_2_open 在 wed_1_close 之后)
我有以下 JSON 數據:
"hours": {
"mon_1_open": 406800,
"mon_1_close": 437400,
"tue_1_open": 493200,
"tue_1_close": 523800,
"wed_1_open": 579600,
"wed_1_close": 590400,
"thu_1_open": 61200,
"thu_1_close": 91800,
"fri_1_open": 147600,
"fri_1_close": 178200,
"sat_1_open": 237600,
"sat_1_close": 264600,
"sun_1_open": 324000,
"sun_1_close": 345600,
"wed_2_open": 597600,
"wed_2_close": 619200
}
然后我使用 JSON_decode 將其轉換為可用格式:
$obj=json_decode($json);
這被放入一個循環中以使用將其轉換為 HTML:
foreach ($obj->hours as $key => $val) {
// Turn array items into HTML list items
}
從以前的答案看來, usort 可能是一個答案,但我收到錯誤,告訴我 $obj 是 object 而不是數組。
謝謝。
幾點注意事項:
要在json_decode()
ed 數據上使用任何數組函數,您必須將true
作為第二個參數傳遞給您一個關聯數組,而不是 object。
每當您計划對數組進行排序時,請查看此頁面,該頁面可幫助您確定應該使用 12 多種數組排序功能中的哪一種。
由於所需的排序不直觀(按鍵排序將星期五放在頂部並在打開之前關閉),您應該定義自定義排序 function; 使用uksort()
允許您在數組鍵上執行此操作:
<?php
$data = json_decode('{"hours": {
"mon_1_open": 406800,
"mon_1_close": 437400,
"tue_1_open": 493200,
"tue_1_close": 523800,
"wed_1_open": 579600,
"wed_1_close": 590400,
"thu_1_open": 61200,
"thu_1_close": 91800,
"fri_1_open": 147600,
"fri_1_close": 178200,
"sat_1_open": 237600,
"sat_1_close": 264600,
"sun_1_open": 324000,
"sun_1_close": 345600,
"wed_2_open": 597600,
"wed_2_close": 619200
}}', true);
echo 'BEFORE ================================' . PHP_EOL;
print_r($data);
uksort($data['hours'], 'customsort');
echo 'AFTER ================================' . PHP_EOL;
print_r($data);
function customsort($a, $b) {
$tr_prefix = array(
'mon' => 1,
'tue' => 2,
'wed' => 3,
'thu' => 4,
'fri' => 5,
'sat' => 6,
'sun' => 7
);
$tr_suffix = array(
'open' => 1,
'close' => 2
);
$a = strtr(strtr($a, $tr_prefix), $tr_suffix);
$b = strtr(strtr($b, $tr_prefix), $tr_suffix);
return strcmp($a, $b);
}
注意:上面顯示的我的customsort
實現很天真。 必要時即興發揮。
$array = $json_decode($json,true); //> tradyblix
ksort($array); //> Sort by keys
首先,您的 json 無效,因為您沒有在包含“小時”的關聯數組周圍放置大括號。 如果為了簡潔起見,這可能不是問題,但我必須在調試時更改它。
更重要的是,您可以要求 json_decode 將數據轉換為關聯數組,而不是stdClass的實例。 然后ksort將允許您按鍵排序。
$json = file_get_contents('jsonsort.txt');
$obj = json_decode($json, true);
var_dump($obj);
ksort($obj['hours']);
var_dump($obj);
您可以使用 sort 按值排序- 不需要 usort 除非您需要進行自定義比較 function,例如比較對象的實例。
然后,您可以使用它進行迭代和發射(添加了轉義和標記):
echo "<ol>\n";
foreach($obj['hours'] as $key => $val) {
echo "\t<li>" . htmlentities($key) . ' => ' . htmlentities($val) . "</li>\n";
}
echo "</ol>\n";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.