در بحث معرفی دیتاتایپها در زبان PHP گفتیم که یکی از انواع دادهها در این زبان، Array (آرایه) است. چنانچه بخواهیم خیلی ساده توضیح دهیم، برخلاف استرینگها، یک آرایه میتواند چندین دیتای مجزا از یکدیگر را در خود ذخیره سازد که این دادهها میتوانند استرینگ، عدد، آبجکت و یا هر چیز دیگری باشند (برای روشنتر شدن این مسئله، میتوانید کمدی را در نظر بگیرید که داخل آن قفسهبندی شده و داخل هر قفسه هم یکسری وسائل قرار داده شده است).
به طور کلی، آرایهها از تعدادی اصطلاحاً Key:Value (کلید:مقدار) ساخته میشوند که هر کدام از آنها اصطلاحاً یک Element (عضو یا آیتم) از آرایه تلقی میشوند و برای هر کدام از آیتمها یک کلید که به آن Index (اندیس) گفته میشود وجود دارد که منحصر به فرد است؛ به عبارت دیگر، کلیدها هرگز نمیبایست مشابه یکدیگر باشند.
پیش از پرداختن به معرفی انواع آرایه، یادآوری این نکته ضروری است که REQUEST_$ که پیش از این با کاربردش آشنا شدیم که تحت عنوان سوپرگلوبال شناخته میشود، یک نوع آرایه است؛ به همین منوال، سوپرگلوبالهای دیگری داریم تحت عنوان COOKIE ،$_SERVER ،$_SESSION_$ و غیره که همگی آرایه هستند.
انواع آرایهها در زبان PHP
زبان PHP از دو نوع آرایه پشتیبانی میکند که تحت عناوین Indexed و Associative شناخته میشوند؛ در آرایههای به اصطلاح Indexed، کلیدها عددی هستند اما در آرایههای به اصطلاح Associative، کلیدها استرینگ میباشند. برای روشنتر شدن مفهوم آرایههای Indexed، مثال زیر را مد نظر قرار میدهیم:
<?php
$array = array('PHP', 'Java', 'Python', 'C#');
var_dump($array);
همانطور که ملاحظه میشود، متغیری ساختهایم تحت عنوان array$ و مقدار آن را برابر با فانکشن از پیش تعریف شدهای در زبان PHP تحت عنوان ()array قرار دادهایم که مسئول ساخت یک آرایه است.
به خاطر داشته باشید |
شیوهٔ نامگذاری آرایهها دقیقاً مشابه دیگر دیتاتایپها همچون عدد، رشته و ... است |
به عنوان آیتمهای این آرایه هم از نام یکسری زبانهای برنامهنویسی استفاده کردهایم و در نهایت با استفاده از فانکشن ()var_dump هم مقادیر این آرایه را چاپ کردهایم:
array(4) {
[0]=>
string(3) "PHP"
[1]=>
string(4) "Java"
[2]=>
string(6) "Python"
[3]=>
string(2) "C#"
}
میبینیم بدون آنکه Key (کلید) برای اعضای این آرایه در نظر بگیریم، به صورت خودکار کلیدها در نظر گرفته شدهاند.
به خاطر داشته باشید |
نکتهای که در مورد Array در تمامی زبانهای برنامهنویسی وجود دارد این است که شمارش خانهها در آرایهها به جای ۱، از ۰ آغاز میگردد مگر آنکه خود دولوپر بخواهد تا شمارش از ۱ شروع شود. این نکتهای است که اگر به آن توجه نشود ممکن است دولوپرهای تازهکار را در ابتدای راه سردرگم سازد. |
در تفسیر آرایهٔ فوق، بایستی بگوییم که آرایهای داریم از جنس Indexed (عددی) که دارای ۴ عضو یا اِلِمان است و مقدار اعضای آن هم از جنس استرینگ (رشته) هستند. حال آرایه فوق را به صورت زیر تغییر میدهیم:
$array = array(0 => 'PHP', 1 => 'Java', 2 => 'Python', 3 => 'C#');
توجه داشته باشید که برای اختصاص یک Value (مقدار) به یک Key (کلید) در آرایهها در زبان PHP هرگز نمیبایست از علامت = استفاده کرد بلکه علائم <= برای این منظور به کار میروند. اگر مجدد خروجی بگیریم، میبینیم که هیچ تفاوتی در خروجی مشاهده نمیشود. اگر هم بخواهیم که شمارش اندیسها از عدد ۱ شروع شود، اندیسها را به صورت زیر از عدد ۱ شروع میکنیم:
<?php
$array = array(1 => 'PHP', 2 => 'Java', 3 => 'Python', 4 => 'C#');
var_dump($array);
به عنوان خروجی داریم:
array(4) {
[1]=>
string(3) "PHP"
[2]=>
string(4) "Java"
[3]=>
string(6) "Python"
[4]=>
string(2) "C#"
}
به عنوان مثالی هم از آرایههای به اصطلاح Associative داریم:
<?php
$array = array('firstname' => 'Behzad', 'lastname' => 'Moradi', 'dob' => 1984, 'marital_status' => true, 'political_preference' => null);
var_dump($array);
ابتدا خروجی را بررسی کرده سپس به ارائهٔ توضیحات بیشتر میپردازیم:
array(5) {
["firstname"]=>
string(6) "Behzad"
["lastname"]=>
string(6) "Moradi"
["dob"]=>
int(1984)
["marital_status"]=>
bool(true)
["political_preference"]=>
NULL
}
همانطور که میبینیم، این آرایه دارای ۵ آیتم است و این در حالی است که کلیدها یا اندیسهای این آرایه عددی نبوده بلکه از جنس استرینگ هستند و به همین دلیل این نوع آرایهها را اصطلاحاً Associative مینامند.
نکتهٔ مهمی که در مورد کلیدهای آرایههای Indexed و Associative وجود دارد این است که در مورد آرایههای Indexed، اندیسها حتماً بایستی عددی بوده و تحت هیچ عنوان داخل علائم " " یا ' ' قرار نمیگیرند اما در مورد آرایههای Associative -همانطور که در مثال فوق مشاهده میشود- اندیسها چون استرینگ هستند، داخل علائم " " یا ' ' قرار گرفتهاند.
نکتهٔ دیگری که در مورد آرایهها وجود دارد این است که ما میتوانیم دادههای مختلفی را داخل اعضای مختلف هر آرایه ذخیره سازیم. به طور مثال، در آرایهٔ فوق در اندیسهای firstname و lastname از مقدار استرینگ استفاده کردهایم، در اندیس dob (تاریخ تولد) از مقدار عددی، در اندیس marital_status (وضعیت تأهل) از مقدار بولینی و در نهایت در اندیس political_preference (گرایش سیاسی) از مقدار null استفاده کردهایم (در مورد آرایههای Indexed هم دقیقاً میتوان از دادههای مختلف استفاده کرد).
نکته |
وقتی از ()var_dump برای نمایش محتویات یک آرایه استفاده میکنیم -همانطور که در خروجی مشاهده میشود- تایپ (نوع) مقدار هر اندیس در معرض دیدمان قرار میگیرد. |
دسترسی به اعضای آرایههای Indexed و Associative
همانطور که از دستورات echo و print برای چاپ مقادیر متغیرها تاکنون استفاده میکردیم، نمیتوانیم برای چاپ آرایهها استفاده کنیم! به طور مثال، اگر آرایهٔ فوق را به صورت زیر بخواهیم چاپ کنیم:
<?php
$array = array('firstname' => 'Behzad', 'lastname' => 'Moradi', 'dob' => 1984, 'marital_status' => true, 'political_preference' => null);
echo $array;
با ارور یا بهتر بگوییم هشدار زیر مواجه خواهیم شد:
Notice: Array to string conversion in /var/www/sokanacademy-php-course/04/04-arrays/index.php on line 3
Array
این هشدار به اطلاع ما میرساند که در استرینگ فوق قصد داریم یک آرایه را به استرینگ مبدل سازیم و از آنجا که چنین چیزی امکانپذیر نیست، اسکریپت اجرا نمیگردد.
به منظور چاپ کلیهٔ آیتمهای یک آرایه باید از ساختار Loop (حلقه) استفاده کرد که در آموزشهای آتی به تفصیل مورد بحث قرار خواهد گرفت اما اگر بخواهیم صرفاً یکی از آیتمهای یک آرایه -خواه Indexed و خواه Associative- را نمایش دهیم، میبایست از ساختار زیر استفاده کنیم:
<?php
$array = array('firstname' => 'Behzad', 'lastname' => 'Moradi', 'dob' => 1984, 'marital_status' => true, 'political_preference' => null);
echo $array['dob'];
به عنوان خروجی اسکریپت فوق، ۱۹۸۴ چاپ خواهد شد. در واقع، برای دستیابی به هر کدام از اندیسهای آرایه که بخواهیم، صرفاً نیاز است تا نام آرایه را نوشته سپس یک جفت علائم [ ] را قرار دهیم. حال اگر آرایه از جنس Associative بود، میبایست استرینگ مد نظر را وارد کنیم (در مثال فوق استرینگ 'dob' را در نظر گرفتهایم) و اگر هم آرایه از جنس Indexed بود، صرفاً عدد مد نظر را وارد میکنیم. در مثال فوق، اگر بخواهیم یکی از خانههای آرایه را داخل یک استرینگ به نمایش در آوریم، میتوانیم از علائم " " استفاده کنیم:
echo "My date of birth is $array['dob']";
چنانچه اسکریپت فوق را اجرا کنیم، با ارور زیر مواجه خواهیم شد:
Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in /var/www/sokanacademy-php-course/04/04-arrays/index.php on line 3
برای رفع این مشکل، میبایست از علائم { } در دو طرف آرایه استفاده کنیم:
echo "My date of birth is {$array['dob']}";
و به عنوان خروجی خواهیم داشت:
My date of birth is 1984
برای دستیابی به آیتمهای یک آرایه از جنس Indexed هم به صورت زیر عمل میکنیم:
<?php
$array = array('PHP', 'Java', 'Python', 'C#');
echo $array[2];
در حقیقت، یک آرایه از جنس Indexed داریم و قصد داریم آیتم Python را چاپ کنیم؛ برای این منظور، اندیس ۲ را داخل علائم [ ] نوشتهایم (گرچه در ظاهر Python اِلِمان سوم است، اما میدانیم که شمارش خانهها در آرایه از صفر آغاز میشود؛ به عبارت دیگر، PHP میشود آیتم صفرم، Java میشود آیتم یکم، Python میشود آیتم دوم و #C میشود آیتم سوم). اگر هم بخواهیم اندیس فوق را داخل یک استرینگ نمایش دهیم، میتوانیم از ساختار زیر استفاده کنیم:
<?php
$array = array('PHP', 'Java', 'Python', 'C#');
echo "$array[2] is a nice language";
به عنوان خروجی داریم:
Python is a nice language
میبینیم که اطراف آرایهٔ مد نظر از علائم { } استفاده نکردیم و خروجی هم به درستی نمایش داده شد. در واقع، زمانی که اندیسهای آرایه از جنس استرینگ (Associative) باشند، آرایه را باید داخل علائم { } قرار داد.
راهکار جایگزین فانکشن ()array به منظور ساخت آرایه در زبان PHP
تاکنون دیدیم که با استفاده از تابع از پیش تعریف شدهای در زبان PHP تحت عنوان ()array به چه شکل میتوان دست به ساخت آرایهها زد. واقعیت امر آن است که امروزه در اکثر فریمورکها از علائم [ ] برای ساخت آرایهها استفاده میشود و کاربرد ()array کمتر و کمتر شده است. برای روشنتر شدن نحوهٔ کاربرد [ ]، آرایهٔ فوق را به شکل زیر ریفکتور میکنیم:
$array = ['PHP', 'Java', 'Python', 'C#'];
به نظر میرسد که استفاده از علائم [ ] به مراتب راحتتر از استفاده از فانکشن ()array باشد (از اینجای آموزش به بعد، این روش را برای ساخت آرایهها استفاده خواهیم کرد).
هشدار |
به خاطر داشته باشید که [ ] از نسخهٔ ۵.۴ به بالا ساپورت میشود؛ لذا اگر قصد کار کردن روی پروژهای قدیمی را دارید، بهتر است که از همان فانکشن ()array استفاده نمایید. |
حال با دانستن اینکه با استفاده از علائم [ ] میتوان دست به ساخت یک آرایه زد، آرایهٔ فوق را میتوان به شکل زیر بازنویسی کرد:
<?php
$array[0] = 'PHP';
$array[1] = 'Java';
$array[2] = 'Python';
$array[3] = 'C#';
و این در حالی است که نتیجهٔ هر دو آرایه یکسان است.
آپدیت کردن یا افزودن اندیس جدید به یک آرایه
به راحتی این امکان در اختیار دولوپرهای زبان برنامهنویسی PHP قرار گرفته تا مقدار یکی از اندیسهای آرایه را آپدیت کرده و یا اندیس/مقدار جدید به آرایه اضافه کنند. برای مثال داریم:
<?php
$array[0] = 'PHP';
$array[1] = 'Java';
$array[2] = 'Python';
$array[3] = 'C#';
$array[1] = 'C++'; // Index 1 is updated
var_dump($array);
در حقیقت اگر این اسکریپت را در مرورگر اجرا کنیم، خواهیم دید که مقدار اندیس ۱ که در ابتدا برابر بود با استرینگ Java، آپدیت شده و مقداری همچون ++C برایش در نظر گرفته شده است. برای افزودن یک اندیس/مقدار جدید به انتهای آرایه هم از ساختار زیر استفاده میکنیم:
<?php
$array[0] = 'PHP';
$array[1] = 'Java';
$array[2] = 'Python';
$array[3] = 'C#';
$array[] = 'C++'; // Index 4 is added
var_dump($array);
به عنوان خروجی داریم:
array(5) {
[0]=>
string(3) "PHP"
[1]=>
string(4) "Java"
[2]=>
string(6) "Python"
[3]=>
string(2) "C#"
[4]=>
string(3) "C++"
}
در حقیقت، اگر نام آرایه را نوشته و علائم [ ] را مقابل آن قرار دهیم بدون اینکه هیچ اندیسی در نظر بگیریم، مقدار مد نظر به انتهای آرایه افزوده شده و اندیس هم به صورت خودکار یک واحد افزایش مییابد. این قضیه در مورد آرایههایی از نوع اصطلاحاً Associative هم کاملاً صادق است:
<?php
$array = array('firstname' => 'Behzad', 'lastname' => 'Moradi', 'dob' => 1984, 'marital_status' => true, 'political_preference' => null);
$array['firstname'] = 'Sahand';
$array['occupation'] = 'Developer';
var_dump($array);
به عنوان خروجی داریم:
array(6) {
["firstname"]=>
string(6) "Sahand"
["lastname"]=>
string(6) "Moradi"
["dob"]=>
int(1984)
["marital_status"]=>
bool(true)
["political_preference"]=>
NULL
["occupation"]=>
string(9) "Developer"
}
میبینیم که در ابتدا کلید firstname برابر با Behzad بود اما پس از ویرایش مقدار جدید Sahand برایش در نظر گرفته شده است؛ همچنین یک اندیس جدید تحت عنوان occupation با مقدار استرینگ Developer هم اضافه شده که در خروجی میبینیم به انتهای آرایه افزوده شده است.