کار با تابع های آرایه PHP به روش صحیح — از صفر تا صد

در این راهنما فهرستی از تابعهای آرایهای رایج PHP را به همراه مثالهایی از کاربرد و بهترین رویهها معرفی میکنیم. هر توسعهدهنده PHP باید شیوه استفاده از آنها را بداند و بتواند تابعهای مرتبط با آرایه PHP را با هم ترکیب کند تا کدی خوانا و کوتاه داشته باشد.
مقدمه
ابتدا به معرفی تابعهای مقدماتی میپردازیم که با کلیدها و مقادیر آرایهها کار میکنند. یکی از آنها ()array_combine است که یک آرایه را برای کلیدها و دیگری را برای مقادیر میسازد:
$keys = ['sky', 'grass', 'orange']; $values = ['blue', 'green', 'orange']; $array = array_combine($keys, $values); print_r($array); // Array // ( // [sky] => blue // [grass] => green // [orange] => orange // )
باید بدانید که تابع ()array_values یک آرایه اندیسگذاری شده از مقادیر بازگشت میدهد. همچنین ()array_keys یک آرایه از کلیدها برای آرایه مفروض بازمیگرداند و ()array_flip نیز جای کلیدها و مقادیر را با هم عوض میکند:
print_r(array_keys($array)); // ['sky', 'grass', 'orange'] print_r(array_values($array)); // ['blue', 'green', 'orange'] print_r(array_flip($array)); // Array // ( // [blue] => sky // [green] => grass // [orange] => orange // )
کد خود را کوتاهتر کنید
تابع ()list که در واقع یک تابع نیست، بلکه یک ساختار زبان است، برای انتساب متغیرها به روشی کوتاهتر استفاده میشود. برای نمونه در ادامه مثالی از استفاده از تابع ()list را میبینید:
// define array $array = ['a', 'b', 'c']; // without list() $a = $array[0]; $b = $array[1]; $c = $array[2]; // with list() list($a, $b, $c) = $array;
این سازه به همراه تابعهایی مانند ()preg_slit یا ()explode بینقص عمل میکند. ضمناً در صورتی که نمیخواهید آنها را تعریف کنید، میتوانید برخی پارامترها را نیز نادیده بگیرید:
$string = 'hello|wild|world'; list($hello, , $world) = explode('|', $string); echo("$hello, $world"); // hello, world
همچنین میتوان از ()list به همراه foreach استفاده کرد و بدین ترتیب این ساختار بهتر از قبل میشود:
$arrays = [[1, 2], [3, 4], [5, 6]]; foreach ($arrays as list($a, $b)) { $c = $a + $b; echo($c . ', '); // 3, 7, 11, }
میتوان با استفاده از تابع ()extract یک آرایه انجمنی را به صورت متغیرهایی اکسپورت کرد. در هر عنصر از آرایه، یک متغیر با نام یک کلید و مقدار به صورت مقدار یک عنصر ایجاد خواهد شد:
$array = [ 'clothes' => 't-shirt', 'size' => 'medium', 'color' => 'blue', ]; extract($array); echo("$clothes $size $color"); // t-shirt medium blue
آگاه باشید که اگر میخواهید با دادههای کاربر (مانند نتایج درخواستها) کار کنید، ()extract امن نیست و بهتر است از این تابع به همراه فلگهای EXTR_IF_EXISTS و EXTR_PREFIX_ALL استفاده کنید. متضاد تابع قبلی، تابع ()compact است که یک آرایه انجمنی از متغیرها میسازد:
$clothes = 't-shirt'; $size = 'medium'; $color = 'blue'; $array = compact('clothes', 'size', 'color'); print_r($array); // Array // ( // [clothes] => t-shirt // [size] => medium // [color] => blue // )
تابعهای فیلترینگ
یک تابع عالی برای فیلتر کردن آرایهها وجود دارد که نام آن ()array_filter است. شما میتوانید یک آرایه به عنوان پارامتر اول و یک تابع بینام به عنوان پارامتر دوم به آن ارسال کنید. در صورتی که بخواهید یک عنصر در آرایه بماند مقدار True در تابع Callback قرار دهید و در غیر این صورت از false استفاده کنید:
$numbers = [20, -3, 50, -99, 55]; $positive = array_filter($numbers, function($number) { return $number > 0; }); print_r($positive); // [0 => 20, 2 => 50, 4 => 55]
این تابع نهتنها روشی برای فیلتر کردن مقادیر آرایه است، بلکه میتوانید از ARRAY_FILTER_USE_KEY یا ARRAY_FILTER_USE_BOTH به عنوان پارامتر سوم برای ارسال کلید یا کلید و مقدار با هم به تابع callback استفاده کنید.
ضمناً میتوانید ()array_filter را بدون یک callback فراخوانی کنید تا همه مقادیر خالی حذف شوند:
$numbers = [-1, 0, 1]; $not_empty = array_filter($numbers); print_r($not_empty); // [0 => -1, 2 => 1]
با استفاده از تابع ()array_unique نیز میتوانید صرفاً مقادیر یکتا را در آرایه به دست آورید. توجه کنید که این تابع کلیدهای عناصر یکتای اول را حفظ میکند:
$array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5]; $uniques = array_unique($array); print_r($uniques); // Array // ( // [0] => 1 // [4] => 2 // [7] => 3 // [8] => 4 // [9] => 5 // )
با استفاده از ()array_column میتوان فهرستی از مقادیر ستونها را از یک آرایه چندبُعدی مانند یک پایگاه داده SQL به دست آورد یا از یک فایل CSV ایمپورت کرد. بدین منظور کافی است آرایه و نام ستون را ارسال کنید:
$array = [ ['id' => 1, 'title' => 'tree'], ['id' => 2, 'title' => 'sun'], ['id' => 3, 'title' => 'cloud'], ]; $ids = array_column($array, 'id'); print_r($ids); // [1, 2, 3]
از نسخه 7 PHP به بعد، ()array_column حتی قدرتمندتر از قبل شده است، زیرا امکان کار با آرایهایای از اشیا را نیز یافته است. بنابراین کار کردن با یک آرایه از مدلها، آسانتر از قبل شده است:
$cinemas = Cinema::find()->all(); $cinema_ids = array_column($cinemas, 'id'); // php7 forever!
کار با آرایهها
با استفاده از ()array_map میتوان یک callback روی همه عناصر یک آرایه اعمال کرد. میتوان نام تابع یا تابع بینامی را ارسال کرد تا آرایه جدیدی بر مبنای آرایه مفروض به دست آید:
$cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga']; $aliases = array_map('strtolower', $cities); print_r($aliases); // ['berlin', 'kyiv, 'amsterdam', 'riga'] $numbers = [1, -2, 3, -4, 5]; $squares = array_map(function($number) { return $number ** 2; }, $numbers); print_r($squares); // [1, 4, 9, 16, 25]
افسانهای وجود دارد که به هیچ روشی نمیتوان مقادیر و کلیدهای یک آرایه را به یک Callback ارسال کرد، اما ما این افسانه را در هم میشکنیم:
$model = ['id' => 7, 'name'=>'James']; $callback = function($key, $value) { return "$key is $value"; }; $res = array_map($callback, array_keys($model), $model); print_r($res); // Array // ( // [0] => id is 7 // [1] => name is James // )
با این حال کد فوق کثیف به نظر میرسد و بهتر است به جای آن از array_walk استفاده کنیم. این تابع شبیه ()array_map به نظر میرسد، اما طرز کار آن متفاوت است. قبل از هر چیز یک آرایه به وسیله ارجاع ارسال میشود بنابراین ()array_walk آرایه جدیدی نمیسازد، بلکه آرایه مفروض را عوض میکند. بنابراین میتوان به عنوان یک آرایه منبع، مقدار آرایه را با ارجاع در یک callback ارسال کرد. کلیدهای آرایه نیز به سادگی ارسال میشوند:
$fruits = [ 'banana' => 'yellow', 'apple' => 'green', 'orange' => 'orange', ]; array_walk($fruits, function(&$value, $key) { $value = "$key is $value"; }); print_r($fruits); // Array // ( // [banana] => banana is yellow // [apple] => apple is green // [orange] => orange is orange // )
الحاق آرایهها
بهترین روش برای ادغام دو یا چند آرایه در PHP استفاده از تابع ()array_merge است. آیتمهای آرایه با یکدیگر ادغام میشوند و مقادیر دارای کلیدهای رشتهای یکسان بر اساس آخرین مقدار بازنویسی میشوند:
$array1 = ['a' => 'a', 'b' => 'b', 'c' => 'c']; $array2 = ['a' => 'A', 'b' => 'B', 'D' => 'D']; $merge = array_merge($array1, $array2); print_r($merge); // Array // ( // [a] => A // [b] => B // [c] => c // [D] => D // )
برای حذف مقدارهای آرایه از آرایه (یا آرایههای) دیگر میتوان از ()array_diff استفاده کرد. برای دریافت مقادیری که در آرایههای مفروض وجود دارند، میتوانید از ()array_intersect استفاده کنید. در مثالهای زیر طرز کار آن را میبینید:
$array1 = [1, 2, 3, 4]; $array2 = [3, 4, 5, 6]; $diff = array_diff($array1, $array2); print_r($diff); // [0 => 1, 1 => 2] $intersect = array_intersect($array1, $array2); print_r($intersect); // [2 => 3, 3 => 4]
اجرای عملیات ریاضی روی مقادیر آرایه
با استفاده از ()array_sum میتوان مجموع مقادیر یک آرایه را به دست آورد، ()array_product مقادیر آرایه را در هم ضرب میکند و با استفاده از ()array_reduce نیز میتوان فرمول سفارشی خاصی را ساخت:
$numbers = [1, 2, 3, 4, 5]; echo(array_sum($numbers)); // 15 echo(array_product($numbers)); // 120 echo(array_reduce($numbers, function($carry, $item) { return $carry ? $carry / $item : 1; })); // 0.0083 = 1/2/3/4/5
برای شمارش همه مقادیر یک آرایه از ()array_count_values استفاده کنید. بدین ترتیب همه مقادیر یکتای آرایه مفروض به صورت کلید به دست میآیند و تعداد این مقادیر نیز به صورت یک مقدار عرضه میشود:
$things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree']; $values = array_count_values($things); print_r($values); // Array // ( // [apple] => 2 // [banana] => 1 // [tree] => 3 // )
تولید آرایهها
برای تولید یک آرایه با اندازه داده شده و مقادیر مشابه میتوان از ()array_fill استفاده کرد:
$bind = array_fill(0, 5, '?'); print_r($bind); // ['?', '?', '?', '?', '?']
برای تولید یک آرایه بر اساس بازهای از کلیدها و مقادیر مانند ساعتهای روز یا حروف الفبا میتوان از range استفاده کرد:
$letters = range('a', 'z'); print_r($letters); // ['a', 'b', ..., 'z'] $hours = range(0, 23); print_r($hours); // [0, 1, 2, ..., 23]
برای دریافت بخشی از یک آرایه برای نمونه سه عنصر اول میتوان از ()array_slice استفاده کرد:
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; $top = array_slice($numbers, 0, 3); print_r($top); // [1, 2, 3]
مرتبسازی آرایهها
بهتر است به خاطر داشته باشید که همه تابعهای مرتبسازی در PHP از طریق ارجاع با آرایهها کار میکنند و در زمان موفقیت مقدار true و در زمان شکست مقدار false بازگشت میدهند. یک تابع مرتبسازی پاسخ وجود دارد که ()sort نام دارد و مقادیر موجود را به ترتیب صعودی بدون حفظ کلید مرتب میکند. تابع مرتبسازی میتواند با حروف زیر مورد استفاده قرار گیرد:
- a – با حفظ کلید مرتبسازی میکند.
- k – بر اساس کلید مرتبسازی میکند.
- r – با ترتیب عکس/نزولی مرتبسازی میکند.
- u – با تابع تعریف شده از سوی کاربر مرتبسازی میکند.
میتوانید ترکیبهای این حروف را در جدول زیر ببینید:
a | k | r | u | |
a | asort | arsort | uasort | |
k | ksort | krsort | ||
r | arsort | krsort | rsort | |
u | uasort | usort |
کسب مهارت در ترکیب تابعهای آرایهای PHP
تا به اینجا با تابعهای مختلفی که در PHP برای کار با آرایهها وجود دارند، آشنا شدیم، اما قدرت اصلی این تابعها زمانی آشکار میشود که بتوانید آنها را با هم ترکیب کرده و مورد استفاده قرار دهید. در مثال زیر میتوانید در یک خط کد منفرد با استفاده از ()array_filter و ()array_map فواصل خالی را از آرایه حذف کنید:
$values = ['say ', ' bye', ' ', ' to', ' spaces ', ' ']; $words = array_filter(array_map('trim', $values)); print_r($words); // ['say', 'bye', 'to', 'spaces']
برای ایجاد یک id برای یک map از یک آرایه از مدلها، میتوانیم از ترکیبی از ()array_combine و ()array_column استفاده کنیم:
$models = [$model1, $model2, $model3]; $id_to_title = array_combine( array_column($models, 'id'), array_column($models, 'title') );
برای دریافت سه مقدار اول آرایه میتوانیم از ()array_count_values() ،arsort و ()array_slice استفاده کنیم:
$letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd']; $values = array_count_values($letters); // get key to count array arsort($values); // sort descending preserving key $top = array_slice($values, 0, 3); // get top 3 print_r($top); // Array // ( // [d] => 5 // [a] => 4 // [b] => 2 // )
با استفاده ترکیبی از ()array_sum و ()array_map نیز میتوان به آسانی مجموع چند سفارش را در چند ردیف محاسبه کرد:
$order = [ ['product_id' => 1, 'price' => 99, 'count' => 1], ['product_id' => 2, 'price' => 50, 'count' => 2], ['product_id' => 2, 'price' => 17, 'count' => 3], ]; $sum = array_sum(array_map(function($product_row) { return $product_row['price'] * $product_row['count']; }, $order)); print_r($sum); // 250
سخن پایانی
چنان که در این مقاله مشاهده کردیم، آگاهی از تابعهای اصلی آرایه میتواند موجب کوتاهتر شدن و افزایش خوانایی کدهای شما شود. البته PHP تابعهای آرایه بسیار بیشتری دارد و حتی تابعهای مفروض نیز نسخههای مختلفی دارند که با پارامترها و فلگهای بیشتری مورد استفاده قرار میگیرند. ما در این راهنما صرفاً مبانی مقدماتی کار با آرایه را آموزش دادیم که هر توسعهدهنده PHP باید بداند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی PHP
- گنجینه برنامهنویسی PHP
- مجموعه آموزشهای برنامهنویسی
- آموزش پروژه محور PHP — مجموعه مقالات جامع وبلاگ فرادرس
- برنامهنویسی PHP و هر آنچه برای شروع باید بدانید — آموزش جامع
- آموزش کامل MVC در PHP — از صفر تا صد و به زبان ساده
==
آرایه هست یا تابعی که برای تصادفی کردن رندوم استفاده بشه
یه تمرینی هست
9عکس با حلقه فور با سه سطر ستون که در خروجی عکسها با هربار refresh جای عکسها عوض بشه
از چه تابعی باید استفاده کنم
ممنون میشم راهنمایی کنید