如何按非所有元素都存在的suggest_order值排序PHP数组
按
suggest_order键排序PHP数组(含无键元素处理) 嗨,这问题我熟!要实现按suggest_order升序排序(值越小越靠前),同时处理部分元素没有这个键的情况,咱们可以用PHP的usort()函数配合自定义回调来搞定。
解决方案代码
先看完整的实现:
$array = [ 310 => ['vendorname' => 'Utsav the vendor'], 309 => ['vendorname' => 'Ashish vendor', 'suggest_order' => 1], 308 => ['vendorname' => 'praveen rathod vendor'], 262 => ['vendorname' => 'Yash Vendor', 'suggest_order' => 0], 264 => ['vendorname' => 'amol vendro', 'suggest_order' => 2] ]; // 自定义排序回调 usort($array, function($a, $b) { // 给没有suggest_order的元素设置默认值(用PHP_INT_MAX让它们排最后) $orderA = isset($a['suggest_order']) ? $a['suggest_order'] : PHP_INT_MAX; $orderB = isset($b['suggest_order']) ? $b['suggest_order'] : PHP_INT_MAX; // 升序排序:小的在前 return $orderA - $orderB; }); // 打印结果看看 print_r($array);
代码解释
usort():PHP专门用来做自定义排序的函数,它会直接修改原数组(如果需要保留原数组,可以先复制一份再排序)。- 回调函数里的逻辑:
- 先判断每个元素是否存在
suggest_order键,不存在的话就赋值为PHP_INT_MAX(PHP支持的最大整数),这样没有该键的元素就会自动排在所有有值的元素后面。 - 返回两个元素的
suggest_order差值,正数表示$a要排在$b后面,负数则相反,刚好实现升序排序。
- 先判断每个元素是否存在
调整小技巧
如果你希望没有suggest_order的元素排在最前面,只需要把默认值改成PHP_INT_MIN(最小整数)就行:
$orderA = isset($a['suggest_order']) ? $a['suggest_order'] : PHP_INT_MIN; $orderB = isset($b['suggest_order']) ? $b['suggest_order'] : PHP_INT_MIN;
运行上面的代码,你会得到这样的排序结果:
Array ( [0] => Array ( [vendorname] => Yash Vendor [suggest_order] => 0 ) [1] => Array ( [vendorname] => Ashish vendor [suggest_order] => 1 ) [2] => Array ( [vendorname] => amol vendro [suggest_order] => 2 ) [3] => Array ( [vendorname] => Utsav the vendor ) [4] => Array ( [vendorname] => praveen rathod vendor ) )
内容的提问来源于stack exchange,提问作者Ahmed Syed
相关产品推荐
相关产品推荐

