簡體   English   中英

如何使用 PHP 和 usort 對 JSON 數據進行排序?

[英]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 而不是數組。

謝謝。

幾點注意事項:

  1. 要在json_decode() ed 數據上使用任何數組函數,您必須將true作為第二個參數傳遞給您一個關聯數組,而不是 object。

  2. 每當您計划對數組進行排序時,請查看此頁面,該頁面可幫助您確定應該使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM