在 php 中,按自定義順序對數組排序有兩種方式:自定義比較器:實現 comparable 接口并指定兩個對象的比較規則。匿名函數:創建無名函數作為自定義比較器,用于比較兩個對象的標準。
PHP 數組高級排序:自定義比較器和匿名函數
在 PHP 中,按自定義順序對數組進行排序需要超出標準排序函數所能提供的功能。自定義比較器和匿名函數提供了比 sort()
、rsort()
等內置函數更靈活的排序機制。
自定義比較器
自定義比較器是一種實現 Comparable
接口的類,它定義了如何比較兩個對象。實現 compareTo()
方法,指定哪個對象被認為大于、小于或等于另一個對象。
class CustomComparator implements Comparable { public function compareTo($a, $b): int { if ($a == $b) { return 0; } return $a > $b ? 1 : -1; } }
登錄后復制
匿名函數
匿名函數是未命名的函數,可以即時創建并作為參數傳遞。它們常用于創建自定義比較器:
$comparator = function($a, $b) { if ($a == $b) { return 0; } return $a > $b ? 1 : -1; };
登錄后復制
實戰案例
考慮一個包含學生姓名和分數的數組:
$students = [ ['name' => 'Alice', 'score' => 85], ['name' => 'Bob', 'score' => 90], ['name' => 'Carol', 'score' => 80], ];
登錄后復制
自定義比較器方式
$comparator = new CustomComparator(); usort($students, [$comparator, 'compareTo']);
登錄后復制
匿名函數方式
usort($students, function($a, $b) { return $a['score'] <=> $b['score']; });
登錄后復制
以上代碼將按學生分數從小到大對數組進行排序:
[ ['name' => 'Carol', 'score' => 80], ['name' => 'Alice', 'score' => 85], ['name' => 'Bob', 'score' => 90], ];
登錄后復制