How to sort an array of arrays by a field
Short answer
usort() with the <=> operator compares the elements by the needed field:
<?php
$users = [['name' => 'Oleg', 'age' => 31], ['name' => 'Anna', 'age' => 25]];
usort($users, fn ($a, $b) => $a['age'] <=> $b['age']);
echo implode(', ', array_column($users, 'name'));Output:
Anna, OlegDescending
Swap $a and $b:
<?php
$users = [['name' => 'Oleg', 'age' => 31], ['name' => 'Anna', 'age' => 25]];
usort($users, fn ($a, $b) => $b['age'] <=> $a['age']);
echo implode(', ', array_column($users, 'name'));Output:
Oleg, AnnaBy several fields
Compare arrays of the needed fields — they are compared in order:
<?php
$users = [['name' => 'Oleg', 'age' => 25], ['name' => 'Anna', 'age' => 31], ['name' => 'Anna', 'age' => 25]];
usort($users, fn ($a, $b) => [$a['name'], $a['age']] <=> [$b['name'], $b['age']]);
echo implode(' ', array_map(fn ($user) => $user['name'] . $user['age'], $users));Output:
Anna25 Anna31 Oleg25Functions used in this recipe
- usort — Sorts an array by a custom comparison rule.
- array_column — Pulls the values of one key out of an array of arrays.
- uasort — Sorts an array by a custom rule, keeping the keys.