(PHP 4, PHP 5, PHP 7, PHP 8)
usort — Sort an array by values using a user-defined comparison function
Sorts array
in place by values using a
user-supplied comparison function to determine the order.
Зауваження:
Якщо два члени порівняння однакові, їхній порядок зберігається. До PHP 8.0.0, їхній відносний порядок у впорядкованому масиві був невизначеним.
Зауваження: Ця функція призначає нові ключі для елементів в масиві
array
. Вона видаляє будь-які наявні ключі, а не просто перевпорядковує їх.
array
The input array.
callback
Порівняльна функція має повертати ціле число, котре менше, рівне або більше нуля, якщо перший параметр вважається відповідно меншим, рівним або більшим за другий.
Завжди повертає true
.
Версія | Опис |
---|---|
8.2.0 |
Тепер повертається значення типу true . До цього був bool.
|
8.0.0 |
Тепер функція видасть E_WARNING , якщо
callback очікує параметр за посиланням.
|
Приклад #1 usort() example
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
Поданий вище приклад виведе:
0: 1 1: 2 2: 3 3: 5 4: 6
The spaceship operator may be used to simplify the internal comparison even further.
<?php
function cmp($a, $b)
{
return $a <=> $b;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
foreach ($a as $key => $value) {
echo "$key: $value\n";
}
?>
Зауваження:
Obviously in this trivial case the sort() function would be more appropriate.
Приклад #2 usort() example using multi-dimensional array
<?php
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}
$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";
usort($fruits, "cmp");
foreach ($fruits as $key => $value) {
echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
When sorting a multi-dimensional array, $a and $b contain references to the first index of the array.
Поданий вище приклад виведе:
$fruits[0]: apples $fruits[1]: grapes $fruits[2]: lemons
Приклад #3 usort() example using a member function of an object
<?php
class TestObj {
public string $name;
function __construct($name)
{
$this->name = $name;
}
/* This is the static comparing function: */
static function cmp_obj($a, $b)
{
return strtolower($a->name) <=> strtolower($b->name);
}
}
$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");
usort($a, [TestObj::class, "cmp_obj"]);
foreach ($a as $item) {
echo $item->name . "\n";
}
?>
Поданий вище приклад виведе:
b c d
Приклад #4 usort() example using a closure to sort a multi-dimensional array
<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');
function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
usort($array, build_sorter('key_b'));
foreach ($array as $item) {
echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
?>
Поданий вище приклад виведе:
y, a x, b z, c
Приклад #5 usort() example using the spaceship operator
The spaceship operator allows for straightforward comparison of
compound values across multiple axes. The following example will sort
$people
by last name, then by first name if the
last name matches.
<?php
$people[0] = ['first' => 'Adam', 'last' => 'West'];
$people[1] = ['first' => 'Alec', 'last' => 'Baldwin'];
$people[2] = ['first' => 'Adam', 'last' => 'Baldwin'];
function sorter(array $a, array $b) {
return [$a['last'], $a['first']] <=> [$b['last'], $b['first']];
}
usort($people, 'sorter');
foreach ($people as $person) {
print $person['last'] . ', ' . $person['first'] . PHP_EOL;
}
?>
Поданий вище приклад виведе:
Baldwin, Adam Baldwin, Alec West, Adam