1

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...

2
  • Where is your attempt at usort? Commented Dec 4, 2015 at 17:16
  • You can use array_column, to use the values of order as keys, and sort on that instead. You can also sort with a custom callback, obviously if you're running an older PHP version Commented Dec 4, 2015 at 17:18

1 Answer 1

1

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.