如何使用PHP& amp;来排序JSON数据usort?

时间:2011-06-14 09:20:47

标签: php arrays json sorting usort

我如何使用PHP对以下内容进行排序? (wed_1_cln在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
}

previous answers来看,似乎usort可能是一个答案,但我得到错误告诉我$ obj是一个对象而不是一个数组。

感谢。

3 个答案:

答案 0 :(得分:4)

很少注意到:

  1. 要在json_decode() ed数据上使用任何数组函数,必须将true作为第二个参数传递,它会为您提供关联数组而不是对象。

  2. 每当您计划对数组进行排序时,请查看this page,它可以帮助您确定应该使用的12个以上数组排序函数中的哪一个。

  3. 由于所需的排序不直观(按键排序将星期五放在顶部并在打开前关闭),您应该定义自定义排序功能;使用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实施方式不尽相同。必要时即兴发挥。

答案 1 :(得分:3)

$array = $json_decode($json,true);  //> tradyblix
ksort($array);                      //> Sort by keys

答案 2 :(得分:2)

首先,你的json无效,因为你没有在包含'hours'的关联数组周围放置花括号。如果您为了简洁而将其删除,这可能不是问题,但我必须在调试时更改它。

更重要的是,您可以要求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。

然后你可以用它来迭代和发射(添加了转义和标记):

echo "<ol>\n";
foreach($obj['hours'] as $key => $val) {
        echo "\t<li>" . htmlentities($key) . ' => ' . htmlentities($val) . "</li>\n";
}
echo "</ol>\n";