Лог c в вашем uasort()
имеет лог c, который позволяет выполнять меньшее общее сравнение и, следовательно, (при условии, что правила сортировки дают ожидаемый результат), выполняется с более высокой эффективностью.
PHP s uasort()
использует Quicksort , насколько я могу судить, но в документах говорится, что вы не должны полагаться на этот факт (возможно, в случае, если он изменится в будущем). SO reference .
Вот demo , который показывает, что вызов сортировки выполняет только достаточно сравнений, чтобы потенциально разорвать все связи. Использование трехстороннего сравнения оказывается более дорогостоящим, поскольку требуется больше сравнений, но, скорее всего, из-за инструкций сортировки будет получен другой тип сортировки.
$array = [
['id' => 1, 'sort_code' => 4],
['id' => 2, 'sort_code' => 2],
['id' => 3],
['id' => 4, 'sort_code' => 8],
['id' => 5],
['id' => 6, 'sort_code' => 6]
];
uasort($array, function($a, $b) {
echo "\n({$a['id']} -vs- {$b['id']}) " , ($a['sort_code'] ?? 'undeclared') , " -vs- " , ($b['sort_code'] ?? 'undeclared') , " eval: ";
echo $eval = (int)(isset($a['sort_code']) && isset($b['sort_code']) && $a['sort_code'] > $b['sort_code']);
return $eval;
});
echo "\n---\n";
var_export($array);
echo "\n======\n";
uasort($array, function($a, $b) {
echo "\n({$a['id']} -vs- {$b['id']}) " , ($a['sort_code'] ?? 'undeclared') , " -vs- " , ($b['sort_code'] ?? 'undeclared') , " eval: ";
echo $eval = (int)(($a['sort_code'] ?? 0) <=> ($b['sort_code'] ?? 0));
return $eval;
});
echo "\n---\n";
var_export($array);
Вывод:
(1 -vs- 2) 4 -vs- 2 eval: 1
(1 -vs- 3) 4 -vs- undeclared eval: 0
(3 -vs- 4) undeclared -vs- 8 eval: 0
(4 -vs- 5) 8 -vs- undeclared eval: 0
(5 -vs- 6) undeclared -vs- 6 eval: 0
---
array (
1 =>
array (
'id' => 2,
'sort_code' => 2,
),
0 =>
array (
'id' => 1,
'sort_code' => 4,
),
2 =>
array (
'id' => 3,
),
3 =>
array (
'id' => 4,
'sort_code' => 8,
),
4 =>
array (
'id' => 5,
),
5 =>
array (
'id' => 6,
'sort_code' => 6,
),
)
======
(2 -vs- 1) 2 -vs- 4 eval: -1
(1 -vs- 3) 4 -vs- undeclared eval: 1
(2 -vs- 3) 2 -vs- undeclared eval: 1
(1 -vs- 4) 4 -vs- 8 eval: -1
(4 -vs- 5) 8 -vs- undeclared eval: 1
(1 -vs- 5) 4 -vs- undeclared eval: 1
(2 -vs- 5) 2 -vs- undeclared eval: 1
(3 -vs- 5) undeclared -vs- undeclared eval: 0
(4 -vs- 6) 8 -vs- 6 eval: 1
(1 -vs- 6) 4 -vs- 6 eval: -1
---
array (
2 =>
array (
'id' => 3,
),
4 =>
array (
'id' => 5,
),
1 =>
array (
'id' => 2,
'sort_code' => 2,
),
0 =>
array (
'id' => 1,
'sort_code' => 4,
),
5 =>
array (
'id' => 6,
'sort_code' => 6,
),
3 =>
array (
'id' => 4,
'sort_code' => 8,
),
)