文档章节

对二维数组进行二次排序的方法

vinci321
 vinci321
发布于 01/02 15:57
字数 1032
阅读 12
收藏 0

很多时候,我们需要对一个二维关联数组进行排序,而且这种排序可能不是一次就能排好,打个比方,一份成绩单,首先按照分数倒序排序,在分数相同的情况下,按照学号进行顺序排列;

代码

<?php 

uasort($arr, 'my_sort');

function my_sort($a, $b) {

    // 全局化排序键
    global $firstKey, $secondKey;

    // 如果第一排序键对应的值相同
    if (intval($a[$firstKey]) == intval($b[$firstKey])) {
        // 则按第二排序键进行顺序排列
        return (intval($a[$secondKey]) > intval($b[$secondKey])) ? 1 : -1;
    } else {
        // 否则按第一排序键进行倒序排列
        return (intval($a[$firstKey]) > intval($b[$firstKey])) ? -1 : 1;
    }
}

?>

测试

$arr = array(
        array(
            'name'=>'悔创阿里杰克马',
            'score'=>'96',
            'number'=>'02',
        ),
        array(
            'name'=>'普通家庭马化腾,',
            'score'=>'96',
            'number'=>'01',
        ),
        array(
            'name'=>'不知妻美刘强东',
            'score'=>'96',
            'number'=>'03',
        ),
        array(
            'name'=>'一无所有王健林',
            'score'=>'90',
            'number'=>'05',
        ),
        array(
            'name'=>'随便挣钱丁三石',
            'score'=>'90',
            'number'=>'34',
        ),
        array(
            'name'=>'名下无房潘石屹',
            'score'=>'100',
            'number'=>'11',
        ),
        array(
            'name'=>'下周回国贾跃亭',
            'score'=>'80',
            'number'=>'06',
        ),
        
    );

// 第一排序键
$firstKey = 'score';
// 第二排序键
$secondKey = 'number';

uasort($arr, 'my_sort');

var_dump($arr);

结果

/opt/wwwroot/test/test3.php:65:
array (size=7)
  5 => 
    array (size=3)
      'name' => string '名下无房潘石屹' (length=21)
      'score' => string '100' (length=3)
      'number' => string '11' (length=2)
  1 => 
    array (size=3)
      'name' => string '普通家庭马化腾,' (length=24)
      'score' => string '96' (length=2)
      'number' => string '01' (length=2)
  0 => 
    array (size=3)
      'name' => string '悔创阿里杰克马' (length=21)
      'score' => string '96' (length=2)
      'number' => string '02' (length=2)
  2 => 
    array (size=3)
      'name' => string '不知妻美刘强东' (length=21)
      'score' => string '96' (length=2)
      'number' => string '03' (length=2)
  3 => 
    array (size=3)
      'name' => string '一无所有王健林' (length=21)
      'score' => string '90' (length=2)
      'number' => string '05' (length=2)
  4 => 
    array (size=3)
      'name' => string '随便挣钱丁三石' (length=21)
      'score' => string '90' (length=2)
      'number' => string '34' (length=2)
  6 => 
    array (size=3)
      'name' => string '下周回国贾跃亭' (length=21)
      'score' => string '80' (length=2)
      'number' => string '06' (length=2)

 

总结

1, 对已有方法的运用掌握还不够,总想着自己造轮子,需要再强化;

2, 这个方法还的封装性还不够好,不能使用匿名函数;

 

自己写的复杂未完结待修改版本

/*
 * 二维数组排序
 * $arr 需要处理的二维数组
 * $row 需要排序的列
 * $type 倒序还是升序
 * 一次排序保留键值对对应关系,二次排序不保留键值对应关系
*/
function array_sort($arr, $firstRow, $secondRow, $type='asc') {

	$firstRowResult = array();
	$secondRowResult = array();
	
	// 先按第一排序键排列好
	if (!empty($arr)) {
		foreach ($arr as $key=>$value) {
			// 在二维数组的所有元素中第一排序键对应的所有值
			$firstRowArray[$key] = $value[$firstRow];
		}
		if ($type == 'asc') {
			asort($firstRowArray);
		} else {
			arsort($firstRowArray);
		}
		
		reset($firstRowArray);
		foreach ($firstRowArray as $k=>$v) {
			$firstRowResult[$k] = $arr[$k];
		}
	}

	// 再进行第二排序键的排列

	// 如果第一排序键对应了相同的值,则按第二排序键进行排序
	// 在第一排序键相同值数组中,用第二排序键的顺序来决定二维数组的键的排序
	// 如何取出第一排序键相同值的数组
	if ($secondRow == '') {
		return $firstRowResult;
	} else {
		print 11111111;
		var_dump($firstRowResult);
		$firstRowArray = array();
		// 取出所有值,不保留键值对关系
		// $firstRowResult = array_values($firstRowResult);
		foreach ($firstRowResult as $key=>$value) {
			// 在二维数组的所有元素中第一排序键对应的所有值
			$firstRowArray[$key] = $value[$firstRow];
		}
		var_dump($firstRowArray);
		foreach ($firstRowArray as $firstRowKey=>$firstRowValue) {
			// 第一排序键的值出现的所有键
			$firstRowSameValueKeys = array_keys($firstRowArray, $firstRowValue);
			var_dump($firstRowSameValueKeys);
			// 第一排序键的值出现的次数
			$len = count($firstRowSameValueKeys);
			// 如果第一排序键的值只出现过一次
			if ($len == 1) {
				print '跳过1';
				$secondRowResult[] = $firstRowValue;
				continue;
			// 如果出现过多次,则有重复值
			} else {
				// 重复值的键都是挨在一起的
				// 在重复值内部按第二排序键进行排序
				$secondRowArray = array();
				// 对所有拥有相同值的第一键进行遍历
				foreach ($firstRowSameValueKeys as $firstRowSameValueKey) {
					// 取出二维数组中第一键的值相同的所有元素
					$secondRowArray[$firstRowSameValueKey] = $firstRowResult[$firstRowSameValueKey];
				}
				var_dump($secondRowArray);
				// 将第一键的值相同的所有元素组成的数组按第二键进行排序,返回排序后的第一键的值相同的所有元素组成的数组
				$secondRowArray = array_sort($secondRowArray, $secondRow, '', $type);
				var_dump($secondRowArray);
				$secondRowResult = array_merge($secondRowResult, $secondRowArray);
				var_dump($secondRowResult);
			}
		}
		return $secondRowResult;
	}
	
}

$result = array_values($result);

 

© 著作权归作者所有

共有 人打赏支持
上一篇: 主键自增设置
下一篇: HTTP Header 详解
vinci321
粉丝 6
博文 173
码字总数 217682
作品 0
私信 提问
php对二维数组进行相关操作(排序、转换、去空白等)

php对二维数组进行相关操作(排序、转换、去空白等) 投稿:lijiao 字体:[增加 减小] 类型:转载 时间:2015-11-04 这篇文章主要介绍了php对二维数组进行相关操作,包括php对二维数组排序、...

thinkyoung
2015/11/09
0
0
Java语言学习(四):数组及常用操作

众所周知,坐标系有一维、二维、三维,Java中数组也不例外,像一维数组、二维数组,下面就数组来说下相关知识。 先通过简单的案例来熟悉数组: (1)任务:实现二维数组的行列互换 (2)准备...

海岸线的曙光
07/12
0
0
PHP Warning: array_multisort(): Array sizes are inconsistent

array_multisort() 函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。 遇到这报错是两个数组对...

水滴的历程
2017/09/19
0
0
MapReduce二次排序

默认情况下,Map输出的结果会对Key进行默认的排序,但是有时候需要对Key排序的同时还需要对Value进行排序,这时候就要用到二次排序了。下面我们来说说二次排序 1、二次排序原理 我们把二次排...

小萝卜_
2016/12/16
19
0
PHP常用数组函数小结

1.requesturi获取到最后的元素indextest1test2test3(一般框架的的路由路径就是这样的) $requesturi ="index\test1\test2\test3";$arr=explode("",$request_uri);$moudle = array_shift($ar......

熊猫88
2016/01/06
58
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据学习有哪几个步骤

目前大数据行业异常火爆,不少人都对大数据充满了兴趣,其中有大部分人都从没接触过大数据,对于应该如何学习大数据一头雾水。大数据学习并不是高深莫测的,虽然它并没有多简单,但是通过努力...

董黎明
19分钟前
4
0
shell习题_3

1:监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,如果大于500则自动重启httpd服务;并检测是否启动成功; 如果没有正常启动还需要再启动一次,最大不成功数超过五次立即发邮件给管理...

芬野de博客
19分钟前
1
0
Android 9.0 优势探讨

我们来谈论一下 Android。尽管 Android 只是一款内核经过修改的 Linux,但经过多年的发展,Android 开发者们(或许包括正在阅读这篇文章的你)已经为这个平台的演变做出了很多值得称道的贡献...

问题终结者
36分钟前
4
0
vue 组件使用中的一些细节点

细节一 基础例子 运行结果: 以上大家都懂,这边就不多说,回到代码里,有时候我们需要 tbody 里面每一行是一个子组件,那我们代码可以怎么写呢?我们可以这样写,定义一个全局组件,如下: ...

peakedness丶
43分钟前
2
0
vue 之 css module的使用方法

动手之前先配置项目,网上很多文章说需要下载css-loader插件,Vue中的vue-loader已经集成了 CSS Modules,因此删掉也能正常运行 在vue.config.js中添加如下配置 `css: {``loaderOptions: ...

前端小攻略
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部