Jump to content

Archived

This topic is now archived and is closed to further replies.

maxodoe

Sort multidimensional array

Recommended Posts

I need to sort the following array, first by score then by name. I am just starting to learn PHP and everything worked just fine until this. Can anyone help me?

$scores[0]['name'] = 'Michael';
$scores[0]['score'] = 13;
$scores[1]['name'] = 'Fred';
$scores[1]['score'] = 15;
$scores[2]['name'] = 'Mary';
$scores[2]['score'] = 19;

/Max

Share this post


Link to post
Share on other sites
try

[code]$scores[0]['name'] = 'Michael';
$scores[0]['score'] = 19;
$scores[1]['name'] = 'Fred';
$scores[1]['score'] = 15;
$scores[2]['name'] = 'Mary';
$scores[2]['score'] = 19;

function score_name_sort($a, $b) {
    if ($a['score'] == $b['score']) {
        return strcmp($a['name'], $b['name']);
    }
    return $a['score'] < $b['score'] ? -1 : 1;
}

usort ($scores, 'score_name_sort');

// check result
echo '<pre>', print_r($scores, true), '</pre>';[/code]

Share this post


Link to post
Share on other sites
I had been working on this for days but couldn't make it work.
But your usort solution worked like a clock and solved everything.
A million thanks!!!!


About the sort($scores); function:
Is there any way to change the key by which it sorts?

Again thank you so much for your help!

/Max



Share this post


Link to post
Share on other sites
nope, not that i've been able to determine. the way the sort function works is it sorts the first array sets first and then after that it looks at the 2nd array, etc.. so you would think since it does look at more than one anyways, there would be a way to do like a sort($array, $level) or something built in, but.. nope, not that i have been able to find. You gotta do a traditional sorting method like bubble sort or something, like how barand did.

Share this post


Link to post
Share on other sites
Now I understand how to use the sort function. And the usort solution works fine when I want to use a second key as well.
I almost gave up, but now I'm a happy man.
Thank you very much for explaining everything!

/Max

Share this post


Link to post
Share on other sites
IF the scores and name keys had been in the right order, eg


[code]$scores = array (
    array (
        'score' =>19,
        'name' => 'Michael'
        ),
    array (
        'score' =>15,
        'name' => 'Fred'
        ),
    array (
        'score' =>19,
        'name' => 'Mary'
        )
);[/code]

then you could have used this to sort by score then name

[code]array_multisort($scores);

echo '<pre>', print_r($scores, true), '</pre>';[/code]
?>

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.