排序是数据统计信息中非常重要的一环,通过简单的几行代码即可轻松处理二维数组的排序
$data[]=array('volume'=67,' edition'=2);
$data[]=array('volume'=86,' edition'=1);
$data[]=array('volume'=85,' edition'=6);
$data[]=array('volume'=98,' edition'=2);
$data[]=array('volume'=86,' edition'=6);
$data[]=array('volume'=67,' edition'=7);
获取//列列表
Foreach($dataas$key=$row ) {
$volume[]=$row['volume'];
$edition[]=$row['edition'];
}
//数据按照volume降序排列,按照edition升序排列
将$data作为最后一个参数,按公用键排序
array_multisort($volume,SORT_DESC,$edition,SORT_ASC,$data );
打印_ r ($ data;
输出输出
阿拉伊
(
[0]=阵列
(
[卷]=98
[edition]=2
)
[1]=阵列
(
[卷]=86
[edition]=1
)
[2]=阵列
(
[卷]=86
[edition]=6
)
[3]=阵列
(
[卷]=85
[edition]=6
)
[4]=阵列
(
[卷]=67
[edition]=2
)
[5]=阵列
(
[卷]=67
[edition]=7
)
)
php官方在二维排序中加入了排序方法array_multisort,但是很难使用。 所以自己做吧
步骤2的封装方法
//*
* @param array $arr
* @param array $keys
* @param array $order
* @ return bool
*/
(functionsort _ array _ multi (array $ arr,array $keys,array $order ) ) ) ) ) ) ) )
{
//检查参数
if(count($keys )=) $times=count ) $order ) }{
for($I=0,$j=0; $j $times; $i =2,$j ) {
foreach($arras$k=$v ) {
//原始数组中是否存在此字段
if(isset($v ) $keys($j ) ) ) ) )
$params[$i][]=$v[$keys[$j]] //TODO中文排序支持
} else {
返回假;
}
}
if(strtoupper($order[$j] )=='ASC ' )。
$params[$i 1]=SORT_ASC;
} else {
$params[$i 1]=SORT_DESC;
}
}
$params[]=$arr;
return call _ user _ func _ array (' array _ multisort ',$params );
} else {
返回假;
}
}
$data=[
['name'=1,' score'=2.2],
['name'=2,' score'=3.3],
['name'=4,' score'=2.5],
['name'=1,' score'=1.1],
['name'=0,' score'=4],
];
调用//方法
sort_array_multi($data,['name ',' score'] ',['asc ',' desc'] );
通过call_user_func_array方法将array_multisort的不定参数作为数组注入方法中,无需每次手动连接参数,最后排序为true,失败为fallay _ multisort
$n=count($order );
$params数组说明:
$params[0]是需要数组的数组keys的第0项原始数组的二维$data中所有name字段的值,等效于Array_column($data,' name )。
$params[1]是与所排列数组keys的第0个对应的排序规则$order中的升序;
$params[3]在需要数组的数组keys的第1项的原始数组二维$data中的所有score字段的值都与Array_column($data,' score ' )等效;
$params[4]是与排列数组keys的第1项对应的排序规则$order中的升降顺序;
.
$params[2*$n 1]是对需要数组的原始数组$data的引用。
步骤3支持中文排序
//虽然刚才的代码对中文utf-8排序的支持明显不够,但是在这里我们对uft-8进行了一点改进,使其可以更好地支持gbk编码。
$params[$I][]=iconv('utf-8 '、' GBK '、$v ) $keys[$j] );
第4步测试
//input
$data=[
['name'='新疆',' score'=2.2,' id'=1 ],
['name'='阿a ',' score'=2.1,' id'=1 ],
['name'='阿b ',' score'=3.3,' id'=2 ],
['name'='湖南1 ',' score'=2.5,' id'=3 ],
['name'='湖南10 ',' score'=1.1,' id'=4 ],
['name'='北京',' score'=4,' id'=5 ],
['name'='广州',' score'=4,' id'=6 ],
['name'='阿a ',' score'=2.2,' id'=1 ],
];
sort_array_multi($data,['name ',' id ',' score'],['asc ',' asc ',' desc'] );
//output
阿拉伊
(
[0]=阵列
(
[name]=
[score]=2.2
[id]=1
)
[1]=阵列
(
[name]=
[score]=2.1
[id]=1
)
[2]=阵列
(
[name]=阿b
[score]=3.3
[id]=2
)
[3]=阵列
(
[name]=北京
[score]=4
[id]=5
)
[4]=阵列
(
[name]=广州
[score]=4
[id]=6
)
[5]=阵列
(
[name]=湖南1
[score]=2.5
[id]=3
)
[6]=阿莱
(
[name]=湖南省10
[score]=1.1
[id]=4
)
[7]=阿莱
(
[name]=新疆
[score]=2.2
[id]=1
)
)
大功告成后,这里应该有掌声!
认为通过阅读教程获得的人请关注博客的个人资料,并称赞这篇文章
欢迎加入博主微信(18501258725 )敏捷开发工具和周期农户心得交流。