一个数组按另一个数组的顺序排序

PHP中的数组排序

在处理数组数据时候,有时候会给数组排序,常用的排序函数下面这些

函数描述
arsort()对关联数组按照键值进行降序排序。
asort()对关联数组按照键值进行升序排序。
krsort()对数组按照键名逆向排序。
ksort()对数组按照键名排序。
natcasesort()用“自然排序”算法对数组进行不区分大小写字母的排序。
natsort()用“自然排序”算法对数组排序。
sort()对数组排序。
uasort()使用用户自定义的比较函数对数组中的键值进行排序。
uksort()使用用户自定义的比较函数对数组中的键名进行排序。
usort()使用用户自定义的比较函数对数组进行排序。
array_multisort()对多个数组或多维数组进行排序。

这些常用数组排序都是单个数组排序,即使array_multisort()可以对多个或多维数组排序,但是想根据一个数组对另一个数组进行排序就比较麻烦了。

实例分析

顺序约束数据(20条):
$sort = array(20) {
  [0] => int(30702)
  [1] => int(30373)
  [2] => int(32110)
  [3] => int(32207)
  [4] => int(31923)
  [5] => int(1497)
  [6] => int(32003)
  [7] => int(30397)
  [8] => int(32086)
  [9] => int(31920)
  [10] => int(30795)
  [11] => int(31928)
  [12] => int(32071)
  [13] => int(32456)
  [14] => int(31224)
  [15] => int(32219)
  [16] => int(32726)
  [17] => int(31508)
  [18] => int(32381)
  [19] => int(41212)
}
待排序数据(5条):
$data = array(5) {
  [1497] => array(3) {
    ["houseid"] => int(1497)
    ["price"] => int(25000)
    ["area"] => array(2) {
      ["min"] => int(81)
      ["max"] => int(193)
    }
  }
  [30373] => array(3) {
    ["houseid"] => int(30373)
    ["price"] => int(18000)
    ["area"] => array(2) {
      ["min"] => int(109)
      ["max"] => int(189)
    }
  }
  [30397] => array(3) {
    ["houseid"] => int(30397)
    ["price"] => int(12000)
    ["area"] => array(2) {
      ["min"] => int(90)
      ["max"] => int(132)
    }
  }
  [30702] => array(3) {
    ["houseid"] => int(30702)
    ["price"] => int(19188)
    ["area"] => array(2) {
      ["min"] => int(0)
      ["max"] => int(188)
    }
  }
  [31224] => array(3) {
    ["houseid"] => int(31224)
    ["price"] => int(15149)
    ["area"] => array(2) {
      ["min"] => int(64)
      ["max"] => int(178)
    }
  }
}

封装的方法
 /**
     * 用一个数组的顺序排序另一个数组
     *
     * @param $data 被排序数组
     * @param $column 被排序数组字段 ,默认用 $data 数组key作为被排序的 字段
     * @param $sort 排序数组
     * @return array $data 中存在 sort对应值的 数据
     */
     function arrayByArraySort($data,$sort,$column=null){
        $temp = [];
        if (!is_null($column)){
            foreach ($data as $item){
                $temp[$item[$column]][] = $item;
            }
        }else{
            foreach ($data as $key => $item){
                $temp[$key] = [$item];
            }
        }

        $ret = [];
        foreach ($sort as $sortum){
            if (isset($temp[$sortum])){
                $ret = array_merge($ret,$temp[$sortum]);
            }
        }
        $ret = array_values($ret);
        return $ret;

    }
方法调用
$newList = arrayByArraySort($data,$sort);
var_dump($new_list);
输出结果
array(5) {
  [30702] => array(3) {
    ["houseid"] => int(30702)
    ["price"] => int(19188)
    ["area"] => array(2) {
      ["min"] => int(0)
      ["max"] => int(188)
    }
  }
  [30373] => array(3) {
    ["houseid"] => int(30373)
    ["price"] => int(18000)
    ["area"] => array(2) {
      ["min"] => int(109)
      ["max"] => int(189)
    }
  }
  [1497] => array(3) {
    ["houseid"] => int(1497)
    ["price"] => int(25000)
    ["area"] => array(2) {
      ["min"] => int(81)
      ["max"] => int(193)
    }
  }
  [30397] => array(3) {
    ["houseid"] => int(30397)
    ["price"] => int(12000)
    ["area"] => array(2) {
      ["min"] => int(90)
      ["max"] => int(132)
    }
  }
  [31224] => array(3) {
    ["houseid"] => int(31224)
    ["price"] => int(15149)
    ["area"] => array(2) {
      ["min"] => int(64)
      ["max"] => int(178)
    }
  }
}
方法说明
  • 上面实例中$data是没有有key值,那么就可以这样使用
$newList = arrayByArraySort($data,$sort,"houseid");
var_dump($new_list);
  • 此方法还支持需要排序的字段有重复值时,也可以实现例如下面这样的数据
$data = array(5) {
  [0] => array(3) {
    ["houseid"] => int(1497)
    ["price"] => int(25000)
    ["area"] => array(2) {
      ["min"] => int(81)
      ["max"] => int(193)
    }
  }
  [1] => array(3) {
    ["houseid"] => int(1497)
    ["price"] => int(18000)
    ["area"] => array(2) {
      ["min"] => int(109)
      ["max"] => int(189)
    }
  }
  [2] => array(3) {
    ["houseid"] => int(30397)
    ["price"] => int(12000)
    ["area"] => array(2) {
      ["min"] => int(90)
      ["max"] => int(132)
    }
  }
  [3] => array(3) {
    ["houseid"] => int(1497)
    ["price"] => int(19188)
    ["area"] => array(2) {
      ["min"] => int(0)
      ["max"] => int(188)
    }
  }
  [4] => array(3) {
    ["houseid"] => int(31224)
    ["price"] => int(15149)
    ["area"] => array(2) {
      ["min"] => int(64)
      ["max"] => int(178)
    }
  }
}


扩展
var_dump(array_flip($sort), $data);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值