在前面的开发小技巧中已经介绍了一种二维数组根据key进行排序《PHP开发小技巧②—实现二维数组根据key进行排序》这个在使用的时候可能功能不足,或是达不到要求,今天我就遇到这么一个情况。下面介绍两种改进之后的方法。
一、多维数组根据某一字段排序
此处用到了PHP的array_multisort方法(对多个数组或多维数组进行排序),关于此方法的用法可以查看PHP开发手册。
首先我们假设一个数组:
$demo_array = array( array('id' => 8, 'name' => 'Bob', 'age' => 18, 'score' => 92), array('id' => 9, 'name' => 'Sun', 'age' => 16, 'score' => 99), array('id' => 3, 'name' => 'Snow', 'age' => 16, 'score' => 82), array('id' => 11, 'name' => 'Frank', 'age' => 22, 'score' => 90) );
实现思路:通过将待排序数组的各个数组的$field保存在一维数组fieldArr中,在传入array_multisort中参与排序。传入 array_multisort后,相当于对$field一维数组的排序,而后根据排序后的key重新构建传入的待排序数组。
实现方法:
/** * 数组按照某一字段排序 * @param $array 需要排序的二维数组 * @param $field 所根据排序的字段 * @param bool $desc 排序类型 */ function array_sort_by_one_field(&$array, $field, $desc = false) { $fieldArr = array(); foreach ($array as $k => $v) { $fieldArr[$k] = $v[$field]; } $sort = $desc == false ? SORT_ASC : SORT_DESC; array_multisort($fieldArr, $sort, $array); } array_sort_by_one_field($demo_array, 'age', true); print_r($demo_array);
结果打印:Array ( [0] => Array ( [id] => 11 [name] => Frank [age] => 22 [score] => 90 ) [1] => Array ( [id] => 8 [name] => Bob [age] => 18 [score] => 92 ) [2] => Array ( [id] => 3 [name] => Snow [age] => 16 [score] => 82 ) [3] => Array ( [id] => 9 [name] => Sun [age] => 16 [score] => 99 ) )
二、多维数组多个字段自定义排序
这个方法用到了PHP的func_get_args函数,关于此函数用法不会的也可以查看PHP开发手册。
同样的首先假设一个数组:
$demo_array = array( array('id' => 8, 'name' => 'Bob', 'age' => 18, 'score' => 92), array('id' => 9, 'name' => 'Sun', 'age' => 16, 'score' => 99), array('id' => 3, 'name' => 'Snow', 'age' => 16, 'score' => 82), array('id' => 11, 'name' => 'Frank', 'age' => 22, 'score' => 90) );
实现思路:实现思路和上面的差不多,只是多了采用PHP中的func_get_args函数,来动态获取传入的值,既可以解决多字段个数不确定的问题。
实现方法:
/** * 多维数组多个字段自定义排序 * 参数传递不确定 */ function array_sort_by_many_field() { //获取函数传递的参数,第一个参数必须是一个数组 $args = func_get_args(); if (empty($args)) { return null; } $arr = array_shift($args); if (!is_array($arr)) { throw new Exception("第一个参数必须要是一个数组"); } foreach ($args as $key => $field) { if (is_string($field)) { $temp = array(); foreach ($arr as $index => $val) { $temp[$index] = $val[$field]; } $args[$key] = $temp; } } $args[] = &$arr;//引用值 call_user_func_array('array_multisort', $args); return array_pop($args); } $arr = array_sort_by_many_field($demo_array, 'score', SORT_DESC, 'age', SORT_ASC); print_r($arr);
结果打印:Array ( [0] => Array ( [id] => 9 [name] => Sun [age] => 16 [score] => 99 ) [1] => Array ( [id] => 8 [name] => Bob [age] => 18 [score] => 92 ) [2] => Array ( [id] => 11 [name] => Frank [age] => 22 [score] => 90 ) [3] => Array ( [id] => 3 [name] => Snow [age] => 16 [score] => 82 ) )