Solved

how to sort 2 dimensiona array in php

Posted on 2010-08-18
21
394 Views
Last Modified: 2013-11-10
hi there,

i have put  a lot array into one array called $mPeople, now i would like to sort $mPeople by 'smoker',  any Tips?

Codes related:

//$Human is array which i got from web service.

$mPeople= array();
foreach($Human as $id=>$people) {
 $everyone = array('id'=>$people->mId,'name'=>$people->mName, 'hobby'=>$people->mHobby, 'smoker'=>$people->isSmoker);
 array_push($mPeople,$everyone);
}


thanks,

wantime
0
Comment
Question by:wantime
  • 9
  • 6
  • 2
21 Comments
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 33462715
Use uasort and write your own comparison function

http://www.php.net/uasort

Your comparison function would look something like

function compareArray( $a, $b ) {
     if ( $a['smoker'] < $b['smoker'] )
          return -1;
     else
          if ( $a['smoker'] > $b['smoker'] )
               return 1;

     return 0;
}

and then you would call it like so

uasort( $myArrayToSort, 'compareArray');

(all the above UNTESTED)

For future work you may want to consider this http://www.experts-exchange.com/A_316-Simplify-your-coding---string-handling-in-HTML-&-PHP.html
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 33462742
0
 

Author Comment

by:wantime
ID: 33462766
i have tried following codes, but it doesn|t work, i just get error
Warning: usort() [function.usort]: Invalid comparison function...

public function cmp($a, $b) {
 if (($a[3] == $b[3]) ) {
         return 0;
 } else if ($a[3]){
          return 1;
 } else {
        return -1;
 }
}

 usort($mPeople, "cmp");
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

Author Comment

by:wantime
ID: 33462785
@bportlock

thanks. i  have just readed your comment..

what i want to say is that the $a['smoker']  is a boolean type.
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 33463040
In that case change the comparison function

function compareArray( $a, $b ) {
     if ( $a['smoker'] && !$b['smoker'] )
          return -1;
     else
          if ( !$a['smoker'] && $b['smoker'] )
               return 1;

     return 0;
}
0
 

Author Comment

by:wantime
ID: 33464684
i used

uasort( $mPeople, 'compareArray');

but got the error:

uasort() [function.uasort]: Invalid comparison function...
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 33466841
Check for either a mis-spelling of "compareArray" and that the function is within the scope of the uasort. I usually ensure that functions are declared higher up the program than their point of use.

Also are you doing this in "ordinary code" or in a class? The syntax is different within a class if the comparison function is a member function. It would be

uasort( $mPeople, array( $this, 'compareArray') );

If all else fails, post the code here
0
 

Author Comment

by:wantime
ID: 33472660
the method uasort( $mPeople, 'compareArray'); cause error

"uasort() [function.uasort]: Invalid comparison function...", and when i use

method "uasort( $mPeople, array( $this, 'compareArray') );", i get errorinfo "Application Error"  on the website.

i use the method in one class, the structure looks like following:






<?php
class Model_Person
{

public function compareArray( $a, $b ) {
if ( $a['smoker'] && !$b['smoker'] )
return -1;
else
if ( !$a['smoker'] && $b['smoker'] )
return 1;

return 0;
}

//comment (removed)

public function getInfoFromWS() {

$mPeople = array();

... //get $Human from Web Service

foreach($Human as $id=>$people) {

$everyone = array('id'=>$people->mId,'name'=>$people->mName, 'hobby'=>$people->mHobby, 'smoker'=>$people->isSmoker);
array_push($mPeople,$everyone);
}
//uasort($mPeople, 'compareArray');
uasort( $mPeople, array( $this, 'compareArray') );

}

return $mPeople;
}


}

?>

Open in new window

0
 
LVL 34

Accepted Solution

by:
Beverley Portlock earned 500 total points
ID: 33472947
I modified your code slightly for testing purposes, but it seems OK to me, it certainly runs OK. The modified code is below. Try running it because it works here. If it does not work for you then your problem isn't uasort() it is something else.

Are you on an older version of PHP? Run <?php phpinfo(); ?> to check


<?php
class Model_Person
{
      
   public function compareArray( $a, $b ) {
     if ( $a['smoker'] && !$b['smoker'] )
          return -1;
     else
          if ( !$a['smoker'] && $b['smoker'] )
               return 1;

     return 0;
   }
   
    //comment (removed)
   
    public function getInfoFromWS() {
       
                  $mPeople = array(
                                      array( 'id' => '123', 'name' => 'fred', 'hobby' => 'swimming', 'smoker' => true ),
                                      array( 'id' => '456', 'name' => 'john', 'hobby' => 'runnihg', 'smoker' => false ),
                                      array( 'id' => '789', 'name' => 'mary', 'hobby' => 'horseriding', 'smoker' => true ),
                                      array( 'id' => '555', 'name' => 'bert', 'hobby' => 'flying', 'smoker' => fa ),
                                      array( 'id' => '111', 'name' => 'eddy', 'hobby' => 'reading', 'smoker' => true ),
                                  );
/*                  
                  //... //get $Human from Web Service
            
            foreach($Human as $id=>$people) {
                  
                        $everyone = array('id'=>$people->mId,'name'=>$people->mName, 'hobby'=>$people->mHobby, 'smoker'=>$people->isSmoker);
                        array_push($mPeople,$everyone);
                  }
               //uasort($mPeople, 'compareArray');
*/
           
           uasort( $mPeople, array( $this, 'compareArray') );

        
               
        return $mPeople;
    }


}


$mp = new Model_Person();
print_r( $mp->getInfoFromWS() );
?>

Open in new window

0
 

Author Comment

by:wantime
ID: 33474970
thanks bportlock.
0
 
LVL 9

Expert Comment

by:Snarfles
ID: 33475989
I object to this being deleted on behalf of bportlock who has obviously put in a lot of effort to solve this. If there is some code that shouldn't be public it should be edited out by a mod but the rest of the question should remain and bportlock should get the points.
0
 
LVL 34

Expert Comment

by:Beverley Portlock
ID: 33479994

  :-O

Very kind of you snarfles. I'm speechless and that doesn't happen often.


0
 

Author Comment

by:wantime
ID: 33482641
if one can delete the comment in both codes, that would be nice.
0
 

Author Comment

by:wantime
ID: 33485452
who is the mod and how can i contact with him? i have no right to modify the comment.
0
 
LVL 9

Expert Comment

by:Snarfles
ID: 33495431
Hi Vee Mod

Thanks for your comment. I could have sworn that I clicked an object button and that I filled in a reason for doing so. That being said I've never had a reason to object before so I guess I could have stuffed it up.  

At any rate, this isn't my question, nor am I the person who answered it. I was just monitoring it to learn from it and thought that bportlock deserved the points.

Do you now want me to click 'request attention' or is it fine from now on?

Thanks

Snarfles
0
 

Author Comment

by:wantime
ID: 33498638
hi all,

i have already click the 'request attention' and wrote the reason there. I just wait for mod to edit out the codes.

thanks,

wantime
0
 

Author Comment

by:wantime
ID: 33530240
thanks you for your work!

btw, i never refuse to award points to the Experts, i just wanted to correct the mistake at first.
0

Featured Post

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction HTML checkboxes provide the perfect way for a web developer to receive client input when the client's options might be none, one or many.  But the PHP code for processing the checkboxes can be confusing at first.  What if a checkbox is…
Deprecated and Headed for the Dustbin By now, you have probably heard that some PHP features, while convenient, can also cause PHP security problems.  This article discusses one of those, called register_globals.  It is a thing you do not want.  …
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.

820 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question