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