usort

(PHP 4, PHP 5, PHP 7, PHP 8)

usortSort an array by values using a user-defined comparison function

Опис

usort(array &$array, callable $callback): true

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

Порівняльна функція має повертати ціле число, котре менше, рівне або більше нуля, якщо перший параметр вважається відповідно меншим, рівним або більшим за другий.

callback(mixed $a, mixed $b): int
Застереження

Якщо функція порівняння повертає не цілі значення, такі як float, вони будуть приведені до типу int під час повернення з функції зворотнього виклику. Тож значення, схожі на 0.99 або 0.1 будуть приведені до цілого 0, отже члени порівняння вважатимуться однаковими.

Значення, що повертаються

Завжди повертає 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

Прогляньте також