欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

PHP uasort() 函数

PHP uasort() 函数

实例

使用用户自定义的比较函数对数组 $arr 中的元素按键值进行排序:

<?php
function my_sort($a,$b)
{
if ($a==$b) return 0;
return ($a<$b)?-1:1;
}

$arr=array("a"=>4,"b"=>2,"c"=>8,d=>"6");
uasort($arr,"my_sort");
?>

运行实例

定义和用法

uasort() 函数使用用户自定义的比较函数对数组排序,并保持索引关联(不为元素分配新的键)。

如果成功则返回 TRUE,否则返回 FALSE。

该函数主要用于对那些单元顺序很重要的结合数组进行排序。

提示:请使用 uksort() 函数通过用户自定义的比较函数对数组按键名进行排序。

语法

uasort(array,myfunction);
参数描述
array必需。规定要进行排序的数组。
myfunction可选。定义可调用比较函数的字符串。如果第一个参数小于等于或大于第二个参数,那么比较函数必须返回一个小于等于或大于 0 的整数。

技术细节

返回值:若成功则返回 TRUE,若失败则返回 FALSE。
PHP 版本:4+

来自 http://www.w3school.com.cn/php/func_array_uasort.asp

PHP uasort() 函数

PHP Array Reference完整的 PHP Array 参考手册

实例

使用用户自定义的比较函数对数组 $arr 中的元素按键值进行排序:

<?php
function my_sort($a,$b)
{
if ($a==$b) return 0;
return ($a<$b)?-1:1;
}

$arr=array("a"=>4,"b"=>2,"c"=>8,d=>"6");
uasort($arr,"my_sort");
?>

运行实例 »

定义和用法

uasort() 使用用户自定义的比较函数对数组按键值进行排序。

提示:请使用 uksort() 函数对数组按键名进行排序,该函数使用用户自定义的比较函数进行排序。

语法

uasort(array,myfunction);

参数描述
array必需。规定要排序的数组。
myfunction可选。一个定义了可调用比较函数的字符串。如果第一个参数 <, =, > 第二个参数,相应地比较函数必须返回一个 <, =, > 0 的整数。

技术细节

返回值:如果成功则返回 TRUE,如果失败则返回 FALSE。
PHP 版本:4+
 

来自  http://www.runoob.com/php/func-array-uasort.html

uasort

(PHP 4, PHP 5, PHP 7)

uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联

说明

bool uasort ( array &$array , callable $cmp_function )

本函数对数组排序并保持索引和单元之间的关联。

主要用于对那些单元顺序很重要的结合数组进行排序。比较函数是用户自定义的。

参数

 

array

输入的数组。

cmp_function

用户自定义比较函数的例子请参考 usort() 和 uksort()

返回值

成功时返回 TRUE, 或者在失败时返回 FALSE

范例

 

Example #1 uasort() 的基本例子

<?php
// Comparison function
function cmp($a$b) {
    if (
$a == $b) {
        return 
0;
    }
    return (
$a $b) ? -1;
}


// Array to be sorted
$array = array('a' => 4'b' => 8'c' => -1'd' => -9'e' => 2'f' => 5'g' => 3'h' => -4);
print_r($array);

// Sort and print the resulting array
uasort($array'cmp');
print_r($array);
?>

以上例程会输出:

Array
(
    [a] => 4
    [b] => 8
    [c] => -1
    [d] => -9
    [e] => 2
    [f] => 5
    [g] => 3
    [h] => -4
)
Array
(
    [d] => -9
    [h] => -4
    [c] => -1
    [e] => 2
    [g] => 3
    [a] => 4
    [f] => 5
    [b] => 8
)

参见

 

add a note add a note

User Contributed Notes 14 notes

magikMaker ¶
6 years ago
a quick reminder on the syntax if you want to use uasort in a Class or Object: 

<?php 

// procedural: 
uasort($collection'my_sort_function'); 

// Object Oriented 
uasort($collection, array($this'mySortMethod')); 

// Objet Oriented with static method 
uasort($collection, array('self''myStaticSortMethod')); 

?>
php at clement dot hk ¶
2 years ago
If you want to keep the order when two members compare as equal, use this.
<?php

function stable_uasort(&$array$cmp_function) {
    if(
count($array) < 2) {
        return;
    }
    
$halfway count($array) / 2;
    
$array1 array_slice($array0$halfwayTRUE);
    
$array2 array_slice($array$halfwayNULLTRUE);

    
stable_uasort($array1$cmp_function);
    
stable_uasort($array2$cmp_function);
    if(
call_user_func($cmp_functionend($array1), reset($array2)) < 1) {
        
$array $array1 $array2;
        return;
    }
    
$array = array();
    
reset($array1);
    
reset($array2);
    while(
current($array1) && current($array2)) {
        if(
call_user_func($cmp_functioncurrent($array1), current($array2)) < 1) {
            
$array[key($array1)] = current($array1);
            
next($array1);
        } else {
            
$array[key($array2)] = current($array2);
            
next($array2);
        }
    }
    while(
current($array1)) {
        
$array[key($array1)] = current($array1);
        
next($array1);
    }
    while(
current($array2)) {
        
$array[key($array2)] = current($array2);
        
next($array2);
    }
    return;
}

function 
cmp($a$b) {
    if(
$a['n'] == $b['n']) {
        return 
0;
    }
    return (
$a['n'] > $b['n']) ? -1;
}


$a $b = array(
    
'a' => array("l" => "A""n" => 1),
    
'b' => array("l" => "B""n" => 2),
    
'c' => array("l" => "C""n" => 1),
    
'd' => array("l" => "D""n" => 2),
    
'e' => array("l" => "E""n" => 2),
);


uasort($a'cmp');
print_r($a);

stable_uasort($b'cmp');
print_r($b);
?>

returns

Array
(
    [e] => Array
        (
            [l] => E
            [n] => 2
        )

    [b] => Array
        (
            [l] => B
            [n] => 2
        )

    [d] => Array
        (
            [l] => D
            [n] => 2
        )

    [c] => Array
        (
            [l] => C
            [n] => 1
        )

    [a] => Array
        (
            [l] => A
            [n] => 1
        )

)
Array
(
    [b] => Array
        (
            [l] => B
            [n] => 2
        )

    [d] => Array
        (
            [l] => D
            [n] => 2
        )

    [e] => Array
        (
            [l] => E
            [n] => 2
        )

    [a] => Array
        (
            [l] => A
            [n] => 1
        )

    [c] => Array
        (
            [l] => C
            [n] => 1
        )
)

https://bugs.php.net/bug.php?id=53341
yannick dot battail at gmail dot com ¶
6 years ago
An Example using anonymous function.
Anonymous functions make some time the code easier to understand.
<?php
$fruits 
= array('Orange9','Orange11','Orange10','Orange6','Orange15');
uasort $fruits , function ($a$b) {
            return 
strnatcmp($a,$b); // or other function/code
        
}
    );

print_r($fruits);
?>
returns
Array
(
    [3] => Orange6
    [0] => Orange9
    [2] => Orange10
    [1] => Orange11
    [4] => Orange15
)
iborodikhin at gmail dot com ¶
4 years ago
To shuffle assoc array preserving keys just do this: 
<?php uasort
    
$array
    function (
$a$b) { 
        return 
mt_rand(01) > : -1
    } 
); 
?>
php arobase kochira period com ¶
8 years ago
Difference between uasort() and usort(), the missing example ...

<?php
  $arr 
= array ( 10 => array('id' => 'dix',  'aa' => '1010'),
                
100 => array('id' => 'cent''aa' => '100100'),
                  
=> array('id' => 'deux''aa' => '22'), 
                  
=> array('id' => 'sept''aa' => '77'));

  
// id sorting
  
function so ($a$b) { return (strcmp ($a['id'],$b['id']));    }
?>

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

<?php Array (
    [
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:

<?php Array (
    [
0] => Array
        (
            [
id] => cent
            
[aa] => 100100
        
)

    [
1] => Array
        (
            [
id] => deux
            
[aa] => 22
        
)

    [
2] => Array
        (
            [
id] => dix
            
[aa] => 1010
        
)

    [
3] => Array
        (
            [
id] => sept
            
[aa] => 77
        
))?>
stilgar_cpsNOSPAM at zipmail dot NOSPAMcom dot br ¶
15 years ago
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']<$ar2['Fator1']) 
      return -1; 
   else if ($ar1['Fator1']>$ar2['Fator1']) 
      return 1; 
   if ($ar1['Fator2']<$ar2['Fator2']) 
      return -1; 
   else if ($ar1['Fator2']>$ar2['Fator2']) 
      return 1; 
   return 0; 


To sort now, we use: 

uasort($array, 'Compare');
php at eden2 dot com ¶
13 years ago
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() ;)
phire_sk ¶
6 years ago
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: 

<?php 
/************************************ 
*    Allows sorting multi-dimensional 
*    arrays by a specific key and in 
*    asc or desc order 
**/ 

class multiSort 

    var 
$key;    //key in your array 

    //runs the sort, and returns sorted array 
    
function run ($myarray$key_to_sort$type_of_sort ''
    { 
        
$this->key $key_to_sort
        
        if (
$type_of_sort == 'desc'
            
uasort($myarray, array($this'myreverse_compare')); 
        else 
            
uasort($myarray, array($this'mycompare')); 
            
        return 
$myarray
    } 
    
    
//for ascending order 
    
function mycompare($x$y
    { 
        if ( 
$x[$this->key] == $y[$this->key] ) 
            return 
0
        else if ( 
$x[$this->key] < $y[$this->key] ) 
            return -
1
        else 
            return 
1
    } 
    
    
//for descending order 
    
function myreverse_compare($x$y
    { 
        if ( 
$x[$this->key] == $y[$this->key] ) 
            return 
0
        else if ( 
$x[$this->key] > $y[$this->key] ) 
            return -
1
        else 
            return 
1
    } 

?>
Said Dashuk ¶
5 years ago
My simple and effective solution for sort multi-dimensional array by any key: 

<?php 
function sort_by_key ($arr,$key) { 
    global 
$key2sort
    
$key2sort $key
    
uasort($arr'sbk'); 
    return (
$arr); 

function 
sbk ($a$b) {global $key2sort; return (strcasecmp ($a[$key2sort],$b[$key2sort]));} 
?>
Anonymous ¶
3 years ago
//this fix the problem of if any of these sort functions evaluates two members as equal then the order is undefined (the sorting is not stable).

$pos=0;
foreach($values as $k => $v)
  $tosort[$k]=array($v,$pos++);
uasort($tosort,function($a, $b) {
  if($a[0] != $b[0])return ($a[0] < $b[0]) ? -1 : 1;
    return ($a[1] < $b[1]) ? -1 : 1;}
);
foreach($tosort as $k => $v)
  $values[$k]=$v[0];
ayaou dot mohammed at gmail dot com ¶
5 months ago
// Anonumous functions
uasort($collection, array($this, function($a, $b){
     //logic
}));
paul at webtop-designs dot com ¶
7 years ago
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. 

<?php 
$dirs 
= array( 
  array(
'name' => 'First Folder''path' => 'sompath'), 
  array(
'name' => 'second folder''path' => 'sompath2'), 
  array(
'name' => 'Third Folder''path' => 'sompath3'
); 

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

?>
dholmes at jccc d0t net ¶
14 years ago
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.
naholyr at yahoo dot fr ¶
13 years ago
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=Gosling    language=java
name=Kernighan    language=c
name=Lerdorf    language=php
name=Stroustrup    language=c++
来自  http://php.net/manual/zh/function.uasort.php
普通分类: