HOWTO · PHP

PHP 扁平化陣列

本教程演示瞭如何在 PHP 中展平多維陣列。

本頁內容

扁平化陣列意味著將多維陣列轉換為一維陣列。PHP 有不同的方法來展平陣列,我們將在這裡討論它們。

在 PHP 中使用 Recursiveiteratoriterator 和 Recursivearrayiterator 操作展平陣列

SPL 庫具有用於展平多維陣列的迭代器。我們使用了兩個迭代器,RecursiveIteratorIterator 和 RecursiveArrayIterator,來操作展平陣列。

<?php
$demo_array = array('a', 'b', 'c', 'd', array('e', 'f', 'g', 'h',  array('i', 'j', 'k'), 'l', 'm', 'n', 'o'), 'p', 'q', 'r', 's');
$iter_object = new RecursiveIteratorIterator(new RecursiveArrayIterator($demo_array));
$flatten_array= array();
foreach($iter_object as $value) {
  array_push($flatten_array,$value);
}
print_r($flatten_array);
?>

輸出:

Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i [9] => j [10] => k [11] => l [12] => m [13] => n [14] => o [15] => p [16] => q [17] => r [18] => s ) 

該程式碼包含一個三層陣列,該陣列將被展平為一維陣列。

在 PHP 中使用 array_walk_recursive 展平多維陣列

內建函式 array_walk_recursive 可以與閉包函式一起使用,以展平 PHP 中的多維陣列。

<?php
function flatten_array(array $demo_array) {
    $new_array = array();
    array_walk_recursive($demo_array, function($array) use (&$new_array) { $new_array[] = $array; });
    return $new_array;
}
$demo_array = array('a', 'b', 'c', 'd', array('e', 'f', 'g', 'h',  array('i', 'j', 'k'), 'l', 'm', 'n', 'o'), 'p', 'q', 'r', 's');

$new_array = flatten_array($demo_array);

print_r($new_array);
?>

輸出:

Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i [9] => j [10] => k [11] => l [12] => m [13] => n [14] => o [15] => p [16] => q [17] => r [18] => s )

帶有閉包函式的 array_walk_recursive 將給定的多維陣列展平。

在 PHP 中使用 for 迴圈展平多維陣列

我們可以使用 for 迴圈來展平多維陣列;可能需要額外的內建函式。

<?php
function flatten_array($demo_array,$new_array) {
    for($i = 0; $i < count($demo_array); $i++) {
        if(is_array($demo_array[$i])) {
            $new_array = flatten_array($demo_array[$i], $new_array);
        }
        else {
            if(isset($demo_array[$i])) {
            $new_array[] = $demo_array[$i];
            }
        }
    }
    return $new_array;
}

$demo_array = array('a', 'b', 'c', 'd', array('e', 'f', 'g', 'h',  array('i', 'j', 'k'), 'l', 'm', 'n', 'o'), 'p', 'q', 'r', 's');
print_r(flatten_array($demo_array, array()));
?>

輸出:

Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i [9] => j [10] => k [11] => l [12] => m [13] => n [14] => o [15] => p [16] => q [17] => r [18] => s )

上面的程式碼將通過在 for 迴圈的幫助下迭代給定陣列來生成一個扁平陣列。

在 PHP 中使用 while 迴圈展平多維陣列

<?php
function flatten_array ($demo_array){
    $x = 0;
    while ($x < count ($demo_array)){
        while (is_array ($demo_array[$x])){
            if (!$demo_array[$x]){
                array_splice ($demo_array, $x, 1);
                --$x;
                break;
            }
            else{
                array_splice ($demo_array, $x, 1, $demo_array[$x]);
            }
        }
        ++$x;
    }
    return $demo_array;
}
$demo_array = array('a', 'b', 'c', 'd', array('e', 'f', 'g', 'h',  array('i', 'j', 'k'), 'l', 'm', 'n', 'o'), 'p', 'q', 'r', 's');
print_r(flatten_array($demo_array));
?>

輸出:

Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i [9] => j [10] => k [11] => l [12] => m [13] => n [14] => o [15] => p [16] => q [17] => r [18] => s )

給定的陣列在 while 迴圈和 array_splice 函式的幫助下變平,該函式用於刪除陣列的一部分並將其替換為其他內容。

在 PHP 中使用 foreach 迴圈展平多維陣列

<?php
function flatten_array($demo_array) {
    if (!is_array($demo_array)) {
        // make sure the input is an array
        return array($demo_array);
    }

    $new_array = array();
    foreach ($demo_array as $value) {
        $new_array = array_merge($new_array, flatten_array($value));
    }

    return $new_array;
}

$demo_array = array('a', 'b', 'c', 'd', array('e', 'f', 'g', 'h',  array('i', 'j', 'k'), 'l', 'm', 'n', 'o'), 'p', 'q', 'r', 's');
print_r(flatten_array($demo_array));
?>

輸出:

Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i [9] => j [10] => k [11] => l [12] => m [13] => n [14] => o [15] => p [16] => q [17] => r [18] => s )

給定的陣列使用 foreach 迴圈和 array_merge() 函式變平,該函式將兩個陣列合二為一。