0

Given the following example:

$user1 = array('username' => 'test1', 'score' => 2000, 'someotherdata' => 1.0);
$user2 = array('username' => 'test2', 'score' => 4325, 'someotherdata' => 2.0);
$user3 = array('username' => 'test3', 'score' => 624534, 'someotherdata' => 3.0);
$user4 = array('username' => 'test4', 'score' => 564, 'someotherdata' => 1.4);
$user5 = array('username' => 'test5', 'score' => 34256, 'someotherdata' => 1.5);
$user6 = array('username' => 'test6', 'score' => 5476, 'someotherdata' => 1.8);

$arr = array($user1, $user2, $user3, $user4, $user5, $user6);

How would I be able to sort $arr by the field score nicely in PHP 7? I got a working bubblesort I made my own, but is there a way to use builtin PHP 7 features to do it nicely, as bubblesort is pretty expensive (I could do a Quicksort on my own, but before I do that I wanted to know if there is a better way).

Nidhoegger
  • 4,973
  • 4
  • 36
  • 81
  • In Yii2/PHP you can use ArrayHelper's multisort: https://www.yiiframework.com/doc/guide/2.0/en/helper-array#multidimensional-sorting – WeSee Jun 02 '18 at 08:19

2 Answers2

2

You can use usort

$user1 = array('username' => 'test1', 'score' => 2000, 'someotherdata' => 1.0);
$user2 = array('username' => 'test2', 'score' => 4325, 'someotherdata' => 2.0);
$user3 = array('username' => 'test3', 'score' => 624534, 'someotherdata' => 3.0);
$user4 = array('username' => 'test4', 'score' => 564, 'someotherdata' => 1.4);
$user5 = array('username' => 'test5', 'score' => 34256, 'someotherdata' => 1.5);
$user6 = array('username' => 'test6', 'score' => 5476, 'someotherdata' => 1.8);

$arr = array($user1, $user2, $user3, $user4, $user5, $user6);

usort($arr, function($a, $b){
    return $a['score'] - $b['score'];
});

echo "<pre>";
print_r( $arr );
echo "</pre>";

This will result to:

Array
(
    [0] => Array
        (
            [username] => test4
            [score] => 564
            [someotherdata] => 1.4
        )

    [1] => Array
        (
            [username] => test1
            [score] => 2000
            [someotherdata] => 1
        )

    [2] => Array
        (
            [username] => test2
            [score] => 4325
            [someotherdata] => 2
        )

    [3] => Array
        (
            [username] => test6
            [score] => 5476
            [someotherdata] => 1.8
        )

    [4] => Array
        (
            [username] => test5
            [score] => 34256
            [someotherdata] => 1.5
        )

    [5] => Array
        (
            [username] => test3
            [score] => 624534
            [someotherdata] => 3
        )

)

Doc: usort()

Eddie
  • 26,593
  • 6
  • 36
  • 58
1

using multisort

$user1 = array('username' => 'test1', 'score' => 2000, 'someotherdata' => 1.0);
$user2 = array('username' => 'test2', 'score' => 4325, 'someotherdata' => 2.0);
$user3 = array('username' => 'test3', 'score' => 624534, 'someotherdata' => 3.0);
$user4 = array('username' => 'test4', 'score' => 564, 'someotherdata' => 1.4);
$user5 = array('username' => 'test5', 'score' => 34256, 'someotherdata' => 1.5);
$user6 = array('username' => 'test6', 'score' => 5476, 'someotherdata' => 1.8);

$arr = array($user1, $user2, $user3, $user4, $user5, $user6);

$score = array();
foreach ($arr as $key => $row)
{
    $score[$key] = $row['score'];
}
array_multisort($score, SORT_DESC, $arr);
echo "<pre>";
print_r($score);
echo "</pre>";
Bhumi Shah
  • 9,323
  • 7
  • 63
  • 104