使用 php 的 array_group_by() 函數(shù)可以對(duì)數(shù)組中的數(shù)據(jù)進(jìn)行分組,從而方便進(jìn)行統(tǒng)計(jì)分析,包括:分組后,可以通過(guò) array_map() 函數(shù)計(jì)算每個(gè)組中的元素?cái)?shù)量。還可以通過(guò)自定義回調(diào)函數(shù)找出每個(gè)組中具有最大值的元素。通過(guò)分組,可以進(jìn)行實(shí)戰(zhàn)案例應(yīng)用,例如計(jì)算商品訂單數(shù)據(jù)中每個(gè)產(chǎn)品組的總銷售額。
PHP 數(shù)組分組函數(shù)在統(tǒng)計(jì)分析中的應(yīng)用
在進(jìn)行統(tǒng)計(jì)分析時(shí),經(jīng)常需要對(duì)數(shù)組中的數(shù)據(jù)進(jìn)行分組和統(tǒng)計(jì)。PHP 提供了強(qiáng)大的數(shù)組分組函數(shù) array_group_by()
,可以輕松地根據(jù)指定鍵對(duì)數(shù)組進(jìn)行分組。
array_group_by() 用法
array_group_by()
函數(shù)接受兩個(gè)參數(shù):
數(shù)組: 要進(jìn)行分組的數(shù)組。
鍵選擇器: 一個(gè)閉包或字符串函數(shù),用于返回每個(gè)數(shù)組元素要分組的鍵。
函數(shù)返回一個(gè)分組后的數(shù)組,鍵是按鍵選擇器計(jì)算的鍵,值是被分組的數(shù)組元素。
示例:
分組以下學(xué)生數(shù)組按性別:
$students = [ ['id' => 1, 'name' => 'Alice', 'gender' => 'F'], ['id' => 2, 'name' => 'Bob', 'gender' => 'M'], ['id' => 3, 'name' => 'Carol', 'gender' => 'F'], ]; $genderGrouped = array_group_by($students, 'gender');
登錄后復(fù)制
結(jié)果:
[ 'F' => [ ['id' => 1, 'name' => 'Alice', 'gender' => 'F'], ['id' => 3, 'name' => 'Carol', 'gender' => 'F'], ], 'M' => [ ['id' => 2, 'name' => 'Bob', 'gender' => 'M'], ], ]
登錄后復(fù)制
統(tǒng)計(jì)分析應(yīng)用
使用 array_group_by()
進(jìn)行分組后,可以使用其他函數(shù)對(duì)分組后的數(shù)組進(jìn)行統(tǒng)計(jì)分析。例如:
頻率計(jì)數(shù): 計(jì)算每個(gè)組中元素的數(shù)量:
$genderCounts = array_map('count', $genderGrouped);
登錄后復(fù)制
最大值: 查找每個(gè)組中具有最大值的元素:
$maxAgeByGender = array_map(function($group) { return max($group, function($a, $b) { return $a['age'] - $b['age']; }); }, $ageGrouped);
登錄后復(fù)制
實(shí)戰(zhàn)案例
以下是一個(gè)實(shí)戰(zhàn)案例,演示如何使用 array_group_by()
對(duì)商品訂單數(shù)據(jù)進(jìn)行分組并計(jì)算每個(gè)產(chǎn)品組的總銷售額:
$orders = [ ['product_id' => 1, 'quantity' => 2, 'price' => 10], ['product_id' => 2, 'quantity' => 1, 'price' => 15], ['product_id' => 1, 'quantity' => 3, 'price' => 10], ]; // 按產(chǎn)品 ID 分組 $groupedByProduct = array_group_by($orders, 'product_id'); // 計(jì)算每個(gè)組的總銷售額 $productSales = array_map(function($group) { return array_reduce($group, function($carry, $item) { return $carry + ($item['quantity'] * $item['price']); }, 0); }, $groupedByProduct);
登錄后復(fù)制
結(jié)果:
[ 1 => 50, // 總銷售額為 $50 的產(chǎn)品 1 2 => 15, // 總銷售額為 $15 的產(chǎn)品 2 ]
登錄后復(fù)制