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:
- SORT_REGULAR — Ini akan mengurutkan nilai tanpa mengubah tipenya.
- SORT_NUMERIC — Ini akan mengurutkan nilai dengan membandingkannya secara numerik.
- SORT_STRING — Ini akan mengurutkan nilai dengan membandingkannya sebagai string.
- SORT_LOCALE_STRING — Ini akan membandingkan nilai sebagai string berdasarkan lokal saat ini. Anda dapat memperbarui lokal sendiri dengan menggunakan setlocale().
- SORT_NATURAL — Ini akan mengurutkan item menggunakan "natural ordering" sambil membandingkannya sebagai string.
- 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.
Post a Comment
Untuk menyisipkan kode pendek, gunakan <i rel="code"> ... KODE ... </i>
Untuk menyisipkan kode panjang, gunakan <i rel="pre"> ... KODE ... </i>
Untuk menyisipkan gambar, gunakan <i rel="image"> ... URL GAMBAR ... </i>