PHP 两个多维数组根据某个键的值进行组合排序的几种思路
2023-09-11 14:17:02 时间
需求:
有两个多维数组
$arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ];
需要将两个数组合并,并且根据 'age' 从小到大进行排序,也就是最终的数组是:
Array( [0] => Array([name] => Ozil [age] => 27) [1] => Array([name] => dee [age] => 28) [2] => Array([name] => CR7 [age] => 29) [3] => Array([name] => emperor [age] => 30) [4] => Array([name] => Lee [age] => 32) [5] => Array([name] => Arshavin [age] => 33) [6] => Array([name] => Doctor [age] => 33) [7] => Array([name] => John [age] => 35)
[8] => Array([name] => Totti [age] => 40)
)
有几种思路:
1. 利用 sort() 函数对年龄进行排序
<?php $arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33], ['name'=>'Totti', 'age'=>40] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ]; echo '<pre>'; $tmp = array_merge($arr, $arr2); $age = []; foreach($tmp as $key => $val) { $age[] = $val['age']; } sort($age); $new = []; foreach($age as $key => $val) { foreach($tmp as $k => $v) { if($val == $v['age']) { $new[$key] = $v; unset($tmp[$k]); } } } print_r($new);
2. 使用冒泡排序代替 sort() 函数(冒泡排序比 sort() 函数更高效)
<?php $arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33], ['name'=>'Totti', 'age'=>40] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ]; echo '<pre>'; $tmp = array_merge($arr, $arr2); $age = []; foreach($tmp as $key => $val) { $age[] = $val['age']; } //冒泡排序 for($i = 0; $i < count($age) - 1; $i++) { for($j = 0; $j < count($age) - $i - 1; $j++) { if($age[$j] > $age[$j+1]) { $t = $age[$j]; $age[$j] = $age[$j+1]; $age[$j+1] = $t; } } } $new = []; foreach($age as $key => $val) { foreach($tmp as $k => $v) { if($val == $v['age']) { $new[$key] = $v; unset($tmp[$k]); } } } print_r($new);
3. 稍复杂
<?php $arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33], ['name'=>'Totti', 'age'=>40] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ]; echo '<pre>'; $tmp = []; foreach($arr as $key => $val) { foreach($arr2 as $k => $v) { if($key == $k && 0 == $key) { if($v['age'] < $val['age']) { $tmp[] = $v; unset($arr2[0]); } elseif ($v['age'] > $val['age']) { $tmp[] = $val; unset($arr[0]); } else { $tmp[] = $val; $tmp[] = $v; unset($arr[0]); unset($arr2[0]); } } else { if($v['age'] < $val['age']) { $tmp[] = $v; unset($arr2[$k]); if(empty($arr2)) { $tmp = array_merge($tmp, $arr); } } elseif($v['age'] > $val['age']) { $tmp[] = $val; unset($arr[$key]); if(empty($arr)) { $tmp = array_merge($tmp, $arr2); } break; } else { $tmp[] = $val; $tmp[] = $v; unset($arr2[$k]); unset($arr[$key]); if(empty($arr)) { $tmp = array_merge($tmp, $arr2); } break; } } } } print_r($tmp);
4. 把年龄作为索引,使用 ksort() 函数进行排序。缺点:如果遇到了相同的年龄,则只能保留一组键值
<?php $arr = [ ['name'=>'dee','age'=>28], ['name'=>'emperor', 'age'=>30], ['name'=>'Lee', 'age'=>32], ['name'=>'Arshavin', 'age'=>33], ['name'=>'Totti', 'age'=>40] ]; $arr2 = [ ['name'=>'Ozil', 'age'=>27], ['name'=>'CR7', 'age'=>29], ['name'=>'Doctor', 'age'=>33], ['name'=>'John', 'age'=>35] ]; echo '<pre>'; foreach($arr as $key => $val) { $arr[$val['age']] = $val; unset($arr[$key]); } foreach($arr2 as $key => $val) { $arr2[$val['age']] = $val; unset($arr2[$key]); } $new = $arr + $arr2; //遇到相同的索引时,只会保留第一个数组中重复的键值 ksort($new); $new = array_values($new); print_r($new); /* 说明:结果集中没有 $arr2 中索引为"Doctor"的键值 Array ( [0] => Array ( [name] => Ozil [age] => 27 ) [1] => Array ( [name] => dee [age] => 28 ) [2] => Array ( [name] => CR7 [age] => 29 ) [3] => Array ( [name] => emperor [age] => 30 ) [4] => Array ( [name] => Lee [age] => 32 ) [5] => Array ( [name] => Arshavin [age] => 33 ) [6] => Array ( [name] => John [age] => 35 ) [7] => Array ( [name] => Totti [age] => 40 ) )
相关文章
- RabbitMQ 入门教程(PHP版) 第四部分:路由(Routing)
- 一次对php大马的后门的简单分析
- PHP 性能分析与实验——性能的宏观分析
- PHP如何快速读取大文件
- PHP Socket编程 之 php实现http服务
- PHP Socket编程 之 php中连接tcp服务的三种方式
- Nano v1.0 发布!一个 PHP 文件搭建 Hyperf 应用
- php:如何使用PHP排序, key为字母+数字的数组(多维数组)
- PHP采集库-Snoopy.class.php
- 【Windows】任务计划去定时调用php程序
- php数据库连接mysql与mysqli的区别与用法
- LZW算法PHP实现方法 lzw_decompress php
- Relearning PHP (2) – php 的浮点数float
- file not found. nginx php nginx 如何开启解析 PHP 的功能
- php之分页类代码
- php之递归调用,递归创建目录
- PHP获取数组的一个元素
- [PHP] 如何让 php-fpm 的循环 echo 实时输出到浏览器
- [php-src] 窥探Php内核中的数组与面向对象
- [php-src] 理解Php内核中的函数与INI
- 统计php程序运行时间及设置PHP最长运行时间
- SQLMaestro PHP Generator v2022 Crack