php 数组排序键值重新排列_PHP 二维数组按照某个键值重新排序

需求:可预订排在前,不可预订排在后,即对既有数据进行重新排序,数据为二维数组,问题转换为根据二维数组的某 key 的值对二维数组进行重排

最开始使用 二维数组降为一维数组,使用 asort/arsort 进行排序,排序完成后根据一维数组的位置替换成二维数组

结果是可以重拍,但问题是对 value 值相同的数据也会打乱重排。

第二种方法使用冒泡排序,也是用二维数组降为一维数组,使用冒泡排序重拍一维,再根据一维的序号替换成二维数组

结果不可重拍,因为冒泡只替换了 value 的位置,key 的位置并没有重拍。常规的冒泡仅是解决索引数组的排序,若想用冒泡的方式,需要对关联数组进行冒泡

第三种方法使用 array_multisort() 函数

array_multisort() 函数对多个数组或多维数组进行排序。

参数中的数组被当成一个表的列并以行来进行排序 – 这类似 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。

/**数组根据某一value值进行排序

* @param $arr 二维数组

* @param $keys 指定按哪列排序

* @param string $order_by 正序 or 倒叙

* @param bool $key 原 key 是否保留

* @param string $way 排序方法

* @return array 二维数组

*/

private function array_sort($arr,$keys,$order_by='desc',$key=FALSE,$way='bubble'){

$tmp_array = $new_array = array();

foreach($arr as $k=>$v){

$tmp_array[$k] = $v[$keys];

}

if($way == 'sort'){

//sort 方法排序,可以重拍,但是相同值的顺序会被打乱

if($order_by =='asc'){

asort($tmp_array);

}else{

arsort($tmp_array);

}

}elseif($way == 'bubble'){

//冒泡排序,不能重拍

if($order_by == 'desc') {

for ($i = 0; $i < count($tmp_array) - 1; $i++) {

for ($j = 0; $j < count($tmp_array) - $i - 1; $j++){

if ($tmp_array[$j]

$t = $tmp_array[$j];

$tmp_array[$j] = $tmp_array[$j+1];

$tmp_array[$j+1] = $t;

}

}

}

}elseif($order_by == 'asc'){

for ($i = 0; $i < count($tmp_array) - 1; $i++) {

for ($j = 0; $j < count($tmp_array) - $i - 1; $j++){

if ($tmp_array[$j]>$tmp_array[$j+1]) {

$t = $tmp_array[$j];

$tmp_array[$j] = $tmp_array[$j+1];

$tmp_array[$j+1] = $t;

}

}

}

}

}elseif($way == 'multisort'){

//multisort 方法排序,相同值的顺序按顺序输出

if($order_by == 'desc'){

array_multisort(array_column($arr,$keys),SORT_DESC,$arr);

$tmp_array = $arr;

}elseif($order_by == 'asc'){

array_multisort(array_column($arr,$keys),SORT_ASC,$arr);

$tmp_array = $arr;

}

}

reset($tmp_array);

foreach($tmp_array as $k=>$v){

if($key==TRUE){

$new_array[$k] = $arr[$k];

}else{

$new_array[] = $arr[$k];

}

}

return $new_array;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值