بخش چهارم: آرایه‌های چندبعدی

۴-۱. تعریف آرایه چندبعدی

آرایه‌ای که عناصر آن خودشان آرایه باشند، آرایه چندبعدی نامیده می‌شود. ساده‌ترین حالت آن، آرایه دوبعدی است؛ یعنی آرایه‌ای که هر عنصر آن یک آرایه است.

مثال:

<?php
$students = [
    ["علی", 17],
    ["رضا", 18],
    ["مریم", 16]
];
?>

در این آرایه، هر عنصر یک آرایه کوچک‌تر است. به‌طور کلی، آرایه چندبعدی برای نگهداری داده‌های جدولی مناسب است.

۴-۲. ساختار آرایه دوبعدی

آرایه دوبعدی را می‌توان مانند یک جدول تصور کرد. سطرها با کلید اول و ستون‌ها با کلید دوم مشخص می‌شوند.

<?php
$students = [
    ["علی", 17, "کامپیوتر"],
    ["رضا", 18, "حسابداری"],
    ["مریم", 16, "کامپیوتر"]
];
?>

در این مثال:

سطر ستون 0 ستون 1 ستون 2
0 علی 17 کامپیوتر
1 رضا 18 حسابداری
2 مریم 16 کامپیوتر

۴-۳. دسترسی به عناصر آرایه دوبعدی

برای دسترسی به یک عنصر، ابتدا کلید سطر و سپس کلید ستون را می‌نویسیم.

<?php
$students = [
    ["علی", 17, "کامپیوتر"],
    ["رضا", 18, "حسابداری"],
    ["مریم", 16, "کامپیوتر"]
];

echo $students[0][0]; // علی
echo $students[1][1]; // 18
echo $students[2][2]; // کامپیوتر
?>

۴-۴. تغییر مقدار یک عنصر

<?php
$students = [
    ["علی", 17, "کامپیوتر"],
    ["رضا", 18, "حسابداری"]
];

$students[1][1] = 19;

print_r($students);
?>

خروجی:

Array
(
    [0] => Array
        (
            [0] => علی
            [1] => 17
            [2] => کامپیوتر
        )

    [1] => Array
        (
            [0] => رضا
            [1] => 19
            [2] => حسابداری
        )
)

۴-۵. افزودن سطر جدید

برای افزودن یک سطر جدید، یک آرایه جدید به انتهای آرایه اصلی اضافه می‌کنیم.

<?php
$students = [
    ["علی", 17],
    ["رضا", 18]
];

$students[] = ["مریم", 16];

print_r($students);
?>

۴-۶. افزودن ستون جدید به یک سطر

برای افزودن مقدار جدید به یک سطر، از کلید بعدی آن سطر استفاده می‌کنیم.

<?php
$students = [
    ["علی", 17],
    ["رضا", 18]
];

$students[0][] = "کامپیوتر";
$students[1][] = "حسابداری";

print_r($students);
?>

۴-۷. حذف یک سطر

<?php
$students = [
    ["علی", 17],
    ["رضا", 18],
    ["مریم", 16]
];

unset($students[1]);

print_r($students);
?>

نکته: پس از حذف، کلیدهای آرایه اصلی به‌طور خودکار مرتب نمی‌شوند.

۴-۸. حذف یک عنصر از یک سطر

<?php
$students = [
    ["علی", 17, "کامپیوتر"],
    ["رضا", 18, "حسابداری"]
];

unset($students[0][2]);

print_r($students);
?>

۴-۹. پیمایش آرایه دوبعدی

برای مرور همه عناصر آرایه دوبعدی، معمولاً از دو حلقه تودرتو استفاده می‌کنیم.

استفاده از foreach تودرتو

<?php
$students = [
    ["علی", 17, "کامپیوتر"],
    ["رضا", 18, "حسابداری"],
    ["مریم", 16, "کامپیوتر"]
];

foreach ($students as $row) {
    foreach ($row as $value) {
        echo $value . " | ";
    }
    echo "<br>";
}
?>

خروجی:

علی | 17 | کامپیوتر |
رضا | 18 | حسابداری |
مریم | 16 | کامپیوتر |

استفاده از foreach با کلید سطر

<?php
$students = [
    ["علی", 17],
    ["رضا", 18]
];

foreach ($students as $rowIndex => $row) {
    echo "سطر " . $rowIndex . ": ";
    foreach ($row as $value) {
        echo $value . " ";
    }
    echo "<br>";
}
?>

خروجی:

سطر 0: علی 17
سطر 1: رضا 18

استفاده از حلقه for

<?php
$students = [
    ["علی", 17],
    ["رضا", 18]
];

for ($i = 0; $i < count($students); $i++) {
    for ($j = 0; $j < count($students[$i]); $j++) {
        echo $students[$i][$j] . " ";
    }
    echo "<br>";
}
?>

۴-۱۰. آرایه دوبعدی با کلید انجمنی

می‌توان در آرایه دوبعدی از کلیدهای رشته‌ای نیز استفاده کرد.

<?php
$students = [
    [
        "name"  => "علی",
        "age"   => 17,
        "field" => "کامپیوتر"
    ],
    [
        "name"  => "رضا",
        "age"   => 18,
        "field" => "حسابداری"
    ]
];

echo $students[0]["name"]; // علی
echo $students[1]["field"]; // حسابداری
?>

پیمایش این آرایه:

<?php
foreach ($students as $student) {
    foreach ($student as $key => $value) {
        echo $key . " : " . $value . " | ";
    }
    echo "<br>";
}
?>

مطالعه تکمیلی: آرایه دوبعدی با کلید انجمنی برای نگهداری رکوردهای پایگاه داده بسیار رایج است. هر سطر یک رکورد و هر کلید یک نام ستون است. در پروژه‌های واقعی، نتیجه پرس‌وجوهای پایگاه داده معمولاً به همین شکل دریافت می‌شود.

۴-۱۱. آرایه سه‌بعدی

آرایه‌ای که عناصر آن آرایه دوبعدی باشند، آرایه سه‌بعدی نامیده می‌شود.

<?php
$data = [
    [
        ["علی", 17],
        ["رضا", 18]
    ],
    [
        ["مریم", 16],
        ["سارا", 15]
    ]
];

echo $data[1][0][0]; // مریم
?>

پیمایش آرایه سه‌بعدی به سه حلقه تودرتو نیاز دارد.

<?php
foreach ($data as $level1) {
    foreach ($level1 as $level2) {
        foreach ($level2 as $value) {
            echo $value . " ";
        }
        echo "<br>";
    }
}
?>

مطالعه تکمیلی: استفاده از آرایه‌های سه‌بعدی و بیشتر در برنامه‌های معمول کمتر رایج است. در بیشتر موارد، استفاده از آرایه دوبعدی با کلیدهای انجمنی خواناتر و قابل نگهداری‌تر است. اگر ساختار داده پیچیده‌تر شود، بهتر است به جای آرایه‌های چندبعدی عمیق، از ساختارهای شی‌گرا استفاده شود.

۴-۱۲. شمارش عناصر در آرایه چندبعدی

تابع count به‌طور پیش‌فرض فقط عناصر سطح اول را می‌شمارد.

<?php
$students = [
    ["علی", 17],
    ["رضا", 18],
    ["مریم", 16]
];

echo count($students); // 3
?>

برای شمارش همه عناصر به‌صورت بازگشتی، از حالت COUNT_RECURSIVE استفاده می‌کنیم.

<?php
echo count($students, COUNT_RECURSIVE); // 9
?>

در مثال بالا، 3 سطر و هر سطر 2 مقدار دارد؛ بنابراین مجموع عناصر 9 است.

مطالعه تکمیلی: شمارش بازگشتی شامل خود آرایه‌های داخلی نیز می‌شود. به همین دلیل عدد حاصل ممکن است بیشتر از تعداد مقادیر نهایی باشد. برای درک دقیق، ساختار آرایه را با print_r بررسی کنید.

۴-۱۳. مثال کامل

<?php
$products = [
    [
        "name"  => "کیبورد",
        "price" => 450000,
        "count" => 10
    ],
    [
        "name"  => "ماوس",
        "price" => 250000,
        "count" => 20
    ]
];

$products[] = [
    "name"  => "مانیتور",
    "price" => 3500000,
    "count" => 5
];

$products[1]["price"] = 270000;

echo "لیست کالاها:<br>";

foreach ($products as $index => $product) {
    echo "کالای " . ($index + 1) . ":<br>";
    foreach ($product as $key => $value) {
        echo $key . " : " . $value . "<br>";
    }
    echo "<hr>";
}
?>

۴-۱۴. نکات مهم

  1. آرایه چندبعدی، آرایه‌ای است که عناصر آن آرایه هستند.
  2. برای دسترسی به عناصر، کلیدها را به ترتیب می‌نویسیم.
  3. برای پیمایش آرایه دوبعدی از دو حلقه تودرتو استفاده می‌کنیم.
  4. برای پیمایش آرایه سه‌بعدی به سه حلقه تودرتو نیاز است.
  5. count به‌طور پیش‌فرض فقط سطح اول را می‌شمارد.
  6. برای شمارش بازگشتی از COUNT_RECURSIVE استفاده می‌کنیم.
  7. آرایه دوبعدی با کلید انجمنی برای نگهداری رکوردها بسیار مناسب است.
  8. استفاده از آرایه‌های با ابعاد بیشتر از سه، معمولاً توصیه نمی‌شود.