بخش هفتم: توابع پرکاربرد آرایهها (بخش دوم)
۷-۱. مقدمه
در این بخش، ادامه توابع پرکاربرد آرایهها معرفی میشود. این توابع بیشتر برای شرطگذاری، تغییر شکل و مقایسه آرایهها به کار میروند.
۷-۲. تابع 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 |
بههمریختن تصادفی ترتیب |
۷-۱۸. نکات مهم
array_filterعناصر را با شرط نگه میدارد و کلیدها را حفظ میکند.array_mapتابع را روی همه عناصر اجرا میکند و آرایهای هماندازه برمیگرداند.array_reduceآرایه را به یک مقدار واحد تبدیل میکند.array_walkبرای اجرای عملیات جانبی و تغییر آرایه اصلی است و خروجی ندارد.array_columnبرای استخراج یک ستون از آرایه دوبعدی بسیار مفید است.array_diffعناصر متفاوت وarray_intersectعناصر مشترک را برمیگردانند.- نسخههای
_keyفقط کلید و نسخههای_assocکلید و مقدار را مقایسه میکنند. rangeبرای ساخت سریع آرایههای عددی یا حروفی مناسب است.compactوextractبرای تبدیل بین متغیر و آرایه استفاده میشوند، اماextractکمتر توصیه میشود.shuffleترتیب آرایه را تصادفی میکند و کلیدها را بازنویسی میکند.