php二维数组倒序,几行代码搞定PHP二维数组排序

排序是数据统计非常重要的环节,简单几行代码轻松搞定二维数组的排序

$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 ($data as $key => $row) {

$volume[] = $row['volume'];

$edition[] = $row['edition'];

}

// 将数据根据 volume 降序排列,根据 edition 升序排列

// 把 $data 作为最后一个参数,以通用键排序

array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

print_r($data);

//输出output

array

(

[0] => Array

(

[volume] => 98

[edition] => 2

)

[1] => Array

(

[volume] => 86

[edition] => 1

)

[2] => Array

(

[volume] => 86

[edition] => 6

)

[3] => Array

(

[volume] => 85

[edition] => 6

)

[4] => Array

(

[volume] => 67

[edition] => 2

)

[5] => Array

(

[volume] => 67

[edition] => 7

)

)

我们可以看到php官方已经为二维排序内置了排序方法array_multisort,但是很难用。所以自己动手拼装一个吧

第二步 封装方法

/**

* @param array $arr

* @param array $keys

* @param array $order

* @return bool|mixed

*/

function sort_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 ( $arr as $k => $v ) {

//原数组是否存在该字段

if ( isset($v[$keys[$j]]) ) {

$params[$i][] = $v[$keys[$j]]; //TODO 中文排序支持

} else {

return false;

}

}

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 {

return false;

}

}

$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,失败返回false

$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的引用;

第三步 中文排序的支持

//刚才的代码中对中文utf-8排序的支持显然是不够好的,这里稍微改造一下将uft-8转为gbk编码就能很好的支持中文排序了

$params[$i][] = iconv('UTF-8', 'GBK', $v[$keys[$j]]);

第四步 测试

//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

Array

(

[0] => Array

(

[name] => 阿a

[score] => 2.2

[id] => 1

)

[1] => Array

(

[name] => 阿a

[score] => 2.1

[id] => 1

)

[2] => Array

(

[name] => 阿b

[score] => 3.3

[id] => 2

)

[3] => Array

(

[name] => 北京

[score] => 4

[id] => 5

)

[4] => Array

(

[name] => 广州

[score] => 4

[id] => 6

)

[5] => Array

(

[name] => 湖南1

[score] => 2.5

[id] => 3

)

[6] => Array

(

[name] => 湖南10

[score] => 1.1

[id] => 4

)

[7] => Array

(

[name] => 新疆

[score] => 2.2

[id] => 1

)

)

大功告成,此处应该有掌声!!!!

看完教程觉得有收获请关注博主简书,点赞此文章

欢迎加博主微信(18501258725)多讨论交流敏捷开发工具和码农心得。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值