Đệ quy và cấu trúc đa chiều trong PHP
Cho một mảng đa chiều với cấp độ lồng nhau tùy ý, ví dụ, như thế này:
<?php
$arr = [
1,
[
2, 7, 8
],
[
3, 4, [5, [6, 7]],
]
];
?>
Như bạn thấy, mảng này có cấu trúc phức tạp, và giả định rằng cấu trúc này có thể là tùy ý và các cấp độ lồng nhau có thể sâu đến mức bất kỳ.
Giả sử chúng ta muốn in ra tất cả các phần tử nguyên thủy (tức là không phải mảng) của mảng của chúng ta. Trong trường hợp này, để duyệt qua mảng như vậy, chúng ta đơn giản sẽ không thể sử dụng các vòng lặp, vì mảng có cấu trúc không đều và cấp độ lồng nhau không xác định.
Tuy nhiên, để duyệt qua một mảng như vậy, đệ quy sẽ rất thuận tiện.
Đầu tiên, hãy tạo một hàm, trong đó chúng ta truyền mảng của mình làm tham số, và trong hàm chúng ta tạo một vòng lặp để duyệt qua mảng của chúng ta:
<?php
function func($arr) {
foreach ($arr as $elem) {
echo $elem;
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Vòng lặp chúng ta tạo sẽ chỉ duyệt qua
các phần tử của mảng chính. Tức là đầu tiên
nó sẽ xuất ra 1, sau đó [2, 7, 8],
và sau đó [3, 4, [5, [6, 7]].
Bây giờ chúng ta hãy phân tách trong vòng lặp các phần tử nguyên thủy và các phần tử là mảng:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
// phần tử là mảng
} else {
// phần tử là nguyên thủy
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Và bây giờ chúng ta sẽ làm sao cho nếu phần tử của chúng ta là một mảng, hàm sẽ gọi chính nó, truyền tham số là mảng đó:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
func($elem);
} else {
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
Cho một mảng đa chiều với cấp độ lồng nhau tùy ý, ví dụ, như thế này:
<?php
$arr = [1, 2, 3, [4, 5, [6, 7]], [8, [9, 10]]];
?>
Sử dụng đệ quy, hãy xuất tất cả các phần tử nguyên thủy của mảng này ra màn hình.