Hoe's Notes

PHP数组按特定值分组排序


对PHP数组进行排序
需求:把购物车里同一家店铺的商品汇总在一起。
同样适用于订单详情页面。

// 这是原始的数组
$cartData = array(
    array(
        'id'         => 1,
        'sid'        => '1',
        'sname'      => 'Hoe的店铺',
        'gname'      => '商品名称1',
        'price'      => 100,
        'num'        => 5,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 2,
        'sid'        => '2',
        'sname'      => 'AAA的店铺',
        'gname'      => '商品名称2',
        'price'      => 100,
        'num'        => 1,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 3,
        'sid'        => '3',
        'sname'      => 'BBB的店铺',
        'gname'      => '商品名称3',
        'price'      => 100,
        'num'        => 4,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 4,
        'sid'        => '2',
        'sname'      => 'AAA的店铺',
        'gname'      => '商品名称4',
        'price'      => 100,
        'num'        => 3,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 5,
        'sid'        => '1',
        'sname'      => 'Hoe的店铺',
        'gname'      => '商品名称5',
        'price'      => 100,
        'num'        => 5,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 6,
        'sid'        => '3',
        'sname'      => 'BBB的店铺',
        'gname'      => '商品名称6',
        'price'      => 100,
        'num'        => 2,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 7,
        'sid'        => '4',
        'sname'      => 'CCC的店铺',
        'gname'      => '商品名称7',
        'price'      => 100,
        'num'        => 1,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 8,
        'sid'        => '3',
        'sname'      => 'BBB的店铺',
        'gname'      => '商品名称8',
        'price'      => 100,
        'num'        => 1,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 9,
        'sid'        => '4',
        'sname'      => 'CCC的店铺',
        'gname'      => '商品名称9',
        'price'      => 100,
        'num'        => 3,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
    array(
        'id'         => 10,
        'sid'        => '5',
        'sname'      => 'DDD的店铺',
        'gname'      => '商品名称0',
        'price'      => 100,
        'num'        => 5,
        'createtime' => '2017年4月15日17:41:44'
    ) ,
);

$items = array();
foreach($cartData as $value) {
    // 根据sname(店铺名称)重组数组
    $sid = $value['sid'];
    if(!isset($items[$sid])) {
        // 把店铺名称提取出来
        $items[$sid] = array('sname'=>$value['sname'], 'goods'=>array());
    }
    // 把同一家店的商品汇总在一个数组里
    $items[$sid]['goods'][] = $value;
}
// 重新排序数组(可选)
sort($items);

打印排序后的结果

Array
(
    [0] => Array
        (
            [sname] => AAA的店铺
            [goods] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [sid] => 2
                            [sname] => AAA的店铺
                            [gname] => 商品名称2
                            [price] => 100
                            [num] => 1
                            [createtime] => 2017年4月15日17:41:44
                        )

                    [1] => Array
                        (
                            [id] => 4
                            [sid] => 2
                            [sname] => AAA的店铺
                            [gname] => 商品名称4
                            [price] => 100
                            [num] => 3
                            [createtime] => 2017年4月15日17:41:44
                        )

                )

        )

    [1] => Array
        (
            [sname] => BBB的店铺
            [goods] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [sid] => 3
                            [sname] => BBB的店铺
                            [gname] => 商品名称3
                            [price] => 100
                            [num] => 4
                            [createtime] => 2017年4月15日17:41:44
                        )

                    [1] => Array
                        (
                            [id] => 6
                            [sid] => 3
                            [sname] => BBB的店铺
                            [gname] => 商品名称6
                            [price] => 100
                            [num] => 2
                            [createtime] => 2017年4月15日17:41:44
                        )

                    [2] => Array
                        (
                            [id] => 8
                            [sid] => 3
                            [sname] => BBB的店铺
                            [gname] => 商品名称8
                            [price] => 100
                            [num] => 1
                            [createtime] => 2017年4月15日17:41:44
                        )

                )

        )

    [2] => Array
        (
            [sname] => CCC的店铺
            [goods] => Array
                (
                    [0] => Array
                        (
                            [id] => 7
                            [sid] => 4
                            [sname] => CCC的店铺
                            [gname] => 商品名称7
                            [price] => 100
                            [num] => 1
                            [createtime] => 2017年4月15日17:41:44
                        )

                    [1] => Array
                        (
                            [id] => 9
                            [sid] => 4
                            [sname] => CCC的店铺
                            [gname] => 商品名称9
                            [price] => 100
                            [num] => 3
                            [createtime] => 2017年4月15日17:41:44
                        )

                )

        )

    [3] => Array
        (
            [sname] => DDD的店铺
            [goods] => Array
                (
                    [0] => Array
                        (
                            [id] => 10
                            [sid] => 5
                            [sname] => DDD的店铺
                            [gname] => 商品名称0
                            [price] => 100
                            [num] => 5
                            [createtime] => 2017年4月15日17:41:44
                        )

                )

        )

    [4] => Array
        (
            [sname] => Hoe的店铺
            [goods] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [sid] => 1
                            [sname] => Hoe的店铺
                            [gname] => 商品名称1
                            [price] => 100
                            [num] => 5
                            [createtime] => 2017年4月15日17:41:44
                        )

                    [1] => Array
                        (
                            [id] => 5
                            [sid] => 1
                            [sname] => Hoe的店铺
                            [gname] => 商品名称5
                            [price] => 100
                            [num] => 5
                            [createtime] => 2017年4月15日17:41:44
                        )

                )

        )

)