PHP 陣列函式妙用

lufeijun1234發表於2018-10-31
 最近在開發中遇到一個需求,突發奇想用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 協議》,轉載必須註明作者和本文連結

相關文章