當前位置: 首頁> 最新文章列表> 與array_reduce() 搭配構建複雜的數據結構

與array_reduce() 搭配構建複雜的數據結構

M66 2025-06-07

在PHP中, array_combine()array_reduce()是非常強大的函數,分別用於將兩個數組合併為一個關聯數組,並將數組元素按特定的規則進行歸約(即簡化或轉換)。當這兩個函數配合使用時,可以輕鬆地構建出更加複雜的數據結構。在本文中,我們將探討如何將這兩個函數結合使用,以構建多層嵌套的數組或其他復雜的數據結構。

什麼是array_combine()

array_combine()是一個PHP 內置函數,接受兩個數組作為參數,將第一個數組的值作為鍵,第二個數組的值作為值,最終返回一個新的關聯數組。如果兩個數組的長度不同,函數會返回false

示例代碼:

 $keys = ["name", "age", "gender"];
$values = ["John", 25, "male"];

$result = array_combine($keys, $values);
print_r($result);

輸出:

 Array
(
    [name] => John
    [age] => 25
    [gender] => male
)

什麼是array_reduce()

array_reduce()也是一個PHP 內置函數,它用於將數組的值通過一個回調函數逐步簡化為一個單一的值。通常情況下,這個值可以是一個累加和,也可以是其他復雜的結構。

示例代碼:

 $numbers = [1, 2, 3, 4, 5];

$sum = array_reduce($numbers, function($carry, $item) {
    return $carry + $item;
});

echo $sum; // 輸出 15

array_combine()array_reduce()配合使用

array_combine()array_reduce()在處理複雜的數據結構時非常有用,尤其是當你需要根據一個鍵值對的數組來生成某種匯總結構時。我們可以通過這兩個函數結合的方式來創建一個更加複雜的、嵌套的數組。

示例:根據一組數據構建多層嵌套的關聯數組

假設我們有一組數據,包含學生的成績,我們希望將這些成績按科目進行分組,然後通過array_combine()來生成每個科目的成績匯總。

 $students = [
    ["name" => "John", "subject" => "Math", "score" => 85],
    ["name" => "Alice", "subject" => "Math", "score" => 92],
    ["name" => "Bob", "subject" => "Math", "score" => 78],
    ["name" => "John", "subject" => "Science", "score" => 88],
    ["name" => "Alice", "subject" => "Science", "score" => 94],
    ["name" => "Bob", "subject" => "Science", "score" => 79],
];

$subjects = array_reduce($students, function($carry, $item) {
    // 用 subject 作為鍵,成績作為值進行分組
    if (!isset($carry[$item['subject']])) {
        $carry[$item['subject']] = [];
    }
    $carry[$item['subject']][] = $item['score'];
    return $carry;
}, []);

print_r($subjects);

輸出:

 Array
(
    [Math] => Array
        (
            [0] => 85
            [1] => 92
            [2] => 78
        )

    [Science] => Array
        (
            [0] => 88
            [1] => 94
            [2] => 79
        )
)

在這個例子中,我們首先使用array_reduce()根據科目( subject )將學生的成績( score )進行分組。然後我們可以進一步使用array_combine()來將每個科目的學生姓名和成績進行映射,構建更加複雜的結構。

進一步複雜化:構建多層嵌套數組

接下來,我們繼續使用array_combine() ,將每個科目中的學生成績進一步按學生姓名進行細分:

 $students = [
    ["name" => "John", "subject" => "Math", "score" => 85],
    ["name" => "Alice", "subject" => "Math", "score" => 92],
    ["name" => "Bob", "subject" => "Math", "score" => 78],
    ["name" => "John", "subject" => "Science", "score" => 88],
    ["name" => "Alice", "subject" => "Science", "score" => 94],
    ["name" => "Bob", "subject" => "Science", "score" => 79],
];

$subjects = array_reduce($students, function($carry, $item) {
    if (!isset($carry[$item['subject']])) {
        $carry[$item['subject']] = [];
    }
    // 以学生的姓名作為鍵,成績作為值進行映射
    $carry[$item['subject']] = array_combine(
        array_column($carry[$item['subject']], 'name'), 
        array_column($carry[$item['subject']], 'score')
    );
    return $carry;
}, []);

print_r($subjects);

此時我們通過array_column()提取出相應的鍵和值,最終我們就能構建出一個更加複雜的嵌套數組,允許我們按科目和學生姓名進行多層次的查找和操作。

這樣通過結合使用array_combine()array_reduce() ,我們可以輕鬆地構建出根據不同規則分組和匯總的數據結構。在實際開發中,靈活使用這些函數,可以有效提高數據處理的效率和可讀性。