بخش هفتم: توابع پرکاربرد آرایه‌ها (بخش دوم)

۷-۱. مقدمه

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

۷-۲. تابع array_filter

عناصری از آرایه را که شرط مشخصی را برآورده می‌کنند، برمی‌گرداند. این تابع یک تابع بازخوانی (callback) دریافت می‌کند که برای هر عنصر اجرا می‌شود. اگر نتیجه true باشد، عنصر نگه داشته می‌شود.

<?php
$numbers = [1, 2, 3, 4, 5, 6];
$evens = array_filter($numbers, function ($n) {
    return $n % 2 == 0;
});

print_r($evens);
?>

خروجی:

Array
(
    [1] => 2
    [3] => 4
    [5] => 6
)

نکته: کلیدها حفظ می‌شوند. برای مرتب کردن مجدد کلیدها از array_values استفاده کنید.

<?php
$evens = array_values(array_filter($numbers, function ($n) {
    return $n % 2 == 0;
}));
print_r($evens);
?>

فیلتر کردن آرایه انجمنی

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

$adults = array_filter($students, function ($student) {
    return $student["age"] >= 18;
});

print_r($adults);
?>

مطالعه تکمیلی: اگر تابع بازخوانی حذف شود، array_filter همه عناصری را که مقدارشان «درست» ارزیابی می‌شود (غیر از 0، ""، null، false و آرایه خالی) نگه می‌دارد. این حالت برای حذف مقادیر خالی از فرم‌ها کاربرد دارد.

۷-۳. تابع array_map

تابع بازخوانی را روی همه عناصر آرایه اجرا می‌کند و آرایه جدیدی از نتایج برمی‌گرداند. برخلاف array_filter، تعداد عناصر تغییر نمی‌کند.

<?php
$numbers = [1, 2, 3, 4];
$doubled = array_map(function ($n) {
    return $n * 2;
}, $numbers);

print_r($doubled);
?>

خروجی:

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
)

اجرای تابع روی چند آرایه

array_map می‌تواند چند آرایه هم‌اندازه دریافت کند. تابع بازخوانی به تعداد آرایه‌ها پارامتر می‌گیرد.

<?php
$a = [1, 2, 3];
$b = [10, 20, 30];

$result = array_map(function ($x, $y) {
    return $x + $y;
}, $a, $b);

print_r($result);
?>

خروجی:

Array
(
    [0] => 11
    [1] => 22
    [2] => 33
)

استفاده از تابع آماده

<?php
$names = ["علی", "رضا", "مریم"];
$lengths = array_map("strlen", $names);
print_r($lengths);
?>

مطالعه تکمیلی: تفاوت array_map و array_filter در این است که array_map همه عناصر را تغییر می‌دهد و آرایه‌ای هم‌اندازه برمی‌گرداند، اما array_filter فقط عناصر شرط را نگه می‌دارد و تعداد عناصر ممکن است کمتر شود.

۷-۴. تابع array_reduce

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

<?php
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, function ($carry, $item) {
    return $carry + $item;
}, 0);

echo $sum; // 15
?>

در این مثال، $carry مقدار تجمعی و $item عنصر جاری است. مقدار 0 مقدار اولیه $carry است.

محاسبه حاصل‌ضرب

<?php
$numbers = [2, 3, 4];
$product = array_reduce($numbers, function ($carry, $item) {
    return $carry * $item;
}, 1);

echo $product; // 24
?>

مطالعه تکمیلی: array_reduce برای عملیات تجمعی مانند جمع، ضرب، ساخت رشته و محاسبه بیشینه/کمینه مناسب است. با این حال، برای جمع ساده معمولاً array_sum کوتاه‌تر و سریع‌تر است.

۷-۵. تابع array_walk

تابع بازخوانی را روی هر عنصر آرایه اجرا می‌کند. برخلاف array_map، آرایه جدیدی برنمی‌گرداند و آرایه اصلی را تغییر می‌دهد.

<?php
$colors = ["قرمز", "سبز", "آبی"];

array_walk($colors, function (&$value, $key) {
    $value = $key . " : " . $value;
});

print_r($colors);
?>

خروجی:

Array
(
    [0] => 0 : قرمز
    [1] => 1 : سبز
    [2] => 2 : آبی
)

نکته: برای تغییر مقدار عناصر، پارامتر اول باید با & (ارجاع) تعریف شود.

چاپ عناصر

<?php
$student = ["name" => "علی", "age" => 17];

array_walk($student, function ($value, $key) {
    echo $key . " : " . $value . "<br>";
});
?>

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

۷-۶. تابع array_column

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

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

$names = array_column($students, "name");
print_r($names);
?>

خروجی:

Array
(
    [0] => علی
    [1] => رضا
    [2] => مریم
)

استفاده از ستون کلید

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

<?php
$names = array_column($students, "age", "name");
print_r($names);
?>

خروجی:

Array
(
    [علی] => 17
    [رضا] => 18
    [مریم] => 16
)

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

۷-۷. تابع array_diff

عناصری از آرایه اول را برمی‌گرداند که در آرایه‌های دیگر وجود ندارند.

<?php
$a = ["قرمز", "سبز", "آبی", "زرد"];
$b = ["سبز", "زرد"];

$result = array_diff($a, $b);
print_r($result);
?>

خروجی:

Array
(
    [0] => قرمز
    [2] => آبی
)

نکته: کلیدها حفظ می‌شوند. مقایسه بر اساس مقدار انجام می‌شود، نه کلید.

مقایسه دقیق

با پارامترهای اضافی می‌توان مقایسه را دقیق‌تر کرد. تابع array_diff حالت strict ندارد، اما array_diff_assoc کلید و مقدار را با هم مقایسه می‌کند.

<?php
$a = ["a" => 1, "b" => 2, "c" => 3];
$b = ["a" => 1, "b" => 5];

print_r(array_diff_assoc($a, $b));
?>

خروجی:

Array
(
    [b] => 2
    [c] => 3
)

۷-۸. تابع array_intersect

عناصری از آرایه اول را برمی‌گرداند که در همه آرایه‌های دیگر نیز وجود دارند.

<?php
$a = ["قرمز", "سبز", "آبی", "زرد"];
$b = ["سبز", "زرد", "مشکی"];

$result = array_intersect($a, $b);
print_r($result);
?>

خروجی:

Array
(
    [1] => سبز
    [3] => زرد
)

مقایسه با کلید

<?php
$a = ["a" => 1, "b" => 2, "c" => 3];
$b = ["a" => 1, "b" => 5];

print_r(array_intersect_assoc($a, $b));
?>

خروجی:

Array
(
    [a] => 1
)

۷-۹. تابع array_diff_key و array_intersect_key

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

<?php
$a = ["name" => "علی", "age" => 17, "field" => "کامپیوتر"];
$b = ["name" => "رضا", "age" => 18];

print_r(array_diff_key($a, $b));
echo "<br>";
print_r(array_intersect_key($a, $b));
?>

خروجی:

Array
(
    [field] => کامپیوتر
)
Array
(
    [name] => علی
    [age] => 17
)

مطالعه تکمیلی: خانواده توابع array_diff و array_intersect بسیار گسترده است. نسخه‌های _key فقط کلید، نسخه‌های _assoc کلید و مقدار، و نسخه‌های _u با تابع مقایسه سفارشی کار می‌کنند. در برنامه‌های روزمره، معمولاً نسخه ساده کافی است.

۷-۱۰. تابع array_fill

آرایه‌ای با تعداد مشخص و مقدار ثابت می‌سازد.

<?php
$arr = array_fill(0, 5, "سلام");
print_r($arr);
?>

خروجی:

Array
(
    [0] => سلام
    [1] => سلام
    [2] => سلام
    [3] => سلام
    [4] => سلام
)

پارامترها: اندیس شروع، تعداد عناصر و مقدار.

۷-۱۱. تابع array_fill_keys

آرایه‌ای می‌سازد که کلیدهای آن از یک آرایه و مقدارهای آن ثابت است.

<?php
$keys = ["name", "age", "field"];
$arr = array_fill_keys($keys, "نامشخص");
print_r($arr);
?>

خروجی:

Array
(
    [name] => نامشخص
    [age] => نامشخص
    [field] => نامشخص
)

۷-۱۲. تابع range

آرایه‌ای از اعداد یا حروف در یک بازه می‌سازد.

<?php
print_r(range(1, 5));
echo "<br>";
print_r(range(0, 10, 2));
echo "<br>";
print_r(range("a", "e"));
?>

خروجی:

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
Array ( [0] => 0 [1] => 2 [2] => 4 [3] => 6 [4] => 8 [5] => 10 )
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e )

پارامتر سوم، گام (فاصله بین اعداد) است.

۷-۱۳. تابع compact

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

<?php
$name = "علی";
$age = 17;
$field = "کامپیوتر";

$student = compact("name", "age", "field");
print_r($student);
?>

خروجی:

Array
(
    [name] => علی
    [age] => 17
    [field] => کامپیوتر
)

۷-۱۴. تابع extract

عکس compact عمل می‌کند؛ کلیدهای آرایه انجمنی را به متغیر تبدیل می‌کند.

<?php
$student = [
    "name" => "علی",
    "age" => 17
];

extract($student);

echo $name; // علی
echo $age;  // 17
?>

مطالعه تکمیلی: استفاده از extract توصیه نمی‌شود، زیرا ممکن است متغیرهای موجود را به‌طور ناخواسته بازنویسی کند و خوانایی کد را کاهش دهد. در پروژه‌های واقعی، معمولاً از آن پرهیز می‌شود. همچنین compact بیشتر در قالب‌های HTML و فریم‌ورک‌ها کاربرد دارد.

۷-۱۵. تابع array_rand

یک یا چند کلید تصادفی از آرایه برمی‌گرداند.

<?php
$colors = ["قرمز", "سبز", "آبی", "زرد"];

$key = array_rand($colors);
echo $colors[$key];
?>

برای انتخاب چند کلید:

<?php
$keys = array_rand($colors, 2);
print_r($keys);
?>

نکته: اگر تعداد درخواستی از تعداد عناصر آرایه بیشتر باشد، PHP هشدار می‌دهد.

۷-۱۶. تابع shuffle

ترتیب عناصر آرایه را به‌صورت تصادفی تغییر می‌دهد. این تابع آرایه اصلی را تغییر می‌دهد و مقدار true برمی‌گرداند.

<?php
$colors = ["قرمز", "سبز", "آبی", "زرد"];
shuffle($colors);
print_r($colors);
?>

نکته: shuffle کلیدها را حذف می‌کند و کلیدهای عددی جدید از صفر می‌سازد.

۷-۱۷. جدول خلاصه توابع این بخش

تابع کار
array_filter فیلتر کردن عناصر با شرط
array_map اعمال تابع روی همه عناصر
array_reduce تبدیل آرایه به یک مقدار
array_walk اجرای تابع روی عناصر و تغییر آرایه اصلی
array_column استخراج یک ستون از آرایه دوبعدی
array_diff عناصر متفاوت (بر اساس مقدار)
array_diff_assoc عناصر متفاوت (بر اساس کلید و مقدار)
array_diff_key عناصر با کلید متفاوت
array_intersect عناصر مشترک (بر اساس مقدار)
array_intersect_assoc عناصر مشترک (بر اساس کلید و مقدار)
array_intersect_key عناصر با کلید مشترک
array_fill ساخت آرایه با مقدار ثابت
array_fill_keys ساخت آرایه با کلیدهای مشخص و مقدار ثابت
range ساخت آرایه در یک بازه
compact ساخت آرایه از متغیرها
extract تبدیل آرایه به متغیرها
array_rand انتخاب کلید تصادفی
shuffle به‌هم‌ریختن تصادفی ترتیب

۷-۱۸. نکات مهم

  1. array_filter عناصر را با شرط نگه می‌دارد و کلیدها را حفظ می‌کند.
  2. array_map تابع را روی همه عناصر اجرا می‌کند و آرایه‌ای هم‌اندازه برمی‌گرداند.
  3. array_reduce آرایه را به یک مقدار واحد تبدیل می‌کند.
  4. array_walk برای اجرای عملیات جانبی و تغییر آرایه اصلی است و خروجی ندارد.
  5. array_column برای استخراج یک ستون از آرایه دوبعدی بسیار مفید است.
  6. array_diff عناصر متفاوت و array_intersect عناصر مشترک را برمی‌گردانند.
  7. نسخه‌های _key فقط کلید و نسخه‌های _assoc کلید و مقدار را مقایسه می‌کنند.
  8. range برای ساخت سریع آرایه‌های عددی یا حروفی مناسب است.
  9. compact و extract برای تبدیل بین متغیر و آرایه استفاده می‌شوند، اما extract کمتر توصیه می‌شود.
  10. shuffle ترتیب آرایه را تصادفی می‌کند و کلیدها را بازنویسی می‌کند.