4

I have this array in PHP, in which i have an array in array which contains name and rank. I want the ranks to be in the order. i.e from 1 to 16.

$info = array(  array( "Name"=> "Ayush Mishra", "Rank"=> "1"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "16"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "14"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "15"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "13"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "12"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "11"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "10"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "8"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "9"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "7"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "5"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "4"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "3"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "6"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "2"),   ); 

I want this array from the above array. This is the result array i want to get.

$result = array( 


  array( "Name"=> "Ayush Mishra", "Rank"=> "1"),  
  array( "Name"=> "Teaser", "Rank"=> "2"), 
  array( "Name"=> "Pussel", "Rank"=> "3"),
  array( "Name"=> "Condomso", "Rank"=> "4"),  
  array( "Name"=> "Branite", "Rank"=> "5"),  
  array( "Name"=> "Biknol", "Rank"=> "6"),  
  array( "Name"=> "Fuckita", "Rank"=> "7"),
  array( "Name"=> "James", "Rank"=> "8"),  
  array( "Name"=> "Babita", "Rank"=> "9"),  
  array( "Name"=> "Mathse", "Rank"=> "10"), 
  array( "Name"=> "rohan", "Rank"=> "11"),  
  array( "Name"=> "Alex", "Rank"=> "12"), 
  array( "Name"=> "Peter", "Rank"=> "13"),  
  array( "Name"=> "Gabbar Singh", "Rank"=> "14"),  
  array( "Name"=> "raghav", "Rank"=> "15"), 
  array( "Name"=> "Shivam", "Rank"=> "16"),  


             ); 

I want the above array as result from $info. Please give me the codes to make $info change to $result.

1
  • Sorry the names in $info are not all AYush Mishra , they are as in $reuslt. Commented Dec 19, 2012 at 6:52

7 Answers 7

4

No need for anything more than this:

function sort_by_rank($a, $b) {
    return $a['Rank'] > $b['Rank'];
}

usort($info, "sort_by_rank");
print_r($info);

OUTPUT

Array
(
    [0] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 1
        )

    [1] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 2
        )

    [2] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 3
        )

    [3] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 4
        )

    [4] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 5
        )

    [5] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 6
        )

    [6] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 7
        )

    [7] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 8
        )

    [8] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 9
        )

    [9] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 10
        )

    [10] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 11
        )

    [11] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 12
        )

    [12] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 13
        )

    [13] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 14
        )

    [14] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 15
        )

    [15] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 16
        )

)

If you want to maintain the original indexes, which from your question it does not appear to be a requirement, but if so, then use uasort instead of usort.

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

Comments

1
// this function will sort your multidimensional array by value
function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

$info = array(  array( "Name"=> "Ayush Mishra", "Rank"=> "1"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "16"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "14"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "15"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "13"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "12"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "11"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "10"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "8"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "9"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "7"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "5"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "4"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "3"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "6"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "2"),   ); 


aasort($info,"Rank");

echo '<pre>';print_r($info);

Output:

Array
(
    [0] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 1
        )

    [15] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 2
        )

    [13] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 3
        )

    [12] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 4
        )

    [11] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 5
        )

    [14] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 6
        )

    [10] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 7
        )

    [8] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 8
        )

    [9] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 9
        )

    [7] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 10
        )

    [6] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 11
        )

    [5] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 12
        )

    [4] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 13
        )

    [2] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 14
        )

    [3] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 15
        )

    [1] => Array
        (
            [Name] => Ayush Mishra
            [Rank] => 16
        )

)

2 Comments

Seems like overkill to me, but I guess it produces the correct results.
This did not help me. Like I said, this is overkill, meaning you are doing much more than you need to. The built in functions usort and uasort can handle all of this.
1

using usort , Sort an array by values using a user-defined comparison function

usort($info, 'sortfn');

function sortfn($a, $b)
{
    if($a['Rank'] == $b['Rank'])
        return ($a['Rank'] > $b['Rank']);
    else
        return ($a['Rank'] < $b['Rank']);
}

1 Comment

Yes, the comparison operators in PHP do some magical implicit conversions which handle string comparisons given that the two strings are numerical.
1
<?php


$info = array(  array( "Name"=> "Ayush Mishra", "Rank"=> "1"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "16"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "14"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "15"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "13"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "12"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "11"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "10"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "8"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "9"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "7"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "5"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "4"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "3"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "6"),  
  array( "Name"=> "Ayush Mishra", "Rank"=> "2"),   ); 



foreach ($info as $key => $row) {
    $rank[$key]  = $row[rank];
    $name[$key] = $row['name'];
}
array_multisort($rank, SORT_DESC, $name, SORT_ASC, $info);
print_r($info);

?>

Comments

1

You can define your own sort function:

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

uasort($info, "cmp");

Note that I used uasort not usort, that's because of maintaining keys. Check documentation for more info.

1 Comment

You don't need to return -1 and 1, you can just return the boolean of whether $a['Rank'] > $b['Rank'].
0

You wanted to order it based on the rank, I guess.

Here's the code,

$result = $info;

for ($i = 0; $i < count($result); $i++)
{
    for ($j = 0; $j < $i; $j++)
    {
        //sorting based on rank
        if($result[$i]["Rank"] < $result[$j]["Rank"])
        {
            //Swapping rank
            $rank = $result[$i]["Rank"];
            $result[$i]["Rank"] = $result[$j]["Rank"];
            $result[$j]["Rank"] =$rank;

            //Swapping corresponding Names
            $name = $result[$i]["Name"];
            $result[$i]["Name"] = $result[$j]["Name"];
            $result[$j]["Name"] =$name;
        }       
    }
}

Comments

-1
$rank = array();
foreach ($result as $key => $row)
{
    $rank[$key] = $row['rank'];
}
array_multisort($rank, SORT_DESC, $result);

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.