-1

below is my multidimensional array: I have already sorted array based on 'grade' and got the result. this sorted array again need to sort on 'timetaken' based on 'grade' key.

ex: have grade= 1.75, this should be sorted on timetaken key. And grade= 2.50 should be upper, because it is higher then 1.75.

        $testing_data = array(
            0 => array(
                "fullname" => ' Shoping0000000000',
                "grade" => 2.5000,
                "timetaken" => 15
            ),
            1 => array(
                "fullname" => ' Vennapureddy',
                "grade" => 1.75000,
                "timetaken" => 13
            ),
            2 => array(
                "fullname" => ' Shoping1111111',
                "grade" => 1.75000,
                "timetaken" => 11
            ),
            3 => array(
                "fullname" => ' Shoping2222222',
                "grade" => 1.75000,
                "timetaken" => 90
            ),
            4 => array(
                "fullname" => ' Shoping333333333',
                "grade" => 1.7000,
                "timetaken" => 15
            ),

            5 => array(
                "fullname" => ' Azmeera',
                "grade" => 1.7000,
                "timetaken" => 67
            ),
            6 => array(
                "fullname" => 'Admin User',
                "grade" => 1.00,
                "timetaken" => 180
            ),
            7 => array(
                "fullname" => ' Shoping444444444444',
                "grade" => 1,
                "timetaken" => 15
            ),
            8 => array(
                "fullname" => ' Shoping55555555555555555',
                "grade" => 0.5000,
                "timetaken" => 290
            ),
            9 => array(
                "fullname" => ' Shoping6666',
                "grade" => 0.5000,
                "timetaken" => 120
            ),
            10 => array(
                "fullname" => ' Shoping77777',
                "grade" => 0.5000,
                "timetaken" => 187
            ),
            11 => array(
                "fullname" => ' Shoping888888',
                "grade" => 0.5000,
                "timetaken" => 20
            ),                                                                                                         
        );

And my result array should be like:

        $testing_data = array(
            0 => array(
                "fullname" => ' Shoping0000000000',
                "grade" => 2.5000,
                "timetaken" => 15
            ),
            1 => array(
                "fullname" => ' Shoping1111111',
                "grade" => 1.75000,
                "timetaken" => 11
            ),
            2 => array(
                "fullname" => ' Vennapureddy',
                "grade" => 1.75000,
                "timetaken" => 13
            ),

            3 => array(
                "fullname" => ' Shoping2222222',
                "grade" => 1.75000,
                "timetaken" => 90
            ),
            4 => array(
                "fullname" => ' Shoping333333333',
                "grade" => 1.7000,
                "timetaken" => 15
            ),

            5 => array(
                "fullname" => ' Azmeera',
                "grade" => 1.7000,
                "timetaken" => 67
            ),
            6 => array(
                "fullname" => ' Shoping444444444444',
                "grade" => 1,
                "timetaken" => 15
            ),
            7 => array(
                "fullname" => 'Admin User',
                "grade" => 1.00,
                "timetaken" => 180
            ),
            8 => array(
                "fullname" => ' Shoping888888',
                "grade" => 0.5000,
                "timetaken" => 20
            ),              
            9 => array(
                "fullname" => ' Shoping6666',
                "grade" => 0.5000,
                "timetaken" => 120
            ),
            10 => array(
                "fullname" => ' Shoping77777',
                "grade" => 0.5000,
                "timetaken" => 187
            ),              
            11 => array(
                "fullname" => ' Shoping55555555555555555',
                "grade" => 0.5000,
                "timetaken" => 290
            ),

        );
5
  • I don't see a difference between the two arrays Commented Apr 26, 2019 at 14:48
  • It is not clear what you are trying to do. From the data, it appears that you want to sort by grade descending and then timetaken ascending. Is that right? Commented Apr 26, 2019 at 14:51
  • Have you tried any of the many array_ functions? Commented Apr 26, 2019 at 14:56
  • The answer on the duplicate post shows a simple way to sort an array by multiple criteria Commented Apr 26, 2019 at 15:09
  • The usort comparison expression should be$b['grade'] <=> $a['grade'] ?: $a['timetaken'] <=> $b['timetaken'] Commented Apr 26, 2019 at 15:14

3 Answers 3

1
<?php
array_multisort($testing_data[0], SORT_NUMERIC, SORT_DESC,
                $testing_data[1], SORT_NUMERIC, SORT_ASC);
var_dump($testing_data);
?>

See documentation at https://php.net/manual/en/function.array-multisort.php, example #2.

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

Comments

0

You need to use usort, a function that sorts arrays via a user defined function. Something like:

function cmp($a, $b)
{
    if ($a["grade"] == $b["grade"]) {
        return 0;
    }
    return ($a["grade"] < $b["grade"]) ? -1 : 1;
}

usort($yourArray,"cmp")

Comments

0

Simply try this

array_multisort(array_column($testing_data, 'grade'), SORT_DESC, SORT_NUMERIC, $testing_data);

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.