Womp
Womp

Reputation: 19

PHP JSON sort from associative array 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...

Upvotes: 1

Views: 46

Answers (1)

Elias Van Ootegem
Elias Van Ootegem

Reputation: 76413

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

Upvotes: 1

Related Questions