二维数组排序
很多时候,从数据库取出来的数据是乱的,需要我们重新进行排序。这里提供一个公共的方法,如下:
/**
* 二维数组排序
* @param $data 数据数组
* @param $field 排序字段
* @param $order 排序规则:asc、desc
*/
function resort($data = array(), $field = 'sort', $order = 'asc')
{
$sort['field'] = $is_date ? 'sort_datetime' : $field;
if ($order == 'asc') {
$sort['direction'] = 'SORT_ASC';
} else if ($order == 'desc') {
$sort['direction'] = 'SORT_DESC';
} else {
return array();
}
$arrSort = array();
foreach ($data AS $k => $v) {
foreach ($v AS $k2 => $v2) {
$arrSort[$k2][$k] = $v2;
}
}
if ($sort['direction']) {
array_multisort($arrSort[$sort['field']], constant($sort['direction']), $data);
}
return $data;
}
进阶升级
/**
* 二维数组排序
* @param $array 数据数组
* @param $cond 条件(结构为:array(
* array(列名1, SORT_ASC/SORT_DESC, SORT_STRING/SORT_NUMERIC),
* array(列名1, SORT_ASC/SORT_DESC, SORT_STRING/SORT_NUMERIC)
* )
* 第三参数表示按照string还是数字进行排序,可不传,可为空,默认为类型不变进行排序)
*/
function resort($array, $cond)
{
if(!is_null($array) && count($array) > 0) {
if(count($cond) == 0) { // 如果没有排序条件,直接返回
return $array;
} else {
$sortList = array(); // 排序规则列表
$typeList = array(); // 排序字段类型列表
foreach($cond as $sort) {
$sortList[] = !empty($sort[1]) ? $sort[1] : SORT_DESC;
$typeList[] = isset($sort[2]) ? $sort[2] : SORT_REGULAR;
}
$valueList = array(); // 值列表
foreach($cond as $sort) {
$columnName = $sort[0];
$values = array();
foreach($array as $index => $row) {
$values[] = $row[$columnName];
}
$valueList[] = $values;
}
$args = array(); // 参数列表
for($i = 0; $i < count($cond); $i++) {
$args[] = &$valueList[$i];
$args[] = &$sortList[$i];
$args[] = &$typeList[$i];
}
$args[] = &$array;
call_user_func_array('array_multisort', $args); // 进行排序操作
return $array;
}
} else {
return array();
}
}