巧妙利用php数组函数,解决二维数组查找问题

问题描述

最近在开发中遇到一个需求,突发奇想用php数组函数解决,在此记录一下。

问题简述:假设从数据表中取出所有同学成绩,需要按照如下规则进行查找数据:

1、找出所有同学中语文成绩最好的同学;

2、在1的基础上接着找到数学成绩最高的同学;

3、在2的基础上接着找到英语成绩最高的同学;

解决思路

刚遇到这个需求,第一反应就是不断循环数组进行查找过滤,思路没啥问题就是写出来代码过于丑陋,php毕竟是世界上最好的

语言,不可能没有其他处理办法,终于在一番头脑风暴之后找到下面思路:

* 利用array_column函数取得所有同学语文成绩;

* 接着用max函数找到语文最高分;

* 最后用array_filter过滤出语文最高分的同学们;

* 循环前三步,即可解决上述问题;

直接上代码

$grades = [

['name'=>'姓名一','语文'=>85,'数学'=>99,'英语'=>77],

['name'=>'姓名二','语文'=>85,'数学'=>99,'英语'=>77],

['name'=>'姓名三','语文'=>99,'数学'=>67,'英语'=>50],

['name'=>'姓名四','语文'=>99,'数学'=>67,'英语'=>90],

['name'=>'姓名五','语文'=>99,'数学'=>67,'英语'=>90],

['name'=>'姓名六','语文'=>99,'数学'=>55,'英语'=>77],

['name'=>'姓名七','语文'=>99,'数学'=>55,'英语'=>77],

['name'=>'姓名八','语文'=>86,'数学'=>88,'英语'=>90],

['name'=>'姓名九','语文'=>86,'数学'=>88,'英语'=>90],

['name'=>'姓名十','语文'=>86,'数学'=>88,'英语'=>90],

['name'=>'姓名1','语文'=>86,'数学'=>76,'英语'=>77],

['name'=>'姓名2','语文'=>86,'数学'=>76,'英语'=>60],

['name'=>'姓名3','语文'=>77,'数学'=>76,'英语'=>60],

];

// 找到语文最高分

$yuwenMax = max(array_column($grades,'语文'));

$grades = array_filter($grades,function($value) use ($yuwenMax) {

return $value['语文'] == $yuwenMax;

});

// 找到数学最高分

$shuxueMax = max(array_column($grades,'数学'));

$grades = array_filter($grades,function($value) use ($shuxueMax) {

return $value['数学'] == $shuxueMax;

});

// 找到英语最高分

$yingyuMax = max(array_column($grades,'英语'));

$grades = array_filter($grades,function($value) use ($yingyuMax) {

return $value['英语'] == $yingyuMax;

});

进一步精简代码

上述代码中,在找语文、数学、英语最高分的时候,代码基本相同,很容易想到可以用foreach循环处理,使上边的代码进一步简化。

代码如下

$columns = ['语文','数学','英语'];

foreach ($columns as $column) {

$max = max(array_column($grades,$column));

$grades = array_filter($grades,function($value) use ($max,$column) {

return $value[$column] == $max;

});

}

本作品采用《CC 协议》,转载必须注明作者和本文链接

PHP数组用处_PHP 数组函数妙用相关推荐

  1. php 数组合并_PHP数组常用函数分类整理

    微信公众号:PHP在线 PHP数组常用函数分类整理 一.数组操作的基本函数 数组的键名和值array_values($arr); 获得数组的值array_keys($arr); 获得数组的键名arra ...

  2. php把数组合并,php数组合并_php数组合并、追加与连接的方法、array_combine函数)

    摘要 腾兴网为您分享:php数组合并.追加与连接的方法.array_combine函数),微视,听中国,顺风车,拍照识别等软件知识,以及爱听360听书,粤省事app,爱车管家,二级域名分发系统,电脑连 ...

  3. php如何把两个array相加_php两个数组相加_PHP数组合并之array_merge和数组相加

    摘要 腾兴网为您分享:PHP数组合并之array_merge和数组相加,万师傅,腾讯qq,时光机器,轻微课等软件知识,以及东莞市教育局,kkg黄金商城,mp3cutter,91算命,医疗,一爱,qq拼 ...

  4. PHP求两个数据的交集,php计算两数组交集两个函数_PHP教程

    ,使用 array_intersect 求两个数组的交集比使用 array_diff 求同样两个数组的并集要快. 如果要求数组 $a 与数组 $b 的差集的个数,应该使用 count($a) - co ...

  5. php怎么比较数组长度_PHP获取数组长度的方法 函数参数的比较

    在php中获取数组长度方法很简单,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度哦,下面我们来看几个实例吧. php如何获取数组的长度,使用php函数 ...

  6. php中数组下标,PHP数组介绍_php

    数组基础: php中,数组的下标可以整数,也可以是字符串 php中,数组的元素顺序不是由下标决定,而是由其"加入"的顺序决定 定义: $arr1 = array(元素1,元素2,. ...

  7. Go 学习笔记(10)— 数组定义、数组声明、数组初始化、访问数组、数组相等、向函数传递数组

    1. 数组定义 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 2. 声明数组 Go 语言数组声明需要指定元素类型及元素个数,语 ...

  8. 用子函数的方法求一个3*4的数组的转置数组

    <程序设计基础实训指导教程-c语言> ISBN 978-7-03-032846-5 p142 7.1.2 上级实训内容 [实训内容3]用子函数的方法求一个3*4的数组的转置数组 #incl ...

  9. php方法数组注释,php中的注释、变量、数组、常量、函数应用介绍

    php中单引号与双引号的区别? 1. 由下可看出,双引号的变量是解析并输出,而单引号的变量不解析. 2.单引号的解析速度比双引号的快 3. 对于单引号来说,只有两个转义 \',\\ 4. 除了上述两个 ...

最新文章

  1. 深度学习~生成式对抗神经网络GAN
  2. java、oracle对CLOB处理
  3. html文本弹性,HTML5 很有趣的文本蹦床/弹性弯曲动效
  4. DBA跳槽应该去大公司还是小公司?99%的人这样说...
  5. 数学常用公式及规律、结论(一)
  6. 牛客多校第九场 ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解...
  7. 2022官网下载jdk8教程
  8. FPGA实验记录一:1位全加器设计
  9. 【微信小程序模板直接套用】微信小程序制作模板套用平台
  10. 浦发银行计算机基础知识题库,2018浦发银行面试经验(信息科技岗,总行信息技术岗等)...
  11. 计算机控制试题库 百度文库,计算机控制技术练习题附答案_百度文库.doc
  12. 怎么设置html z值,正态分布1.96 统计学,Z=1.96怎么来的
  13. 准备写个linux下的千千静听
  14. 立方度量(Cubic Metric)
  15. 复旦大学智能感知与无人系统实验室诚聘海内外超级博士后/博士后
  16. C语言基础---3.格式化输出总结---%d ,%s,%f %.3f,%m.ns 以及sprintf函数
  17. 基于Seq2Seq的问答摘要与推理问题方案
  18. 在私有云上创建虚拟机
  19. 多线程管程法(生产者消费者问题)
  20. 论坛发贴与跟贴的技巧

热门文章

  1. signature=0a26d8967069103efeee67346aac0529,Construction of Thinned Gated Single-Assignment Form
  2. 关于不能成为专业软件测试人员的10大理由的一些阐述
  3. C++——虚函数(Virtual Member Functions) 【functions语意学】
  4. SB Admin 2 学习笔记1
  5. 微软职位内部推荐-Principal Dev Manager
  6. [征求意见]关于增加Java技术区
  7. 快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)
  8. Netflix实用API设计 1:Protobuf FieldMask实践
  9. 告别硬编码,SpringBoot实现动态增删启停定时任务
  10. 雷军这个程序员!真的牛逼!