写在前面:
开发过程中,对于数组排序经常使用,有时候冒泡、有时候选择、有时候根据指定key….
在日常面试过程中,也会经常有人问到关于数组的排序算法(过来人一般都懂的)
尤其是对于一些做平台、做应用服务的互联网公司,良好的逻辑处理算法,是招人过程中比较注重的一面。
最近在面试求职者,问了一个将二维数组按照指定规则排序的问题? 结果竟然有多位程序员答不上来。。
这里做一分享吧。
方法一:php函数usort
php的usort函数就是用来处理自定义排序的,闭包函数需要两个参数,这两个参数是传入的数组的相邻元素,从数组第0位开始。
代码示例:
usort($arr, function ($a, $b) use ($rule) {
return (array_search($a, $rule) < array_search($b, $rule)) ? –1 : 1;
//将排序规则用use传入闭包函数,如果元素$a在$rule中的位置小于$b在$rule中的位置,则返回-1,反之返回1,
//usort函数会根据闭包函数的返回值将$a和$b的位置进行调整
});
用法示例:
//需要排序的数组 $arr = [ '0' => [ '_id' => 8, '_name'=> '绮梦之旅', ], '1' => [ '_id' => 2, '_name'=> '缥缈峰', ], '2' => [ '_id' => 3, '_name'=> '燃豆萁', ], '3' => [ '_id' => 4, '_name'=> '天书', ], ]; $rule = [3,4,2,8];//指定排序规则数组 usort($arr, function ($a, $b) use ($rule) { return (array_search($a['_id'], $rule) < array_search($b['_id'], $rule)) ? -1 : 1; //将排序规则用use传入闭包函数,如果元素$a在$rule中的位置小于$b在$rule中的位置,则返回-1,反之返回1, //usort函数会根据闭包函数的返回值将$a和$b的位置进行调整 });
这里_id 是作为 关联rules 里的ID 。将$arr 按照子项ID 遵循rule规则列表进行排序。
方法二:
比较笨的方法了,两个数组交叉循环遍历一下 ,不推荐。
/** * 调整数组根据指定字段指定规则进行排序 * @param $arr * @param $field * @param $sort_fields * @return array */ public static function customer_arr_sort($arr,$field,$sort_fields){ $res = []; foreach($sort_fields as $key => &$val){ foreach($arr as $k => &$v){ if($v[$field] == $val){ array_push($res,$v); unset($arr[$k]); break; } } } return $res; }
欢迎网友们,如果有更好的办法 可以给博主留言哦!
ps:
很多人不知道数据库中怎么实现,其实mysql里相对简单,使用order by field 或者 find_in_set即可哦。
转载请注明:苏demo的别样人生 » php 多维数组根据指定顺序排序 方法示例