dongxing2302
2015-12-04 17:09 阅读 45

PHP JSON从关联数组STUCK中排序

Good day to those smarter than me. I've been all over google and here to no avail. Here's my situation... I have a json file with this:

    {
"firstset": {
    "xgroup": [
    {
        "order": 3,
        "title": "third in xgroup"
    }, {
        "order": 5,
        "title": "fifth in xgroup"
    }, {
        "order": 4,
        "title": "fourth in xgroup"
    }, {
        "order": 1,
        "title": "first in xgroup"
    }, {
        "order": 2,
        "title": "second in xgroup"
    }
    ]
},
"secondset": {
    "ygroup": [
    {
        "order": 7,
        "title": "seventh in ygroup"
    }, {
        "order": 4,
        "title": "fourth in ygroup"
    }, {
        "order": 6,
        "title": "sixth in ygroup"
    }, {
        "order": 1,
        "title": "first in ygroup"
    }, {
        "order": 3,
        "title": "third in ygroup"
    }, {
        "order": 2,
        "title": "second in ygroup"
    }, {
        "order": 8,
        "title": "eighth in ygroup"
    }, {
        "order": 5,
        "title": "fifth in ygroup"  
    }
    ]
}

}

and this is the PHP:

    $json_url = "js/testlist.json";
    $json = file_get_contents($json_url);
    $data = json_decode($json, TRUE);

    echo '<ul>';
    foreach ($data['firstset']['xgroup'] as $val) {
        echo '<li>' . $val['order'] . '.) ' . $val['title'] . '</li>';
    }
    echo '</ul>';

I've tried everything from the old fashioned 'my_sort' functions found on here to just usorting the entire array with no avail. Is there a way to sort by the 'order' field on the 'firstset' array and display the data?

Thank you in advance...

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    dongsi073898 dongsi073898 2015-12-04 17:23

    To expand on my comment, here's what I'd do:

    $data = json_decode($json, true);
    //array_column: use values of order key as keys, title key as value
    $data['firstset']['xgroup'] = array_column(
        $data['firstset']['xgroup'],
        'title',//pass null here to assign the entire array to the order key (ie [order => x, title => some title])
        'order'
    );
    //sort the result by key
    ksort($data['firstset']['xgroup']);
    foreach ($data['firstset']['xgroup'] as $order => $title) {
        //use vars here
    }
    

    Demo here

    This requires PHP 5.5 or higher, so if you're running PHP 5.4, just write a simple loop:

    $ordered = array();
    foreach ($data['firstset']['xgroup'] as $arr) {
        $ordered[$arr['order']] = $arr['title'];
    }
    ksort($ordered);
    foreach ($ordered as $order => $title) {
        //same as before
    }
    

    There is a PHP implementation that is (AFAIK) fully compatible with the native array_column function on github

    点赞 评论 复制链接分享

相关推荐