Cara Meyortir Array Dalam PHP



Menyortir array selalu lebih mudah untuk mengambil sepotong informasi tertentu dari data yang diurutkan, jika tidak, Anda harus melalui setiap elemen array satu per satu. Sebagai contoh, katakanlah Anda telah menyimpan skor siswa yang berbeda di kelas dalam sebuah array atau tabel. 

Jika data tidak diurutkan berdasarkan skor yang diperoleh, Anda harus melihat skor setiap siswa di kelas sebelum Anda dapat menentukan siapa yang memperoleh skor tertinggi dan terendah. Jika tabel sudah diurutkan rendah ke tinggi berdasarkan skor, hanya dengan melihat skor siswa pertama akan memberi tahu Anda nilai terendah.

Penyortiran membuat banyak tugas yang memerlukan akses atau memperoleh serangkaian data tertentu sangat mudah dan efisien. Dalam tutorial ini, kita akan belajar cara menggunakan fungsi PHP bawaan untuk mengurutkan berbagai jenis array.


Menyortir Array berdasar Value


Mengurutkan array berdasarkan value/nilai elemen-elemennya sangat mudah di PHP. Anda dapat memilih untuk mempertahankan atau membuang key-value associations, dan Anda juga dapat menentukan fungsi Anda sendiri untuk menentukan bagaimana elemen diurutkan. Saya akan menunjukkan caranya pada bagian tutorial ini.


Baca Juga : Memahami Array Pada PHP

Anda dapat menggunakan fungsi sort(&$array, $sort_flags) untuk mengurutkan nilai-nilai array dari rendah ke tinggi. Namun, itu tidak akan mempertahankan key-value associations saat menyortir array. 

Key baru ditugaskan untuk elemen yang diurutkan alih-alih penyusunan ulang sederhana. Parameter kedua opsional memungkinkan Anda menentukan bagaimana elemen harus diurutkan. Itu dapat memiliki enam nilai yang berbeda:


  1. SORT_REGULAR — Ini akan mengurutkan nilai tanpa mengubah tipenya.
  2. SORT_NUMERIC — Ini akan mengurutkan nilai dengan membandingkannya secara numerik.
  3. SORT_STRING — Ini akan mengurutkan nilai dengan membandingkannya sebagai string.
  4. SORT_LOCALE_STRING — Ini akan membandingkan nilai sebagai string berdasarkan lokal saat ini. Anda dapat memperbarui lokal sendiri dengan menggunakan setlocale().
  5. SORT_NATURAL — Ini akan mengurutkan item menggunakan "natural ordering" sambil membandingkannya sebagai string.
  6. SORT_FLAG_CASE — Ini dapat dikombinasikan dengan SORT_STRING atau SORT_NATURAL untuk mematikan sensitivitas huruf besar sambil menyortir string.


Berikut adalah beberapa contoh penyortiran untuk membantu Anda dengan cepat memahami perbedaan antara semua flag sort.

1:  <?php  
2:  $random_data = [32508, 98134, "234984", "3249832", "38", 123, "Apple"];  
3:  sort($random_data);  
4:  echo "Regular Sorting — ";  
5:  foreach($random_data as $element) {  
6:    echo str_pad($element, 9)." ";  
7:  }  
8:  // Regular Sorting — 38    123    32508   98134   234984  3249832  Apple  
9:  sort($random_data, SORT_NUMERIC);  
10:  echo "\nNumeric Sorting — ";  
11:  foreach($random_data as $element) {  
12:    echo str_pad($element, 9)." ";  
13:  }  
14:  // Numeric Sorting — Apple   38    123    32508   98134   234984  3249832  
15:  sort($random_data, SORT_STRING);  
16:  echo "\nString Sorting  — ";  
17:  foreach($random_data as $element) {  
18:    echo str_pad($element, 9)." ";  
19:  }  
20:  // String Sorting  — 123    234984  3249832  32508   38    98134   Apple  

Dalam contoh, pengurutan reguler, string numerik dikonversi ke nilai numeriknya dan pengurutan dilakukan sesuai. String "Apple" adalah non-numerik sehingga tidak tersentuh dan dibandingkan sebagai string.

Pada contoh kedua, pengurutan numerik, kita ingin data diurutkan berdasarkan nilai numerik sehingga "Apple" dikonversi ke nilai numerik 0 dan yang lebih dulu. Sisa nilai diurutkan seperti yang diharapkan.

Pada contoh ketiga, semua nilai diperlakukan sebagai string. Ini berarti bahwa alih-alih membandingkan nilai numerik 123 atau 3249832 dengan 38, itu dibandingkan sebagai string, satu karakter pada satu waktu. Karena "1" muncul sebelum "3", nilai 123 dianggap lebih rendah dari 38.

Jika Anda ingin mengurutkan nilai array Anda dari tinggi ke rendah alih-alih rendah ke tinggi, Anda dapat melakukannya dengan bantuan fungsi rsort(). Ini menerima semua parameter yang sama seperti sort() tetapi mengurutkan nilai dalam urutan terbalik. Itu juga tidak memelihara key-value associations, jadi itu bukan pilihan yang baik untuk mengurutkan associative array.

Sortir Array Associative


Key value associations menjadi penting ketika Anda berurusan dengan array Associative. Pertimbangkan contoh berikut di mana array Associative digunakan untuk menyimpan nama orang yang berbeda dan buah favorit mereka. Jika Anda ingin mengurutkan daftar berdasarkan abjad dengan nama buah-buahan, menggunakan fungsi sort() dari bagian sebelumnya akan mengakibatkan hilangnya associated keys.

1:  <?php  
2:  $fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];  
3:  echo "Before Sorting — \n";  
4:  foreach($fruit_preferences as $person=>$preference) {  
5:    echo $person." likes ".$preference."\n";  
6:  }  
7:  /*  
8:  Before Sorting —   
9:  James likes Orange  
10:  John likes Banana  
11:  Patricia likes Apple  
12:  Jennifer likes Mango  
13:  Mary likes Grapes  
14:  */  
15:  sort($fruit_preferences);  
16:  echo "After Sorting — \n";  
17:  foreach($fruit_preferences as $person=>$preference) {  
18:    echo $person." likes ".$preference."\n";  
19:  }  
20:  /*  
21:  After Sorting —   
22:  0 likes Apple  
23:  1 likes Banana  
24:  2 likes Grapes  
25:  3 likes Mango  
26:  4 likes Orange  
27:  */  
28:  ?>  

Seperti yang Anda lihat, kita tidak hanya kehilangan pergaulan orang dengan buah favorit mereka, kita juga kehilangan nama-nama orang yang berbeda. Setiap nilai yang diurutkan telah diberi indeks numerik baru berdasarkan posisinya di array yang diurutkan.

Untuk membantu Anda mengatasi masalah ini dengan mudah, PHP memiliki dua fungsi berbeda yang mempertahankan key-value association sambil mengurutkan array berdasarkan value/nilainya. Dua fungsi ini adalah asort() dan arsort(). Cuplikan kode berikut mengurutkan array $fruit_preferences yang sama tetapi menggunakan asort() untuk melakukannya.
1:  <?php  
2:  $fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];  
3:  echo "Before Sorting — \n";  
4:  foreach($fruit_preferences as $person=>$preference) {  
5:    echo $person." likes ".$preference."\n";  
6:  }  
7:  /*  
8:  Before Sorting —   
9:  James likes Orange  
10:  John likes Banana  
11:  Patricia likes Apple  
12:  Jennifer likes Mango  
13:  Mary likes Grapes  
14:  */  
15:  asort($fruit_preferences);  
16:  echo "After Sorting — \n";  
17:  foreach($fruit_preferences as $person=>$preference) {  
18:    echo $person." likes ".$preference."\n";  
19:  }  
20:  /*  
21:  After Sorting —   
22:  Patricia likes Apple  
23:  John likes Banana  
24:  Mary likes Grapes  
25:  Jennifer likes Mango  
26:  James likes Orange  
27:  */  
28:  ?>  

Seperti yang terlihat dari contoh di atas, nilai Apple bergerak ke atas sambil tetap mempertahankan hubungannya dengan Patricia. Nama buah dapat diurutkan secara terbalik dengan mudah menggunakan fungsi arsort().

Kedua fungsi ini menerima flag sorting yang sama dengan nilai parameter kedua opsional mereka sebagai sort() dan rsort().

Mengurutkan Elemen Array berdasarkan Nilai dengan Fungsi yang Ditentukan Pengguna
Keempat fungsi penyortiran dapat dengan mudah menangani kebutuhan penyortiran umum Anda dengan bantuan berbagai flag. Namun, terkadang kriteria Anda untuk membandingkan elemen array mungkin berbeda.

Katakanlah Anda memiliki array kata-kata acak yang perlu disortir berdasarkan abjad. Namun, Anda juga ingin mengurutkannya berdasarkan panjangnya sebelum mengurutkannya berdasarkan abjad. Sebagai contoh, zoo akan muncul setelah apple dalam penyortiran alfabet tradisional. Namun, jika ingin menunjukkan kata-kata pendek sebelum yang lebih panjang, zoo akan muncul sebelum apple. Dalam kumpulan huruf yang sama, ape akan datang sebelum zoo karena urutan abjad.

Pada dasarnya, kata-kata diurutkan terlebih dahulu berdasarkan panjangnya dan kemudian kata-kata dengan jumlah huruf yang sama diurutkan secara alfabet dalam kelompok mereka sendiri. Jenis penyortiran ini tidak dibangun ke dalam PHP sehingga kita harus menulis fungsi penyortiran kita sendiri.

Apa yang dilakukan PHP dalam kasus ini adalah memberi Anda beberapa fungsi yang dapat digunakan untuk melewatkan array yang ingin Anda urutkan bersama dengan nama fungsi penyortiran Anda sendiri.

Anda dapat menggunakan usort() function untuk mengurutkan nilai array dalam array reguler. Demikian pula, Anda dapat menggunakan fungsi uasort() untuk mengurutkan nilai dalam array asosiatif sambil juga mempertahankan key-value associations.

Cuplikan kode di bawah ini menunjukkan salah satu cara untuk menyelesaikan behavior ini.

1:  <?php  
2:  $random_words = ["ape", "apple", "zoo", "pie", "elephant", "banana", "picnic", "eye"];  
3:  sort($random_words);  
4:  echo "Regular Sort Function: \n";  
5:  foreach($random_words as $element) {  
6:    echo str_pad($element, 9)." ";  
7:  }  
8:  /*  
9:  Regular Sort Function:   
10:  ape    apple   banana  elephant eye    picnic  pie    zoo  
11:  */  
12:  function custom_sort($word_a, $word_b) {  
13:    if (strlen($word_a) < strlen($word_b)) {  
14:      return -1;  
15:    }  
16:    if (strlen($word_a) == strlen($word_b)) {  
17:      return strcmp($word_a, $word_b);  
18:    }  
19:    if (strlen($word_a) > strlen($word_b)) {  
20:      return 1;  
21:    }  
22:  }  
23:  usort($random_words, "custom_sort");  
24:  echo "\nCustom Sort Function: \n";  
25:  foreach($random_words as $element) {  
26:    echo str_pad($element, 9)." ";  
27:  }  
28:  /*  
29:  Custom Sort Function:   
30:  ape    eye    pie    zoo    apple   banana  picnic  elephant  
31:  */  
32:  ?>  

Dalam fungsi panggilan balik callback yang dimaksudkan untuk penyortiran khusus, kita harus mengembalikan bilangan bulat kurang dari 0 untuk menunjukkan bahwa nilai pertama lebih kecil dari yang kedua. Kembalikan 0 jika nilai pertama sama dengan yang kedua. Kembalikan bilangan bulat lebih besar dari 0 jika nilai pertama lebih besar dari kedua.

Karena kriteria penyortiran utama kita adalah panjang string, kita langsung mengembalikan -1 jika kata pertama lebih pendek dari yang kedua. Demikian pula, kita langsung mengembalikan 1 jika kata pertama lebih panjang dari yang kedua. Jika kedua kata sama panjangnya, kita membandingkannya secara alfabet menggunakan strcmp() function dan mengembalikan nilainya.

Seperti yang Anda lihat di output, fungsi sortir kustom kita menata ulang kata-kata persis seperti yang kita inginkan.

Penyortiran Array dengan Key


Mengurutkan array berdasarkan kuncinya umumnya berguna ketika Anda berurusan dengan array asosiatif. Misalnya, Anda mungkin memiliki array dengan informasi tentang jumlah bandara di berbagai negara. Dengan asumsi bahwa nama-nama negara yang berbeda adalah kunci dan jumlah bandara adalah nilai/array, Anda mungkin ingin mengurutkan nama negara secara alfabet. Ini sangat mudah dilakukan dengan fungsi ksort() dan krsort(). Kedua fungsi ini akan mempertahankan key-value association elemen array setelah pengurutan. Fungsi ksort() mengurutkan kunci dari rendah ke tinggi dan krsort() mengurutkan kunci dari tinggi ke rendah.

Berikut adalah contoh penyortiran dasar:

1:  <?php  
2:  $airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];  
3:  ksort($airport_count);  
4:  foreach($airport_count as $country=>$count) {  
5:    echo str_pad($country, 15)." ".$count."\n";  
6:  }  
7:  /*  
8:  Argentina    1138  
9:  Bolivia     855  
10:  Brazil     4093  
11:  Canada     1467  
12:  Colombia    836  
13:  Indonesia    673  
14:  Mexico     1714  
15:  Paraguay    799  
16:  Russia     1218  
17:  United States  13513  
18:  */  
19:  ?>  

Anda juga dapat menyediakan PHP tanpa custom function Anda sendiri untuk menyortir array key menggunakan fungsi uksort(). Sama seperti usort(), fungsi callback di uksort() juga mengharuskan Anda mengembalikan bilangan bulat kurang dari 0 jika kunci pertama dianggap kurang dari yang kedua dan bilangan bulat lebih besar dari 0 jika kunci pertama lebih besar dari yang kedua. Fungsi ini juga memelihara key-value association dari elemen array.

1:  <?php  
2:  $airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];  
3:  function custom_sort($word_a, $word_b) {  
4:    if (strlen($word_a) < strlen($word_b)) {  
5:      return -1;  
6:    }  
7:    if (strlen($word_a) == strlen($word_b)) {  
8:      return strcmp($word_a, $word_b);  
9:    }  
10:    if (strlen($word_a) > strlen($word_b)) {  
11:      return 1;  
12:    }  
13:  }  
14:  uksort($airport_count, "custom_sort");  
15:  foreach($airport_count as $country=>$count) {  
16:    echo str_pad($country, 15)." ".$count."\n";  
17:  }  
18:  /*  
19:  Brazil     4093  
20:  Canada     1467  
21:  Mexico     1714  
22:  Russia     1218  
23:  Bolivia     855  
24:  Colombia    836  
25:  Paraguay    799  
26:  Argentina    1138  
27:  Indonesia    673  
28:  United States  13513  
29:  */  
30:  ?>  

Dalam contoh di atas, kita telah menggunakan fungsi pengurutan khusus dari bagian sebelumnya untuk mengurutkan nama negara terlebih dahulu dengan panjang nama mereka dan kemudian menurut abjad.

Mengurutkan Array Multi-Dimensi dalam PHP


Adalah jauh lebih umum dalam kehidupan nyata untuk berurusan dengan informasi multi-dimensi. Misalnya, lembaga akan menyimpan nilai semua siswa dalam berbagai mata pelajaran dalam satu tabel alih-alih membuat tabel baru untuk setiap mata pelajaran. Jika Anda harus menyimpan informasi yang sama dalam PHP, Anda juga lebih suka melakukannya menggunakan array multi-dimensi daripada array terpisah untuk setiap subjek.

Dalam tutorial ini, kita akan belajar cara mengurutkan array multi dimensi menggunakan daftar bangunan tertinggi di dunia sebagai contoh. Array kita akan berisi informasi tentang nama bangunan, kota dan negara di mana ia berada, jumlah lantai dan tinggi total dalam meter bersama dengan tahun di mana ia dibangun.

Saat Anda ingin mengurutkan nilai dalam array multi-dimensi berdasarkan bidang tertentu, Anda bisa menggunakan fungsi usort(). Contoh di bawah ini akan membantu Anda memahami teknik ini dengan lebih baik.

1:  <?php  
2:  $tallest_buildings = [  
3:    ["Building" => "Burj Khalifa","City" => "Dubai","Country" => "United Arab Emirates","Height" => 828,"Floors" => 163,"Year" => 2010],  
4:    ["Building" => "Shanghai Tower","City" => "Shanghai","Country" => "China","Height" => 632,"Floors" => 128,"Year" => 2015],  
5:    ["Building" => "Abraj Al-Bait Towers","City" => "Mecca","Country" => "Saudi Arabia","Height" => 601,"Floors" => 120,"Year" => 2012],  
6:    ["Building" => "Ping An Finance Center","City" => "Shenzhen","Country" => "China","Height" => 599,"Floors" => 115,"Year" => 2017],  
7:    ["Building" => "Lotte World Tower","City" => "Seoul","Country" => "South Korea" ,"Height" => 554,"Floors" => 123,"Year" => 2016]  
8:  ];  
9:  function storey_sort($building_a, $building_b) {  
10:    return $building_a["Floors"] - $building_b["Floors"];  
11:  }  
12:  usort($tallest_buildings, "storey_sort");  
13:  foreach($tallest_buildings as $tall_building) {  
14:    list($building, $city, $country, $height, $floors) = array_values($tall_building);  
15:    echo $building." is in ".$city.", ".$country.". It is ".$height." meters tall with ".$floors." floors.\n";  
16:  }  
17:  /*  
18:  Ping An Finance Center is in Shenzhen, China. It is 599 meters tall with 115 floors.  
19:  Abraj Al-Bait Towers is in Mecca, Saudi Arabia. It is 601 meters tall with 120 floors.  
20:  Lotte World Tower is in Seoul, South Korea. It is 554 meters tall with 123 floors.  
21:  Shanghai Tower is in Shanghai, China. It is 632 meters tall with 128 floors.  
22:  Burj Khalifa is in Dubai, United Arab Emirates. It is 828 meters tall with 163 floors.  
23:  */  
24:  ?>  

Dalam contoh di atas, informasi tentang setiap bangunan disimpan dalam array sendiri di dalam array $tallest_buildings utama. Fungsi storey_sort() cukup mengurangi jumlah lantai di gedung kedua dari yang pertama untuk menentukan bangunan mana yang lebih kecil sesuai dengan kriteria kita. Kita tidak perlu khawatir tentang mengembalikan nilai negatif atau positif tertentu karena semua nilai negatif berarti lebih kecil dan semua nilai positif berarti lebih besar.

Pada akhirnya, kita hanya beralih melalui array utama dan mencetak informasi tentang setiap bangunan.

Kesimpulan


Dalam tutorial ini, saya menunjukkan kepada Anda beberapa fungsi berbeda di PHP yang dapat digunakan untuk mengurutkan array dengan kunci atau nilainya. Kita juga belajar cara mengurutkan array dengan kunci atau nilainya menggunakan kriteria pemilahan kustom kita sendiri dengan bantuan fungsi uksrot() dan uasort(). Bagian terakhir membahas bagaimana mengurutkan semua nilai dalam array multi-dimensi hanya menggunakan bidang tertentu.

Saya harap Anda mempelajari sesuatu yang baru dari tutorial ini. Jika Anda memiliki pertanyaan atau saran, beri tahu saya di komentar. Cara terbaik untuk belajar adalah mencoba dan membuat beberapa contoh Anda sendiri, menyortir array dengan menggunakan fungsi-fungsi ini.