PHPWales 2020 - June 3rd to June 4th

Dizilerde Sıralama

PHP, dizileri sıralamak için kullanılabilen çeşitli işlevlere sahiptir ve bu belgede bunların kullanımları ele alınmıştır.

Bu işlevler arasındaki başlıca farklar şunlardır:

  • Bazı sıralama işlemleri dizilerin anahtarlarına göre yapılırken bazılarında değerlere göre yapılır: $dizi['anahtar'] = 'değer';
  • Anahtarların sayısal olarak ele alındığı durumda sıralama sonrası anahtarlarla değerleri arasındaki ilişki bozulmuş olabilir de olmayabilir de.
  • Sıralama çeşitleri: abecesel, küçükten büyüğe (artan), büyükten küçüğe (azalan), sayısal, doğal, rasgele, kullanıcı tanımlı
  • Dikkat: Sıralama işlevlerinin hepsi doğrudan dizi üzerinde çalışmazlar; bazıları sonucu başka bir dizide döndürebilir.
  • Bu sıralama işlevlerinin işleme soktuğu üyelerden ikisi birbirine eşitse sıralama istenen sonucu vermeyebilir.

Sıralama işlevleri ve özellikleri
İşlev ismi Sıralama yeri Anahtar değer ilişkisi Sıralama kuralı İlgili işlevler
array_multisort() değer ilişkiselse korunur, sayısalsa korunmaz ilk dizi veya sıralama seçenekleri array_walk()
asort() değer korunur küçükten büyüğe arsort()
arsort() değer korunur büyükten küçüğe asort()
krsort() key korunur büyükten küçüğe ksort()
ksort() key korunur küçükten büyüğe asort()
natcasesort() değer korunur doğal, harf büyüklüğüne duyarsız natsort()
natsort() değer korunur doğal natcasesort()
rsort() değer korunmaz büyükten küçüğe sort()
shuffle() değer korunmaz rasgele array_rand()
sort() değer korunmaz küçükten büyüğe rsort()
uasort() değer korunur kullanıcı tanımlı uksort()
uksort() key korunur kullanıcı tanımlı uasort()
usort() değer korunmaz kullanıcı tanımlı uasort()

add a note add a note

User Contributed Notes 9 notes

"Matthew Rice"
6 years ago
While this may seem obvious, user-defined array sorting functions ( uksort(), uasort(), usort() ) will *not* be called if the array does not have *at least two values in it*.

The following code:                       


function usortTest($a, $b) {
    return -

$test = array('val1');
usort($test, "usortTest");

$test2 = array('val2', 'val3');
usort($test2, "usortTest");


Will output:

string(4) "val3"
string(4) "val2"

The first array doesn't get sent to the function.

Please, under no circumstance, place any logic that modifies values, or applies non-sorting business logic in these functions as they will not always be executed.
oculiz at gmail dot com
8 years ago
Another way to do a case case-insensitive sort by key would simply be:

($array, 'strcasecmp');

Since strcasecmp is already predefined in php it saves you the trouble to actually write the comparison function yourself.
Hayley Watson
3 years ago
Stabilizing the sort functions (in this case, usort).

function stable_usort(&$array, $cmp)
$i = 0;
$array = array_map(function($elt)use(&$i)
        return [
$i++, $elt];
usort($array, function($a, $b)use($cmp)
$cmp($a[1], $b[1]) ?: ($a[0] - $b[0]);
$array = array_column($array, 1);

Tags each array element with its original position in the array so that when the comparison function returns 0 the tie can be broken to put the earlier element first.
shaman_master at list dot ru
2 days ago
Sort by key length:
$array = ['bc' => 'medium', 'a' => 'short', 'abc'=> 'long'];
$keys = array_map('strlen', array_keys($array));
array_multisort($keys, SORT_DESC, $array));
// $array: ['abc' => 'long', 'bc' => 'medium', 'a' => 'short']
luca at lauretta dot info
1 year ago
If you're looking for a quick solution to make usort stable, you could use uksort like in the following example:


($array, function ($ak, $bk) use ($array) {
$a = $array[$ak];
$b = $array[$bk];
    if (
$a['foo'] === $b['foo']) return $ak - $bk;
$a['foo'] > $b['foo'] ? 1 : -1;


This works as expected only if the initial indices (keys) of $array are in ascending order.
bizarrus at icloud dot com
1 year ago
If you wan't to sort JSON based data or an multidimensional object (ascending or descending), you must fetch the array/object keys for sorting - After a sort, you can build a new Object with the correct sorting.

**Example Data:**
= [
'nameZ' => [
'A' => true,
'F'    => true,
'K'    => true
'nameU' => 'Hello World!',
'nameA' => [
'subData' => [
'resultX' => 1,
'resultB' => 4,
'resultI' => 6
'nameK' => [
'testing' => true

function json_sort(&$json, $ascending = true) {
$names = [];
// Creating a named array for sorting
foreach($json AS $name => $value) {
$names[] = $name;
$ascending) {
        } else {
$result = [];
$names AS $index => $name) {
// Sorting Sub-Data
if(is_array($json[$name]) || is_object($json[$name])) {
json_sort($json[$name], $ascending);
$result[$name] = $json[$name];
$json = $result;

($json, true); // Ascending order


($json, false); // Descending order

I had written these method for generating HashValues for an API-Request. The HTTP-Request POST the JSON-Data as Body and over GET-Parameter, an digest/token will be appended to validate the JSON-Data (prevent manipulation of the JSON Data).
monicse09ku at yahoo dot com
4 years ago
// takes an array and desired key value and returns an array
// searches through an array for a given key, if found the key that row is made the first row and the other rows are inserted accordingly.
// the facility of this function is to get the value with a specific key of an array as the first value.

/////////////////////////////// function starts //////////////////////////////

function dksort($array, $case){
        $a[$case] = $array[$case];
        foreach($array as $key=>$val){

                $a[$key] = $array[$key];

    return $a;

$d = array(

$c = dksort($d, '55');

////////////////////////// function ends ////////////////////////////////////////
roger dot vermeir at nokia dot com
4 months ago
I tend to use the following code for adding a sort on the keys when different values have the same key:

= array();
$res = $db->query("some sql");
while (
$row = $res->fetchRow()) {
$key = trim($row[0]);    // I know... 'colname' is better
$value = trim($row[1]);
$arr[$key] = $value . "_" . sprintf('%09d', $key);    // number
foreach (
$arr as $key=>$value_and_key) {
$value, $dummykey) = explode("_", $value_and_key);
"$key and $value"// reverse sorted by value, then key

Appending the key to the value makes arsort a kind of dual sort.
No need for extra user-defined functions...
Roger Vermeir
4 years ago
simple example sorting dotted version numbers

     function sortByVersionnumber($a,$b){
         $ta=explode(".",$a); $tb=explode(".",$b);
         foreach ($ta as $k => $v){
             if (isset($tb[$k])){
                 if($ta[$k] > $tb[$k]) {
                     return 1;
                 } elseif($ta[$k] < $tb[$k]) {
                     return -1;
         return 0;
     function vnksort(&$array){
         uksort($array ,"sortByVersionnumber");
To Top