二维数组排序php array_work,PHP 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联...

本文提供了一系列关于如何使用PHP的uasort函数对多维数组进行排序的示例。这些示例包括了基于不同键值和条件的排序,如字符串、数字、多级排序以及对包含对象的数组进行排序。还讨论了匿名函数、自定义比较函数和处理特殊字符排序的用法。通过这些示例,开发者可以更好地理解如何灵活地对复杂数据结构进行排序。
摘要由CSDN通过智能技术生成

用户评论:

alensflash (2012-12-13 19:54:06)

This code is really taking me along time to put it. I'm an amateur on arrays specially multi-dimensional one (T.T) but thanks to all others in here and there, I finally able to put this code together. So, I hope this little code can help solve your problem too as many others had helped me.

*    This code is Sorting on

*    multi-dimensional array with uasort()

*    $data is 4 Dimensional Array

*

*********************************************/$data= array(

array('attributes'=> array(

array('name'=>'Micrologic','age'=>'2.0'),

array('name'=>'Pole','age'=>'4P')

),'ref'=>'33463E','price'=>'5.500'),

array('attributes'=> array(

array('name'=>'Micrologic','age'=>'2.0'),

array('name'=>'Pole','age'=>'3P')

),'ref'=>'33460E','price'=>'7.500'),

array('attributes'=> array(

array('name'=>'Micrologic','age'=>'5.0'),

array('name'=>'Pole','age'=>'4P')

),'ref'=>'33549E','price'=>'2.500'),

array('attributes'=> array(

array('name'=>'Micrologic','age'=>'5.0'),

array('name'=>'Pole','age'=>'3P')

),'ref'=>'33546E','price'=>'7.500')

);/*** uasort function ***/functioncompareRef($a,$b){

returnstrnatcmp($a['ref'],$b['ref']);

}uasort($data,'compareRef');/*** Print $data ***/echo"--SORT BY REF-- 
";

foreach($dataas$idx=>$prod) {

foreach($prod['attributes'] as$attrib)

echo$attrib['name'].' - '.$attrib['age'].", ";

echo" = ".$prod['ref']." & Rp.".$prod['price']."
";

}?>

(^^)b

iborodikhin at gmail dot com (2012-11-22 08:32:15)

To shuffle assoc array preserving keys just do this:

function ($a,$b) {

returnmt_rand(0,1) >0?1: -1;

}

);?>

Said Dashuk (2011-10-11 22:33:03)

My simple and effective solution for sort multi-dimensional array by any key:

global$key2sort;$key2sort=$key;uasort($arr,'sbk');

return ($arr);

}

functionsbk($a,$b) {global$key2sort; return (strcasecmp($a[$key2sort],$b[$key2sort]));}?>

clem at fragment dot at (2011-08-31 04:57:52)

for a simple case insensitive compare you can use this (php >= 5.3):

$greetings= array('howdy','Hey','aloha he');uasort($a, function($a,$b){ returnstrcasecmp($a,$b); });//$a == array('aloha he', 'howdy', 'Hey');?>

englishman at bigmir dot net (2011-07-02 04:44:58)

In case you need to sort an associative array by one of its keys, this function might be useful:

foreach ($arrayas$id=>$value) {$values[$id] = isset($value[$key]) ?$value[$key] :'';

}

if ($asc) {asort($values);

}

else {arsort($values);

}

foreach ($valuesas$key=>$value) {$result[$key] =$array[$key];

}

return$result;

}?>

Consider the following example:

$users= array(1=> array('name'=>'John','age'=>35),2=> array('name'=>'Alice','age'=>23),3=> array('name'=>'Bob','age'=>26)

);$sortedByNameAsc=sortByOneKey($users,'name');$sortedByNameDesc=sortByOneKey($users,'name',false);

echo"Sorted by Name in ascending order: ";

echo"

".print_r($sortedByNameAsc,true) ."
";

echo"
Sorted by Name in descending order: ";

echo"

".print_r($sortedByNameDesc,true) ."
";?>

The output will be the following:

Sorted by Name in ascending order:

Array

(

[2] => Array

(

[name] => Alice

[age] => 23

)

[3] => Array

(

[name] => Bob

[age] => 26

)

[1] => Array

(

[name] => John

[age] => 35

)

)

Sorted by Name in descending order:

Array

(

[1] => Array

(

[name] => John

[age] => 35

)

[3] => Array

(

[name] => Bob

[age] => 26

)

[2] => Array

(

[name] => Alice

[age] => 23

)

)

yannick dot battail at gmail dot com (2010-11-17 06:37:32)

An Example using anonymous function.

Anonymous functions make some time the code easier to understand.

$fruits= array('Orange9','Orange11','Orange10','Orange6','Orange15');uasort($fruits, function ($a,$b) {

returnstrnatcmp($a,$b);// or other function/code}

);print_r($fruits);?>returns

Array

(

[3] => Orange6

[0] => Orange9

[2] => Orange10

[1] => Orange11

[4] => Orange15

)

magikMaker (2010-10-19 02:48:49)

a quick reminder on the syntax if you want to use uasort in a Class or Object:

Yves (2010-10-08 00:20:34)

Took me some time to figure that out:

the user function must return an *integer*, if you return a float, you may not get the expected result.

$a= ('a'=>0.9,'b'=>0.7,'c'=>0.8);

functionsorting($a,$b) { return$a-$b; }// The function above will not =work, you have tofunctionsorting($a,$b)

{$d=$a=$b;

return$d<0? -1: ($d>0?1:0);

}?>

phire_sk (2010-10-05 14:19:46)

I tried using some of the previous built multisorts, but they weren't working as expected.

So, I made my own Class, and it seems to work wonderfully.

Here is the code:

*    Allows sorting multi-dimensional

*    arrays by a specific key and in

*    asc or desc order

**/classmultiSort{

var$key;//key in your array

//runs the sort, and returns sorted arrayfunctionrun($myarray,$key_to_sort,$type_of_sort='')

{$this->key=$key_to_sort;

if ($type_of_sort=='desc')uasort($myarray, array($this,'myreverse_compare'));

elseuasort($myarray, array($this,'mycompare'));

return$myarray;

}//for ascending orderfunctionmycompare($x,$y)

{

if ($x[$this->key] ==$y[$this->key] )

return0;

else if ($x[$this->key] key] )

return -1;

else

return1;

}//for descending orderfunctionmyreverse_compare($x,$y)

{

if ($x[$this->key] ==$y[$this->key] )

return0;

else if ($x[$this->key] >$y[$this->key] )

return -1;

else

return1;

}

}?>

stephan dot hoyer at netresearch dot de (2010-07-22 05:17:42)

To sort string containing Umlauts you can use this callback function:

{$search= array('?','?','?','?');$replace= array('A','O','U','s');

returnstrcmp(str_ireplace($search,$replace,$s1),str_ireplace($search,$replace,$s2)

);

}?>

simply call:

paul at webtop-designs dot com (2009-11-30 13:40:07)

Just expanding on php arobase kochira period com's method:

If you are looking to sort a multi-D array by a specific column and have entries in both upper and lower case, simply drop the entries to lowercase before doing the strcmp.

$dirs= array(

array('name'=>'First Folder','path'=>'sompath'),

array('name'=>'second folder','path'=>'sompath2'),

array('name'=>'Third Folder','path'=>'sompath3')

);

functionso($a,$b) {

return (strcmp(strtolower($a['name']),strtolower($b['name'])));

}?>

Alt_F4 (2009-10-09 20:34:25)

I couldn't work out a way to specify what element to sort by using the existing php functions - maybe I didn't look hard enough?? So i wrote my own multidimensional array sorting class.

$stock= array(array("id"=>1,"item"=>"hat","number"=>5,"price"=>15),

array("id"=>5,"item"=>"shoes","number"=>1,"price"=>50),

array("id"=>3,"item"=>"tie","number"=>2,"price"=>30));$sort= newmultiSort();//will sort the array by id in ascending orderprint_r($sort->sortArray($stock,'id','rcmp'));//will sort the array by id in descending orderprint_r($sort->sortArray($stock,'id','cmp'));//can also be used like so (specifying the index of the array)print_r($sort->sortArray($stock,'0','rcmp'));//classmultiSort{

functionsortArray($array,$parameter,$_function) { return$this->_uasort($array,$_function,$parameter); }

functioncmp($a,$b,$p) { return (strcmp($a[$p],$b[$p]));}

functionrcmp($a,$b,$p) { return -1* (strcmp($a[$p],$b[$p]));}

function_uasort($array,$func,$param) {

for($i=0;$i

for($j=1;$j$func($array[$tmp],$array[$j],$param);

if($result== -1) {$array=$this->arraySwap($array,$tmp,$j);$tmp=$j;

}

}

}

return$array;

}

functionarrayswap($arr,$src,$dst) {$tmp=$arr[$dst];$arr[$dst] =$arr[$src];$arr[$src] =$tmp;

return$arr;

}

}//?>

hope someone finds this useful.

php arobase kochira period com (2008-06-08 04:13:44)

Difference between uasort() and usort(), the missing example ...

$arr= array (10=> array('id'=>'dix','aa'=>'1010'),100=> array('id'=>'cent','aa'=>'100100'),2=> array('id'=>'deux','aa'=>'22'),7=> array('id'=>'sept','aa'=>'77'));// id sortingfunctionso($a,$b) { return (strcmp($a['id'],$b['id']));    }?>

*** uasort($arr, 'so') output:

[100] => Array

(

[id] =>cent[aa] =>100100)

[2] => Array

(

[id] =>deux[aa] =>22)

[10] => Array

(

[id] =>dix[aa] =>1010)

[7] => Array

(

[id] =>sept[aa] =>77))?>

*** usort($arr, 'so') output:

[0] => Array

(

[id] =>cent[aa] =>100100)

[1] => Array

(

[id] =>deux[aa] =>22)

[2] => Array

(

[id] =>dix[aa] =>1010)

[3] => Array

(

[id] =>sept[aa] =>77))?>

joeseed86 at gmail dot com (2007-01-04 09:54:37)

Using uasort to alphabetically sort nested objects:

In this example, a "collection" object contains an array of "dataItem" objects which consist of a string name, a string attribute x and an arbitrary integer y.

This code allows you to sort the dataset by any of the dataItem attributes, or the order in which they were originally added to the set.

I'm using PHP 4.23 at work at the moment for legacy reasons, so I wrote the example following that object model.

var$name;

var$x;//ConstructorfunctiondataItem($name,$x,$y)

{$this->name=$name;$this->x=$x;$this->y=$y;

}

}

classcollection{

var$dataSet= array();//Creates a new data item and adds it to our arrayfunctionadd($name,$x,$y)

{$this->dataSet[] = newdataItem($name,$x,$y);

}//The wrapper sort functionfunctionsortDataSet($s)

{//Sort by the given parameterswitch($s)

{

case"name"://Note use of array to reference member method of this object in callbackuasort($this->dataSet,array($this,"cmpName"));

break;

case"x":uasort($this->dataSet,array($this,"cmpX"));

break;

case"y":uasort($this->dataSet,array($this,"cmpY"));

break;

case"added":

default://Re-sort array by original keysksort($this->dataSet);

}

}//Callback function for sorting by name

//$a and $b are dataItem objectsfunctioncmpName($a,$b)

{//Use sort() for simple alphabetical comparison

//Convert to lowercase to ensure consistent behaviour$sortable= array(strtolower($a->name),strtolower($b->name));$sorted=$sortable;sort($sorted);//If the names have switched position, return -1. Otherwise, return 1.return ($sorted[0] ==$sortable[0]) ? -1:1;

}//Callback function for sorting by x

//$a and $b are dataItem objectsfunctioncmpX($a,$b)

{//Use sort() for simple alphabetical comparison

//Convert to lowercase to ensure consistent behaviour$sortable= array(strtolower($a->x),strtolower($b->x));$sorted=$sortable;sort($sorted);//If the names have switched position, return -1. Otherwise, return 1.return ($sorted[0] ==$sortable[0]) ? -1:1;

}//Callback function for sorting by y

//$a and $b are dataItem objectsfunctioncmpY($a,$b)

{//If $a's y attribute >= $b's y attribute, return 1. Otherwise, return -1.return ($a->y>=$b->y) ?1: -1;

}

}//Create a collection object$myCollection= newcollection();//Add a few "records"$myCollection->add("pancake","egg",7);$myCollection->add("France","Paris",2);$myCollection->add("Naked Gun","Leslie Nielsen",1);$myCollection->add("OSX","huge icons",33);$myCollection->add("telephone","keypad",-3);//Test the output

//Sort by name:$myCollection->sortDataSet("name");print_r($myCollection->dataSet);//Sort by x$myCollection->sortDataSet("x");print_r($myCollection->dataSet);//Sort by y$myCollection->sortDataSet("y");print_r($myCollection->dataSet);//Sort by order added$myCollection->sortDataSet("added");print_r($myCollection->dataSet);?>

Will give this output (Anotated and re-formatted for ease of reading):

Sorted by name:

France         Paris            2

Naked Gun      Leslie Nielsen   1

OSX            huge icons       33

pancake        egg              7

telephone      keypad          -3

Sorted by x:

pancake        egg              7

OSX            huge icons       33

telephone      keypad          -3

Naked Gun      Leslie Nielsen   1

France         Paris            2

Sorted by y:

telephone      keypad          -3

Naked Gun      Leslie Nielsen   1

France         Paris            2

pancake        egg              7

OSX            huge icons       33

Sorted as added:

pancake        egg              7

France         Paris            2

Naked Gun      Leslie Nielsen   1

OSX            huge icons       33

telephone      keypad          -3

This is obviously a trivial case, but it can be very useful for larger data structures.

rlynch at lynchmarks dot com (2005-05-16 17:36:23)

A subtle bug, corrected...

{

static$sort_funcs= array();

if (empty($sort_funcs[$sortby])) {$code="\$c=0;";

foreach (split(',',$sortby) as$key) {$array=array_pop($data);array_push($data,$array);

if(is_numeric($array[$key]))$code.="if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] 

else$code.="if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return \$c;\n";

}$code.='return $c;';$sort_func=$sort_funcs[$sortby] =create_function('$a, $b',$code);

} else {$sort_func=$sort_funcs[$sortby];

}$sort_func=$sort_funcs[$sortby];uasort($data,$sort_func);

}?>

Note that

$code .= "if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] 

Has had the "return \$c" added.  Ultimately what the method is trying to accomplish is to build a chain of sort-order precedence.  But this requires each evaluation to short-circuit out with a return.  It was missing.

Peace

lucas dot karisny at linuxmail dot org (2005-02-12 18:09:15)

The following is a modification of the dholme/messju masort func using david's float code with automatic data type detection.  As long as the value isn't a string numeral (I.E. "1", '13.4') this should sort strings and numbers without having to explicity set which they are.

{

static$sort_funcs= array();

if (empty($sort_funcs[$sortby])) {$code="\$c=0;";

foreach (split(',',$sortby) as$key) {$array=array_pop($data);array_push($data,$array);

if(is_numeric($array[$key]))$code.="if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] 

else$code.="if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return \$c;\n";

}$code.='return $c;';$sort_func=$sort_funcs[$sortby] =create_function('$a, $b',$code);

} else {$sort_func=$sort_funcs[$sortby];

}$sort_func=$sort_funcs[$sortby];uasort($data,$sort_func);

}?>

siefer at sym dot net (2004-10-04 02:24:48)

Hello naholyr at yahoo dot fr!

should it be

$cmp = create_function('$a, $b', "return $cmp_val;");

?

this works with my arrays ;-)

regards, Christopher

marek at lewczuk dot com (2004-05-27 04:01:22)

Below another array sorting function - you can use many keys, whether order type is ascendant or descendant, if values of given key should be treat as string or numeric, if array keys should be preserved. This function is locale-safe - it means that string sorting will be based on setLocale settings. You should be aware that I did not make comprehensive tests, so be careful...

// my locales

SetLocale(LC_COLLATE,"pl_PL.UTF-8");

SetLocale(LC_CTYPE, "pl_PL.UTF-8");

function Array_Sort ($array, $arguments = Array(), $keys = true) {

// comparing function code

$code = "";

// foreach sorting argument (array key)

foreach ($arguments as $argument) {

// order field

$field = substr($argument, 2, strlen($argument));

// sort type ("s" -> string, "n" -> numeric)

$type = $argument[0];

// sort order ("+" -> "ASC", "-" -> "DESC")

$order = $argument[1];

// add "if" statement, which checks if this argument

should be used

$code .= "if (!Is_Numeric(\$result) || \$result == 0) ";

// if "numeric" sort type

if (strtolower($type) == "n") $code .= $order == "-" ? "\$result = (\$a['{$field}'] > \$b['{$field}'] ? -1 : (\$a['{$field}'] < \$b['{$field}'] ? 1 : 0));" : "\$result = (\$a['{$field}'] > \$b['{$field}'] ? 1 : (\$a['{$field}'] < \$b['{$field}'] ? -1 : 0));";

// if "string" sort type

else $code .= $order == "-" ? "\$result = strcoll(\$a['{$field}'], \$b['{$field}']) * -1;" : "\$result = strcoll(\$a['{$field}'], \$b['{$field}']);";

}

// return result

$code .= "return \$result;";

// create comparing function

$compare = create_function('$a, $b', $code);

// sort array and preserve keys

if ($keys) uasort($array, $compare);

// sort array, but not preserve keys

else usort($array, $compare);

// return array

return $array;

}

Example array:

$array['sdsd'] = array("dir" => 1, "name" => "sas", "olek" => "sdsd");

$array['sds2'] = array("dir" => 2, "name" => "śas", "olek" => "t");

Example - preserve keys:

print_r(Array_Sort($array, Array("s-name", "n-dir", "s+olek")));

Array

(

[sds2] => Array

(

[dir] => 1

[name] => śas

[olek] => t

)

[sdsd] => Array

(

[dir] => 1

[name] => sas

[olek] => sdsd

)

)

Example - without preserving keys:

print_r(Array_Sort($array, Array("s-name", "n-dir", "s+olek")), false);

Array

(

[0] => Array

(

[dir] => 1

[name] => śas

[olek] => t

)

[1] => Array

(

[dir] => 1

[name] => sas

[olek] => sdsd

)

)

Enyoj

david [__at__] castlelaing.com (2004-05-10 09:28:43)

WARNING:-Regarding remmy.cjb.net (22-Oct-2003 05:57) mutisort() function:

Sorting by floating point numbers doesn't work in the current function. Use the modified version below if you want to sort by a floating point column.

// Sorts an array (you know the kind) by key

// and by the comparison operator you prefer.

// Note that instead of most important criteron first, it's

// least important criterion first.

// The default sort order is ascending, and the default sort

// type is strnatcmp.

// function multisort($array[, $key, $order, $type]...)functionmultisort($array)

{

for($i=1;$i

{$key=func_get_arg($i);

if (is_string($key))$key='"'.$key.'"';$order=true;

if($i+1

if($i+2

switch($type)

{

case1:// Case insensitive natural.$t='strcasecmp($a['.$key.'], $b['.$key.'])';

break;

case2:// Numeric.$t='($a['.$key.'] == $b['.$key.']) ? 0:(($a['.$key.'] 

break;

case3:// Case sensitive string.$t='strcmp($a['.$key.'], $b['.$key.'])';

break;

case4:// Case insensitive string.$t='strcasecmp($a['.$key.'], $b['.$key.'])';

break;

default:// Case sensitive natural.$t='strnatcmp($a['.$key.'], $b['.$key.'])';

break;

}

echo$t;usort($array,create_function('$a, $b','; return '. ($order?'':'-') .'('.$t.');'));

}

return$array;

}?>

dn dot php at gmx dot de (2003-11-23 16:34:28)

regarding remmy.cjb.net (22-Oct-2003 05:57) note:

The "multisort" function is not working. Try the following example.

( I hope this and your note will be deleted soon.)

..- Denis

$a= array(

array('c1'=>1,'c2'=>1,'c3'=>1,'c4'=>1),

array('c1'=>1,'c2'=>1,'c3'=>1,'c4'=>2),

array('c1'=>1,'c2'=>1,'c3'=>2,'c4'=>1),

array('c1'=>1,'c2'=>1,'c3'=>2,'c4'=>2)

);

echo('

');print_r(multisort($a,"'c4'",true,2,"'c3'",true,2,"'c2'",true,2,"'c1'",true,2));

echo('');?>

remmy.cjb.net (2003-10-21 23:57:09)

Hope this helps!

- Remmy

// Sorts an array (you know the kind) by key

// and by the comparison operator you prefer.

// Note that instead of most important criteron first, it's

// least important criterion first.

// The default sort order is ascending, and the default sort

// type is strnatcmp.

// function multisort($array[, $key, $order, $type]...)functionmultisort($array)

{

for($i=1;$i

{$key=func_get_arg($i);$order=true;

if($i+1

if($i+2

switch($type)

{

case1:// Case insensitive natural.$t='strcasenatcmp($a['.$key.'], $b['.$key.'])';

break;

case2:// Numeric.$t='$a['.$key.'] - $b['.$key.']';

break;

case3:// Case sensitive string.$t='strcmp($a['.$key.'], $b['.$key.'])';

break;

case4:// Case insensitive string.$t='strcasecmp($a['.$key.'], $b['.$key.'])';

break;

default:// Case sensitive natural.$t='strnatcmp($a['.$key.'], $b['.$key.'])';

break;

}uasort($array,create_function('$a, $b','return '. ($order?'':'-') .'('.$t.');'));

}

return$array;

}$a= array(

array('id'=>1,'name'=>'apple'),

array('id'=>2,'name'=>'orange'),

array('id'=>8,'name'=>'banana'),

array('id'=>8,'name'=>'grapefruit'),

array('id'=>9,'name'=>'smoke'),

array('id'=>1,'name'=>'screen')

);// This works like MYSQL 'ORDER BY id DESC, name ASC'

// Note the quoting of string literal keys.echo('

');print_r(multisort($a,"'name'",true,0,"'id'",false,2));

echo('');?>

cablehead (2003-09-16 09:08:40)

dholmes we turned your masort function into a smarty plugin:

http://www.phpinsider.com/smarty-forum/viewtopic.php?t=1079

messju contributed the following performance improvements.

function masort(&$data, $sortby)

{

static $sort_funcs = array();

if (empty($sort_funcs[$sortby])) {

$code = "\$c=0;";

foreach (split(',', $sortby) as $key) {

$code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return \$c;\n";

}

$code .= 'return $c;';

$sort_func = $sort_funcs[$sortby] = create_function('$a, $b', $code);

} else {

$sort_func = $sort_funcs[$sortby];

}

$sort_func = $sort_funcs[$sortby];

uasort($data, $sort_func);

}

thank you for the cool function!

php at eden2 dot com (2003-07-17 04:36:37)

Is it just me, or are the examples below misleading, and actually demonstrating situations that would be more appropriate for usort()?

After trying to make sense of the uasort() description, it sounds like it's more for sorting a 1D array like this:

"john" => "$23.12"

"tim" => "$6.50"

"bob" => "$18.54"

and getting back:

"tim" => "$6.50"

"bob" => "$18.54"

"john" => $23.12"

(assuming, of course, that your sort function is lopping off the $ and evaluating as a number -- which would complicate the use of asort() ;)

naholyr at yahoo dot fr (2003-01-10 09:35:44)

You can sort a multidimensionnal array by any of its key with this function:

function multi_sort($array, $key)

{

$cmp_val="((\$a['$key']>\$b['$key'])?1:

((\$a['$key']==\$b['$key'])?0:-1))";

$cmp=create_function('$a, $b', "return $body;");

uasort($array, $cmp);

return $array;

}

example:

$myarray = array(

array("name"=>"kernighan", "language"=>"c"),

array("name"=>"lerdorf", "language"=>"php"),

array("name"=>"Stroustrup", "language"=>"c++"),

array("name"=>"Gosling", "language"=>"java")

);

multi_sort($myarray, "name") returns:

name=Goslinglanguage=java

name=Kernighanlanguage=c

name=Lerdorflanguage=php

name=Stroustruplanguage=c++

dholmes at jccc d0t net (2002-10-09 14:27:26)

Here is a little sort function that actually uses a dynamic callback for usort to do it's thing.

It assumes your data is in the form of:

$data = array(

array('ID'=>'6','LAST'=>'Holmes','FIRST'=>'Dan'),

array('ID'=>'1234','LAST'=>'Smith','FIRST'=>'Agent K'),

array('ID'=>'2','LAST'=>'Smith','FIRST'=>'Agent J'),

array('ID'=>'4','LAST'=>'Barney','FIRST'=>'Bob'));

Now, you want to sort on one or more cols, don't you?

masort($data, 'LAST,FIRST');

or

masort($data,array('FIRST','ID'));

Of course you could add a bunch to it (like numeric comparison if appropriate, desc/asc, etc) but it works for me.

function masort(&$data, $sortby){

if(is_array($sortby)){

$sortby = join(',',$sortby);

}

uasort($data,create_function('$a,$b','$skeys = split(\',\',\''.$sortby.'\');

foreach($skeys as $key){

if( ($c = strcasecmp($a[$key],$b[$key])) != 0 ){

return($c);

}

}

return($c); '));

}

Notice that I am splitting the string in the comparison function? While this is certainly slower, it was the only way I would find to "pass" and "array". If anyone has a better way, please suggest. Then inside, we (string) compare the values only moving to the next key if the values are the same...and so on, and so on.

stilgar_cpsNOSPAM at zipmail dot NOSPAMcom dot br (2001-09-05 14:30:18)

Use example:

$array[0]['Fator1']=7;

$array[0]['Fator2']="Name";

$array[1]['Fator1']=5;

$array[1]['Fator2']="Name";

$array[2]['Fator1']=7;

$array[2]['Fator2']="NameDiferente";

.....

We want to order by Fator1, then Fator2, then:

function Compare($ar1, $ar2)

{

if ($ar1['Fator1']

return -1;

else if ($ar1['Fator1']>$ar2['Fator1'])

return 1;

if ($ar1['Fator2']

return -1;

else if ($ar1['Fator2']>$ar2['Fator2'])

return 1;

return 0;

}

To sort now, we use:

uasort($array, 'Compare');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值