这个页面非常全面,但我想再补充一点关于宇宙飞船操作符(三向比较操作符)的强大实用程序——PHP7+的一个漂亮的孩子。
使用太空船操作符实现多个排序条件
这在减少代码膨胀和提高可读性方面取得了很大的进步。
当编写自定义sort(usort()/uasort()/uksort())函数来处理多个条件时,只需要在运算符的两侧编写平衡数组并返回结果。没有更多嵌套的条件块或多个返回。
操作符两边的元素将从左到右遍历,一次一个,一旦遇到不连接的元素或元素都进行了比较,就返回求值。
用于演示的示例数据:
$multidimArray = [
'a' => [
'boolean' => true,
'natString' => 'text10',
'object' => (object)['prop' => 2],
'float' => -.5,
'mixed' => []
],
'b' => [
'boolean' => true,
'natString' => 'text12',
'object' => (object)['prop' => 4],
'float' => 0,
'mixed' => null
],
'c' => [
'boolean' => false,
'natString' => 'text100',
'object' => (object)['prop' => 9],
'float' => -.5,
'mixed' => false
],
'd' => [
'boolean' => true,
'natString' => 'text1',
'object' => (object)['prop' => 9],
'float' => -5,
'mixed' => "\0"
],
'e' => [
'boolean' => false,
'natString' => 'text2',
'object' => (object)['prop' => 2],
'float' => .5,
'mixed' => ''
]
];
演示(为了避免Stackoverflow页面膨胀,请查看输出的演示链接):
Sorting logic:
boolean DESC (false = 0, true = 1, so trues before falses)
float ASC
uasort($multidimArray, function($a, $b) {
return [$b['boolean'], $a['float']] <=> [$a['boolean'], $b['float']];
});
Sorting logic:
mixed ASC
object ASC
boolean ASC
uasort($multidimArray, function($a, $b) {
return [$a['mixed'], $a['object']->prop, $a['boolean']] <=> [$b['mixed'], $b['object']->prop, $b['boolean']];
});
Sorting logic:
property count of object ASC
iterability of mixed DESC
natString length ASC
natString ASC
uasort($multidimArray, function($a, $b) {
return [count(get_object_vars($a['object'])), is_iterable($a['mixed']), strlen($a['natString']), $a['natString']]
<=>
[count(get_object_vars($b['object'])), is_iterable($b['mixed']), strlen($b['natString']), $b['natString']];
});
这种语法允许您以优雅的方式对值、函数结果、深层嵌套数据和排序方向进行排序。这绝对值得放在你的php工具带中……用于处理非数据库数据的情况——因为SQL当然是一种更明智的技术。
在PHP7.4中,您可以自行决定对这些匿名函数使用箭头语法。与箭头语法相同的脚本。