扒一扒php 数组排序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值