There are several ways to sort arrays. Which function to use depends on how you want to sort your array and what kind of array it is.
The sort() function sorts an array by its element values. It should only be used on numeric arrays, because it resets the keys of the array when it sorts. Example 4-24 shows some arrays before and after sorting.
Example 4-24. Sorting with sort()
$dinner = array(‘Sweet Corn and Asparagus’,
‘Lemon Chicken’,
‘Braised Bamboo Fungus’);
$meal = array(‘breakfast’ => ‘Walnut Bun’,
‘lunch’ => ‘Cashew Nuts and White Mushrooms’,
‘snack’ => ‘Dried Mulberries’,
‘dinner’ => ‘Eggplant with Chili Sauce’);
print “Before Sorting:\n”;
foreach ($dinner as $key => $value) {
print “\$dinner: $key $value\n”;
}
foreach ($meal as $key => $value) {
print “\$meal: $key $value\n”;
}
sort($dinner);
sort($meal);
print “After Sorting:\n”;
foreach ($dinner as $key => $value) {
print “\$dinner: $key $value\n”;
}
foreach ($meal as $key => $value) {
print “\$meal: $key $value\n”;
}
Example 4-24 prints:
Before Sorting:
$dinner: 0 Sweet Corn and Asparagus
$dinner: 1 Lemon Chicken
$dinner: 2 Braised Bamboo Fungus
$meal: breakfast Walnut Bun
$meal: lunch Cashew Nuts and White Mushrooms
$meal: snack Dried Mulberries
$meal: dinner Eggplant with Chili Sauce
After Sorting:
$dinner: 0 Braised Bamboo Fungus
$dinner: 1 Lemon Chicken
$dinner: 2 Sweet Corn and Asparagus
$meal: 0 Cashew Nuts and White Mushrooms
$meal: 1 Dried Mulberries
$meal: 2 Eggplant with Chili Sauce
$meal: 3 Walnut Bun
Both arrays have been rearranged in ascending order by element value. The first value in $dinner is now Braised Bamboo Fungus, and the first value in $meal is Cashew Nuts and White Mushrooms. The keys in $dinner haven’t changed because it was a numeric array before we sorted it. The keys in $meal, however, have been replaced by numbers from 0 to 3.
To sort an associative array by element value, use asort(). This keeps keys together with their values. Example 4-25 shows the $meal array from Example 4-24 sorted with asort().
Example 4-25. Sorting with asort()
$meal = array(‘breakfast’ => ‘Walnut Bun’,
‘lunch’ => ‘Cashew Nuts and White Mushrooms’,
‘snack’ => ‘Dried Mulberries’,
‘dinner’ => ‘Eggplant with Chili Sauce’);
print “Before Sorting:\n”;
foreach ($meal as $key => $value) {
print ” \$meal: $key $value\n”;
}
asort($meal);
print “After Sorting:\n”;
foreach ($meal as $key => $value) {
print ” \$meal: $key $value\n”;
}
Example 4-25 prints:
Before Sorting:
$meal: breakfast Walnut Bun
$meal: lunch Cashew Nuts and White Mushrooms
$meal: snack Dried Mulberries
$meal: dinner Eggplant with Chili Sauce
After Sorting:
$meal: lunch Cashew Nuts and White Mushrooms
$meal: snack Dried Mulberries
$meal: dinner Eggplant with Chili Sauce
$meal: breakfast Walnut Bun
The values are sorted in the same way with asort() as with sort(), but this time, the keys stick around.
While sort() and asort() sort arrays by element value, you can also sort arrays by key with ksort(). This keeps key/value pairs together, but orders them by key. Example 4-26 shows $meal sorted with ksort().
Example 4-26. Sorting with ksort()
$meal = array(‘breakfast’ => ‘Walnut Bun’,
‘lunch’ => ‘Cashew Nuts and White Mushrooms’,
‘snack’ => ‘Dried Mulberries’,
‘dinner’ => ‘Eggplant with Chili Sauce’);
print “Before Sorting:\n”;
foreach ($meal as $key => $value) {
print ” \$meal: $key $value\n”;
}
ksort($meal);
print “After Sorting:\n”;
foreach ($meal as $key => $value) {
print ” \$meal: $key $value\n”;
}
Example 4-26 prints:
Before Sorting:
$meal: breakfast Walnut Bun
$meal: lunch Cashew Nuts and White Mushrooms
$meal: snack Dried Mulberries
$meal: dinner Eggplant with Chili Sauce
After Sorting:
$meal: breakfast Walnut Bun
$meal: dinner Eggplant with Chili Sauce
$meal: lunch Cashew Nuts and White Mushrooms
$meal: snack Dried Mulberries
The array is reordered so the keys are now in ascending alphabetical order. Each element is unchanged, so the value that went with each key before the sorting is still attached to the same key after the sorting. If you sort a numeric array with ksort(), then the elements are ordered so the keys are in ascending numeric order. This is the same order you start out with when you create a numeric array using array() or [].
The array-sorting functions sort(), asort(), and ksort() have counterparts that sort in descending order. The reverse-sorting functions are named rsort(), arsort(), and krsort(). They work exactly the same as sort(), asort(), and ksort(), except they sort the arrays so the largest (or alphabetically last) key or value is first in the sorted array, and subsequent elements are arranged in descending order. Example 4-27 shows arsort() in action.
Example 4-27. Sorting with arsort()
$meal = array(‘breakfast’ => ‘Walnut Bun’,
‘lunch’ => ‘Cashew Nuts and White Mushrooms’,
‘snack’ => ‘Dried Mulberries’,
‘dinner’ => ‘Eggplant with Chili Sauce’);
print “Before Sorting:\n”;
foreach ($meal as $key => $value) {
print ” \$meal: $key $value\n“;
}
arsort($meal);
print “After Sorting:\n”;
foreach ($meal as $key => $value) {
print ” \$meal: $key $value\n”;
}
Example 4-27 prints:
Before Sorting:
$meal: breakfast Walnut Bun
$meal: lunch Cashew Nuts and White Mushrooms
$meal: snack Dried Mulberries
$meal: dinner Eggplant with Chili Sauce
After Sorting:
$meal: breakfast Walnut Bun
$meal: dinner Eggplant with Chili Sauce
$meal: snack Dried Mulberries
$meal: lunch Cashew Nuts and White Mushrooms
The arsort() function keeps the association between key and value, just like asort(), but puts the elements in the opposite order (by value). The element whose value begins with W is now first, and the element whose value begins with C is last.
Source: Sklar David (2016), Learning PHP: A Gentle Introduction to the Web’s Most Popular Language, O’Reilly Media; 1st edition.