PHPでは、 array_chunkとarray_reduceは、2つの非常に強力な配列操作関数です。 array_chunkは大きな配列を複数の小さな配列に分割できますが、 array_reduceはアレイ内の要素を再帰的に処理してから集計できます。場合によっては、アレイをグループ化し、グループ化後に何らかの集約操作を行います。この記事では、これら2つの機能を組み合わせてこの目標を達成する方法について説明します。
array_chunkは、配列を複数の小さなアレイに分割するPHPの関数です。指定されたサイズに応じて元のアレイを複数のサブアレイに分割し、2次元配列を返します。例えば:
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$chunks = array_chunk($array, 3);
print_r($chunks);
出力の結果は次のとおりです。
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 4
[1] => 5
[2] => 6
)
[2] => Array
(
[0] => 7
[1] => 8
[2] => 9
)
)
この例では、 array_chunkは元の配列をサイズ3の3つのサブアレイに分割します。
array_reduce関数は、配列とコールバック関数をパラメーターとして受け入れ、配列内の要素の「削減」操作を実行します。これは、配列の最初の要素から始まり、前の要素の結果とともにコールバック関数の結果とともに現在の要素を渡し、最終的に単一の値を返します。例えば:
$array = [1, 2, 3, 4, 5];
$sum = array_reduce($array, function($carry, $item) {
return $carry + $item;
});
echo $sum; // 出力 15
この例では、 array_reduceは配列内の要素を蓄積し、最後に配列の合計を返します。
Array_chunkとarray_reduceの基本的な使用法がわかったので、それらを組み合わせてアレイのグループ化と集約を実装するようにしてください。
ユーザー注文データを含む配列があるとして、ユーザーIDで注文をグループ化し、各ユーザーの合計注文額を計算します。最初にarray_chunkを使用してユーザーIDごとにグループ化し、次にarray_reduceを使用して各データセットを集約および計算できます。
// 次の注文データが利用可能であると仮定します,各注文には1つが含まれています user_id および金額 amount
$orders = [
['user_id' => 1, 'amount' => 100],
['user_id' => 2, 'amount' => 200],
['user_id' => 1, 'amount' => 150],
['user_id' => 3, 'amount' => 300],
['user_id' => 2, 'amount' => 50],
['user_id' => 1, 'amount' => 200],
];
// 使用 array_chunk によると user_id グループ注文
$chunks = array_chunk($orders, 2); // グループごとにせいぜい2つの注文があると仮定します
// 使用 array_reduce グループあたりの合計注文額
$result = array_map(function($chunk) {
return array_reduce($chunk, function($carry, $item) {
$carry['user_id'] = $item['user_id'];
$carry['total_amount'] += $item['amount'];
return $carry;
}, ['total_amount' => 0]);
}, $chunks);
// 出力结果
print_r($result);
出力結果:
Array
(
[0] => Array
(
[user_id] => 1
[total_amount] => 250
)
[1] => Array
(
[user_id] => 2
[total_amount] => 250
)
[2] => Array
(
[user_id] => 3
[total_amount] => 300
)
)
この例では、最初にArray_chunkを使用してグループごとに2注文データをグループ化します。次に、 array_reduceを使用して各グループの注文グループを集計して、各ユーザーの合計注文額を計算します。
上記の操作を完全な関数にカプセル化する場合、コードは次のとおりです。
function groupAndAggregateOrders($orders) {
// によると用户 ID グループ化
$chunks = array_chunk($orders, 2); // グループごとにせいぜい2つの注文があると仮定します
// 对每个グループ化计算用户的总订单金额
return array_map(function($chunk) {
return array_reduce($chunk, function($carry, $item) {
$carry['user_id'] = $item['user_id'];
$carry['total_amount'] += $item['amount'];
return $carry;
}, ['total_amount' => 0]);
}, $chunks);
}
// テストデータ
$orders = [
['user_id' => 1, 'amount' => 100],
['user_id' => 2, 'amount' => 200],
['user_id' => 1, 'amount' => 150],
['user_id' => 3, 'amount' => 300],
['user_id' => 2, 'amount' => 50],
['user_id' => 1, 'amount' => 200],
];
// 呼び出し関数
$result = groupAndAggregateOrders($orders);
// 出力结果
print_r($result);
array_chunkとarray_reduceを組み合わせることで、配列を簡単にグループ化して集約できます。 array_chunkを使用すると、データを複数のグループに分割できますが、 array_reduceを使用すると、各グループ内でカスタム集約計算を実行できます。これら2つの組み合わせは、コードの読みやすさと複雑なデータを処理する機能を大幅に改善できます。