从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。
创新互联从2013年成立,是专业互联网技术服务公司,拥有项目成都做网站、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元滑县做网站,已为上家服务,为滑县各地企业和个人服务,联系电话:028-86922220
遇到这个要求的时候就不是 ORDER BY 能解决的问题了。因此翻看 PHP 手册查找到了如下方法,做此笔记。
废话少说,奉上代码,清单如下:
[php] view plain copy
?php
/**
* 二维数组根据某个字段排序
* 功能:按照用户的年龄倒序排序
* @author ruxing.li
*/
header('Content-Type:text/html;Charset=utf-8');
$arrUsers = array(
array(
'id' = 1,
'name' = '张三',
'age' = 25,
),
array(
'id' = 2,
'name' = '李四',
'age' = 23,
),
array(
'id' = 3,
'name' = '王五',
'age' = 40,
),
array(
'id' = 4,
'name' = '赵六',
'age' = 31,
),
array(
'id' = 5,
'name' = '黄七',
'age' = 20,
),
);
$sort = array(
'direction' = 'SORT_DESC', //排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
'field' = 'age', //排序字段
);
$arrSort = array();
foreach($arrUsers AS $uniqid = $row){
foreach($row AS $key=$value){
$arrSort[$key][$uniqid] = $value;
}
}
if($sort['direction']){
array_multisort($arrSort[$sort['field']], constant($sort['direction']), $arrUsers);
}
var_dump($arrUsers);
/*
输出结果:
array (size=5)
0 =
array (size=3)
'id' = int 5
'name' = string '黄七' (length=6)
'age' = int 20
1 =
array (size=3)
'id' = int 2
'name' = string '李四' (length=6)
'age' = int 23
2 =
array (size=3)
'id' = int 1
'name' = string '张三' (length=6)
'age' = int 25
3 =
array (size=3)
'id' = int 4
'name' = string '赵六' (length=6)
'age' = int 31
4 =
array (size=3)
'id' = int 3
'name' = string '王五' (length=6)
'age' = int 40
*/
1 需要排序的数组如下:
$array = array(
array('name'='手机','brand'='诺基亚','price'=1050),
array('name'='笔记本电脑','brand'='lenovo','price'=4300),
array('name'='剃须刀','brand'='飞利浦','price'=3100),
array('name'='跑步机','brand'='三和松石','price'=4900),
array('name'='手表','brand'='卡西欧','price'=960),
array('name'='液晶电视','brand'='索尼','price'=6299),
array('name'='激光打印机','brand'='惠普','price'=1200)
);
2 排序的函数:
function arr_sort($array,$key,$order="asc"){//asc是升序 desc是降序
$arr_nums=$arr=array();
foreach($array as $k=$v){
$arr_nums[$k]=$v[$key];
}
if($order=='asc'){
asort($arr_nums);
}else{
arsort($arr_nums);
}
foreach($arr_nums as $k=$v){
$arr[$k]=$array[$k];
}
return $arr;
}
3 调用方式:
arr_sort($array,'price');
您好,这样:
?php
$data = array();
$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[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
$ret = arraySort($data, 'volume', 'desc');
print_r($ret);
/**
* @desc arraySort php二维数组排序 按照指定的key 对数组进行排序
* @param array $arr 将要排序的数组
* @param string $keys 指定排序的key
* @param string $type 排序类型 asc | desc
* @return array
*/
function arraySort($arr, $keys, $type = 'asc') {
$keysvalue = $new_array = array();
foreach ($arr as $k = $v){
$keysvalue[$k] = $v[$keys];
}
$type == 'asc' ? asort($keysvalue) : arsort($keysvalue);
reset($keysvalue);
foreach ($keysvalue as $k = $v) {
$new_array[$k] = $arr[$k];
}
return $new_array;
}
?
这个自定义函数与系统函数的一个区别就是:自定义函数只支持针对某一个key的排序,如果要支持多个key的排序需要执行多次; 而系统函数array_multisort可以一次性对多个key且可以指定多个排序规则,系统函数还是相当强大的,推荐使用系统函数,毕竟是C底层实现的,这里只是举例说明如果通过自定义函数来对数组进行排序,当然这个自定义函数也可以继续扩展来支持更多的排序规则。在取排名、排行榜、成绩等场景中用到的还是非常多的。
//提供一个方法
class lib_BaseUtils{
static $s_field;
static $s_sc;
/**
* php 二维数组按键值排序
* @param array $a 需要排序的数组
* @param string $sort 排序的键值
* @param string $d 默认ASC,带上参后为DESC
* @return boolean
*/
static function array_sort($a, $sort, $d='') {
self::$s_field = $sort;
self::$s_sc = $d;
usort($a, array("lib_BaseUtils","array_sort_callback"));
return $a;
}
//排序回调方法 请勿删除
static function array_sort_callback($a, $b) {
$s_a = self::$s_sc ? $b : $a;
$s_b = self::$s_sc ? $a : $b;
$field = self::$s_field;
switch (true){
case (is_string($s_a[$field]) is_string($s_b[$field])):
return strcmp($s_a[$field], $s_b[$field]);
break;
default:
if($s_a[$field]== $s_b[$field]){
return 0;
}else{
return $s_a[$field]$s_b[$field]?-1:1;
}
}
}
}
调用方法
lib_BaseUtils::array_sort($lists, 'app_down','desc');
复杂的数组排序可以用自定义的排序规则
?php
$arr = array(
0 = array('id' = '2014347856', 'name' = '张甜', '科目' = '语文', 'tag' = '期中考试', '成绩' = '142'),
1 = array('id' = '2014347856', 'name' = '张甜', '科目' = '数学', 'tag' = '期中考试', '成绩' = '98'),
2 = array('id' = '2014347856', 'name' = '张甜', '科目' = '英语', 'tag' = '期中考试', '成绩' = '118'),
3 = array('id' = '2014347856', 'name' = '张甜', '科目' = '化学', 'tag' = '期中考试', '成绩' = '78'),
4 = array('id' = '2014347856', 'name' = '张甜', '科目' = '物理', 'tag' = '期中考试', '成绩' = '132'),
5 = array('id' = '2014347856', 'name' = '张甜', '科目' = '生物', 'tag' = '期中考试', '成绩' = '115'),
6 = array('id' = '2014347856', 'name' = '张甜', '科目' = '地理', 'tag' = '期中考试', '成绩' = '99'),
7 = array('id' = '2014347856', 'name' = '张甜', '科目' = '历史', 'tag' = '期中考试', '成绩' = '88'),
8 = array('id' = '2014347856', 'name' = '张甜', '科目' = '政治', 'tag' = '期中考试', '成绩' = '125'),
9 = array('id' = '2014347880', 'name' = '李鸣', '科目' = '语文', 'tag' = '期中考试', '成绩' = '79'),
10 = array('id' = '2014347880', 'name' = '李鸣', '科目' = '数学', 'tag' = '期中考试', '成绩' = '148'),
11 = array('id' = '2014347880', 'name' = '李鸣', '科目' = '英语', 'tag' = '期中考试', '成绩' = '142'),
);
/*自定义排序*/
function userSort($a, $b)
{
if ($a['name'] == $b['name']) {
/*排序科目*/
$subjectSort = array('语文', '数学', '英语', '历史', '政治', '地理', '物理', '化学', '生物');
foreach ($subjectSort as $index = $item) {
if ($a['科目'] == $item) {
$tmp1 = $index;
}
if ($b['科目'] == $item) {
$tmp2 = $index;
}
}
return $tmp1 $tmp2 ? -1 : 1;
} else {
/*排序name*/
$tmpArr = [$a['name'], $b['name']];
sort($tmpArr);
return $a['name'] == $tmpArr[0] ? -1 : 1;
}
}
usort($arr, 'userSort');
var_dump($arr);
//先用array_column 多维数组按照纵向(列)取出
$date = array_column($arr, '0');
//上面得到的结果:array()
//再用array_multisort 结合array_column得到的结果对$arr进行排序
array_multisort($date,SORT_ASC,$arr);