Ayush Mishra
Ayush Mishra

Reputation: 506

Create an ascending array from array in array

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.

Upvotes: 4

Views: 154

Answers (7)

Logesh G
Logesh G

Reputation: 640

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;
        }       
    }
}

Upvotes: 0

Tahir Yasin
Tahir Yasin

Reputation: 11709

// 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
        )

)

Upvotes: 1

sberry
sberry

Reputation: 132018

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.

Upvotes: 4

somasundaram
somasundaram

Reputation: 139

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

Upvotes: -1

Peter Krejci
Peter Krejci

Reputation: 3192

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.

Upvotes: 1

Hanky Panky
Hanky Panky

Reputation: 46910

<?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);

?>

Upvotes: 1

Haim Evgi
Haim Evgi

Reputation: 125496

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']);
}

Upvotes: 1

Related Questions