PHP是一门强大弱脚本语言开发快捷方便,但开发中也需谨慎使用不然遇到好多意想不到bug; 今天就以我开发中遇到问题为例扒一扒php排序的问题;
PHP提供好多访问和操作单维和多维数组函数,但在不清楚内部数据结构下谨慎使用,如排序函数:sort,rsort,ksort,krsort,asort,arsort;
1、a(association)前缀表示以键值关联排序;
2、k(key)前缀表示以键名关联排序;
3、r(reverse)前缀表示以反方向排序。
以电商类促销工具多档满赠为例:
//满赠多档赠品信息
$giftItem = array();
$giftItem[] = array('price' => 3000, 'gift_num'=>4,'sku_num'=>500,'gift_amount'=>1500,'gift_id'=>'23224','gift_name'=>'水果');
$giftItem[] = array('price' => 1000, 'gift_num'=>6,'sku_num'=>100,'gift_amount'=>1000,'gift_id'=>'98324','gift_name'=>'王老吉');
$giftItem[] = array('price' => 2000, 'gift_num'=>2,'sku_num'=>300,'gift_amount'=>800,'gift_id'=>'10932','gift_name'=>'果粒橙');
$giftItem[] = array('price' => 4000, 'gift_num'=>10,'sku_num'=>400,'gift_amount'=>2000,'gift_id'=>'50901','gift_name'=>'宝矿力');
// 使用金额作为key
$PriceDecArray = array();
foreach($giftItem as $giftItemV){
$price = $giftItemV['price'];
$PriceDecArray[$price] = $giftItemV;
}
Sort
sort对数组的组逐一按照ASCII排序,如果第一组的值ASCII码已经分别出大小不再比较其他组ASCII值,如果第一组组值全部相等继续下一组ASCII比较 一直到比较结果,注:key 顺序值也发生改变
sort($PriceDecArray);
print_r($PriceDecArray); exit;
----> result:<------
Array
(
[0] => Array
(
[price] => 1000
[gift_num] => 6
[sku_num] => 100
[gift_amount] => 1000
[gift_id] => 98324
[gift_name] => 王老吉
)
[1] => Array
(
[price] => 2000
[gift_num] => 2
[sku_num] => 300
[gift_amount] => 800
[gift_id] => 10932
[gift_name] => 果粒橙
)
[2] => Array
(
[price] => 3000
[gift_num] => 4
[sku_num] => 500
[gift_amount] => 1500
[gift_id] => 23224
[gift_name] => 水果
)
[3] => Array
(
[price] => 4000
[gift_num] => 10
[sku_num] => 400
[gift_amount] => 2000
[gift_id] => 50901
[gift_name] => 宝矿力
)
)
Rsort
Rsort 和Sort反之 按值ASCII码排序,Key顺序值发生改变
rsort($PriceDecArray);
print_r($PriceDecArray); exit;
----> result:<------
Array
(
[0] => Array
(
[price] => 4000
[gift_num] => 10
[sku_num] => 400
[gift_amount] => 2000
[gift_id] => 50901
[gift_name] => 宝矿力
)
[1] => Array
(
[price] => 3000
[gift_num] => 4
[sku_num] => 500
[gift_amount] => 1500
[gift_id] => 23224
[gift_name] => 水果
)
[2] => Array
(
[price] => 2000
[gift_num] => 2
[sku_num] => 300
[gift_amount] => 800
[gift_id] => 10932
[gift_name] => 果粒橙
)
[3] => Array
(
[price] => 1000
[gift_num] => 6
[sku_num] => 100
[gift_amount] => 1000
[gift_id] => 98324
[gift_name] => 王老吉
)
)
Asort
比较方式和Sort类似,但保留Key 原始顺序,使用时一定注意
asort($giftItem);
print_r($giftItem); exit;
----> result:<------
Array
(
[1] => Array
(
[price] => 1000
[gift_num] => 6
[sku_num] => 100
[gift_amount] => 1000
[gift_id] => 98324
[gift_name] => 王老吉
)
[2] => Array
(
[price] => 2000
[gift_num] => 2
[sku_num] => 300
[gift_amount] => 800
[gift_id] => 10932
[gift_name] => 果粒橙
)
[0] => Array
(
[price] => 3000
[gift_num] => 4
[sku_num] => 500
[gift_amount] => 1500
[gift_id] => 23224
[gift_name] => 水果
)
[3] => Array
(
[price] => 4000
[gift_num] => 10
[sku_num] => 400
[gift_amount] => 2000
[gift_id] => 50901
[gift_name] => 宝矿力
)
)
Arsort
和Rsort 降续排序方式类似 ,但保留Key 原始顺序
arsort($giftItem);
print_r($giftItem); exit;
----> result:<------
Array
(
[3] => Array
(
[price] => 4000
[gift_num] => 10
[sku_num] => 400
[gift_amount] => 2000
[gift_id] => 50901
[gift_name] => 宝矿力
)
[0] => Array
(
[price] => 3000
[gift_num] => 4
[sku_num] => 500
[gift_amount] => 1500
[gift_id] => 23224
[gift_name] => 水果
)
[2] => Array
(
[price] => 2000
[gift_num] => 2
[sku_num] => 300
[gift_amount] => 800
[gift_id] => 10932
[gift_name] => 果粒橙
)
[1] => Array
(
[price] => 1000
[gift_num] => 6
[sku_num] => 100
[gift_amount] => 1000
[gift_id] => 98324
[gift_name] => 王老吉
)
)
Ksort
按着数组key值升序排序,key 顺序发生变化
ksort($PriceDecArray);
print_r($PriceDecArray);
----> result:<------
Array
(
[1000] => Array
(
[price] => 1000
[gift_num] => 6
[sku_num] => 100
[gift_amount] => 1000
[gift_id] => 98324
[gift_name] => 王老吉
)
[2000] => Array
(
[price] => 2000
[gift_num] => 2
[sku_num] => 300
[gift_amount] => 800
[gift_id] => 10932
[gift_name] => 果粒橙
)
[3000] => Array
(
[price] => 3000
[gift_num] => 4
[sku_num] => 500
[gift_amount] => 1500
[gift_id] => 23224
[gift_name] => 水果
)
[4000] => Array
(
[price] => 4000
[gift_num] => 10
[sku_num] => 400
[gift_amount] => 2000
[gift_id] => 50901
[gift_name] => 宝矿力
)
)
Krsort
按着数组key值降序排序,key 顺序发生变化
ksort($PriceDecArray);
print_r($PriceDecArray);
----> result:<------
Array
(
[4000] => Array
(
[price] => 4000
[gift_num] => 10
[sku_num] => 400
[gift_amount] => 2000
[gift_id] => 50901
[gift_name] => 宝矿力
)
[3000] => Array
(
[price] => 3000
[gift_num] => 4
[sku_num] => 500
[gift_amount] => 1500
[gift_id] => 23224
[gift_name] => 水果
)
[2000] => Array
(
[price] => 2000
[gift_num] => 2
[sku_num] => 300
[gift_amount] => 800
[gift_id] => 10932
[gift_name] => 果粒橙
)
[1000] => Array
(
[price] => 1000
[gift_num] => 6
[sku_num] => 100
[gift_amount] => 1000
[gift_id] => 98324
[gift_name] => 王老吉
)
)
总结:
对Value 排序使用sort rsort;
对key 排序使用ksort krsort;
需要保留key 顺序使用asort arsot;
[参考 php Array 函数]
http://www.w3school.com.cn/php/php_ref_array.asp
http://www.cnblogs.com/TimeStory/p/4201385.html