# uasort

(PHP 4, PHP 5, PHP 7, PHP 8)

uasortOrdena un array con una función de comparación definida por el usuario y mantiene la asociación de índices

### Descripción

uasort(array `&\$array`, callable `\$value_compare_func`): bool

Esta función ordena un array tal que los índices de array mantienen sus correlaciones con los elementos del array con los que están asociados, usando una función de comparación definida por el usuario.

Se usa pricipalmente cuando se ordenan arrays asociativos donde el orden del elemento mismo es significante.

Nota:

Si dos miembros se comparan como iguales, su orden relativo en el array oredenado será indefinido.

### Parámetros

`array`

`value_compare_func`

Véase usort() y uksort() para ejemplos de funciones de comparación definidas por el usuario.

### Valores devueltos

Devuelve `true` en caso de éxito o `false` en caso de error.

### Ejemplos

Ejemplo #1 Ejemplo básico de uasort()

``` <?php// Función de comparaciónfunction cmp(\$a, \$b) {    if (\$a == \$b) {        return 0;    }    return (\$a < \$b) ? -1 : 1;}// Array a ser ordenado\$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);print_r(\$array);// Ordenar e imprimir el array resultanteuasort(\$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
)
```

### Ver también add a note

### User Contributed Notes 19 notes

139
magikMaker
11 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')); ?> ```
26
yannick dot battail at gmail dot com
11 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);?>returnsArray(     => Orange6     => Orange9     => Orange10     => Orange11     => Orange15) ```
35
php at clement dot hk
8 years ago
``` If you want to keep the order when two members compare as equal, use this.<?phpfunction stable_uasort(&\$array, \$cmp_function) {    if(count(\$array) < 2) {        return;    }    \$halfway = count(\$array) / 2;    \$array1 = array_slice(\$array, 0, \$halfway, TRUE);    \$array2 = array_slice(\$array, \$halfway, NULL, TRUE);    stable_uasort(\$array1, \$cmp_function);    stable_uasort(\$array2, \$cmp_function);    if(call_user_func(\$cmp_function, end(\$array1), reset(\$array2)) < 1) {        \$array = \$array1 + \$array2;        return;    }    \$array = array();    reset(\$array1);    reset(\$array2);    while(current(\$array1) && current(\$array2)) {        if(call_user_func(\$cmp_function, current(\$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 : 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);?>returnsArray(    [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 ```
alf at prisguide dot no
5 years ago
``` User "php at clement dot hk" already provided a stable uasort function, but I find this wrapper much shorter and easier to understand:https://github.com/vanderlee/PHP-stable-sort-functions/blob/master/classes/StableSort.phpfunction stable_uasort(array &\$array, \$value_compare_func) {    \$index = 0;    foreach (\$array as &\$item) {        \$item = array(\$index++, \$item);    }    \$result = uasort(\$array, function(\$a, \$b) use(\$value_compare_func) {        \$result = call_user_func(\$value_compare_func, \$a, \$b);        return \$result == 0 ? \$a - \$b : \$result;    });    foreach (\$array as &\$item) {        \$item = \$item;    }    return \$result;} ```
Anonymous
8 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 != \$b)return (\$a < \$b) ? -1 : 1;    return (\$a < \$b) ? -1 : 1;});foreach(\$tosort as \$k => \$v)  \$values[\$k]=\$v; ```
11
php arobase kochira period com
14 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'),                  2 => array('id' => 'deux', 'aa' => '22'),                   7 => array('id' => 'sept', 'aa' => '77'));  // id sorting  function so (\$a, \$b) { return (strcmp (\$a['id'],\$b['id']));    }?>*** uasort(\$arr, 'so') output:<?php Array (     => Array        (            [id] => cent            [aa] => 100100        )     => Array        (            [id] => deux            [aa] => 22        )     => Array        (            [id] => dix            [aa] => 1010        )     => Array        (            [id] => sept            [aa] => 77        ))?>*** usort(\$arr, 'so') output:<?php Array (     => Array        (            [id] => cent            [aa] => 100100        )     => Array        (            [id] => deux            [aa] => 22        )     => Array        (            [id] => dix            [aa] => 1010        )     => Array        (            [id] => sept            [aa] => 77        ))?> ```
phire_sk
11 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;     } } ?> ```
php at eden2 dot com
18 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() ;) ```
stilgar_cpsNOSPAM at zipmail dot NOSPAMcom dot br
20 years ago
``` Use example: \$array['Fator1']=7; \$array['Fator2']="Name"; \$array['Fator1']=5; \$array['Fator2']="Name"; \$array['Fator1']=7; \$array['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'); ```
iborodikhin at gmail dot com
9 years ago
``` To shuffle assoc array preserving keys just do this: <?php uasort(     \$array,     function (\$a, \$b) {         return mt_rand(0, 1) > 0 ? 1 : -1;     } ); ?> ```
woodongwong at gmail dot com
1 year ago
``` PHP version >= 7 <?php// Comparison functionfunction cmp(\$a, \$b) {    return \$a <=> \$b;}// Array to be sorted\$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 arrayuasort(\$array, 'cmp');print_r(\$array);?>PHP version >= 7.4<?php// Array to be sorted\$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 arrayuasort(\$array, fn(\$a, \$b) => \$a <=> \$b);print_r(\$array);?> ```
JeffZhang
10 months ago
``` A stable sort is realized by merging sorting, like "uasort" but stable, and the code is modified based on "mergesort"<?phpfunction uamergesort(&\$array, \$callback = 'strcmp') {    \$arraycount = count(\$array);    if (\$arraycount < 2) {        return;    }    \$halfway = \$arraycount / 2;    \$array1 = array_slice(\$array, 0, \$halfway, true);    \$array2 = array_slice(\$array, \$halfway, null, true);    \$this->uamergesort(\$array1, \$callback);    \$this->uamergesort(\$array2, \$callback);    \$array = array();    \$ptr1 = \$ptr2 = 0;    \$array1keys = array_keys(\$array1);    \$array1 = array_values(\$array1);    \$array2keys = array_keys(\$array2);    \$array2 = array_values(\$array2);    \$array1count = count(\$array1);    \$array2count = count(\$array2);    while (\$ptr1 < \$array1count && \$ptr2 < \$array2count) {        if (call_user_func(\$callback, \$array1[\$ptr1], \$array2[\$ptr2]) < 1) {            \$array[\$array1keys[\$ptr1]] = \$array1[\$ptr1];            \$ptr1++;        } else {            \$array[\$array2keys[\$ptr2]] = \$array2[\$ptr2];            \$ptr2++;        }    }    while (\$ptr1 < \$array1count) {\$array[\$array1keys[\$ptr1]] = \$array1[\$ptr1]; \$ptr1++;}    while (\$ptr2 < \$array2count) {\$array[\$array2keys[\$ptr2]] = \$array2[\$ptr2]; \$ptr2++;}    return;}?> ```
bpolaszek at gmail dot com
4 years ago
``` Keep in mind that PHP sorting functions are not reliable to handle "stable sorting", even since PHP7+.It might work on small arrays, but not on "big" ones (100 items are enough for the stable sorting to fail).<?php\$a = array_fill(0, 100, 'foo');\$b = \$a;var_dump(\$b === \$a); // bool(true)uasort(\$a, function () {    return 0; // Consider all items are the same});var_dump(\$b === \$a); // bool(false)?>To ensure \$b === \$a, use a 3rd-party stable sorting function:http://php.net/manual/en/function.uasort.php#121283 ```
-1
lixuss at gmail dot com
2 years ago
``` Here is a bug fix for "php at clement dot hk" stable_uasort(&\$array, \$cmp_function)The implementation has problems with "0" values, because while() cycle stops on current() returning value "0" which is considered false. The condition must be !== falseJust fix those 3 lines:while(current(\$array1) && current(\$array2)) => while(current(\$array1)!==false && current(\$array2)!==false)while(current(\$array1)) => while(current(\$array1)!==false)while(current(\$array2)) => while(current(\$array1)!==false) ```
ayaou dot mohammed at gmail dot com
6 years ago
``` // Anonumous functionsuasort(\$collection, array(\$this, function(\$a, \$b){     //logic})); ```
paul at webtop-designs dot com
12 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
19 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. ```
-1
Said Dashuk
10 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]));} ?> ```
-3
naholyr at yahoo dot fr
19 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=javaname=Kernighan    language=cname=Lerdorf    language=phpname=Stroustrup    language=c++ ``` 