تالار گفتمان nCIS.ir

نسخه‌ی کامل: آموزش مرحله به مرحله PHP - جلسه سوم
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
آرایه چیست؟

در این جلسه می خواهیم روش استفاده از آرایه ها را بررسی کنیم. آرایه مجموعه ای از متغیرهای همنام است که با اندیس از یکدیگر تفکیک می شوند. برای مثال، متغیر a$ را درنظر بگیرید:

Index   0   1   2   3   4   5
Value   12  7   4   2   1   290

در مثال فوق، متغیر a$ یک آرایه با شش عنصر است که از 0 تا 5 شماره گذاری شده اند و مقادیر آنها به ترتیب برابر با 12 و 7 و 4 و 2 و 1 و 290 است. حال فرض کنید که می خواهیم محتویات خانه پنجم را نمایش دهیم. برای این کار باید اینگونه بنویسیم:
echo $a[4];

تعریف آرایه در PHP
دقت کنید که در PHP از آنجا که حساسیتی نسبت به نوع متغیرها وجود ندارد، نوع مقادیر آرایه نیز مشخص نمی شود و درنتیجه هر عنصر از آرایه می تواند حاوی مقداری با نوع دلخواه و حتی متفاوت با نوع بقیه عناصر آرایه باشد. ضمناً در PHP طول آرایه نیز مشخص نمی شود و کاملاً پویا است. برای تعریف یک آرایه در PHP کافی است نام آنرا همراه با کارکترهای [] ذکر کنیم:
$a[] = 5;

با اجرای دستور فوق، اگر قبلاً آرایه a$ وجود نداشته باشد، یک آرایه جدید ایجاد شده و یک عنصر با اندیس 0 به آن اضافه می شود و مقدار 5 در آن عنصر قرار خواهد گرفت؛ اما اگر قبلاً آرایه فوق تعریف شده باشد، یک عنصر جدید به انتهای آن اضافه شده و اندیس عنصر جدید، یک واحد بیشتر از آخرین اندیس موجود در آرایه خواهد بود و مقدار 5 در عنصر جدید قرار می گیرد. برای افزودن عناصر بعدی نیز به همین ترتیب باید عمل کنیم:
$a[] = 6.2;
$a[] = 'Hello';

برای درک بهتر، به کد زیر دقت کنید که علاوه بر تعریف آرایه فوق، عناصر آنرا نیز در خروجی چاپ می کند:
<!doctype html>
<html>
<head>
<title>Array DEMO</title>
<meta charset="utf-8" />
</head>
<body>
<?php
   $a[] = 5;
   $a[] = 6.2;
   $a[] = 'Hello';
   for($i = 0; $i < 3; $i++) {
       echo $a[$i] . '<br />' . PHP_EOL;
   }
?>
</body>
</html>

کد فوق را با نام 6.php در مسیر ریشه سرویس دهنده وب خود ذخیره کرده و با واردکردن نشانی localhost/6.php آنرا اجرا کنید. همانطور که ملاحظه می کنید، در PHP هم نوع مقادیر آرایه و هم طول آرایه متغیر است.

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

درج عناصر با ذکر شماره اندیس
برای اینکه درج یک عنصر در محل دلخواه آرایه باید به روش زیر عمل کنیم:
$a[1] = 'PHP';
$a[3] = 5;
$a[0] = 6.2;

حال اگر توسط حلقه تکرار زیر، عناصر آرایه را نشان دهیم:
for($i = 0; $i < 4; $i++) {
   echo "A[$i] = $a[$i]<br />" . PHP_EOL;
}

خروجی زیر تولید خواهد شد:
A[0] = 6.2
A[1] = PHP
A[2] = 
A[3] = 5

همانگونه که مشاهده می کنید، درمقابل اندیس 2 چیزی نوشته نشده است؛ زیرا این اندیس در آرایه تعریف نشده و فاقد مقدار است. البته اگر PHP به نحوی تنظیم شده باشد که پیغام های هشدار را نشان دهد، یک پیغام هشدار مبنی بر دسترسی به اندیس تعریف نشده (2) در آرایه، به شما نشان داده خواهد شد. ملاحظه می کنید که با مشخص کردن اندیس یک عنصر، می توان آنرا مستقیماً جهت خواندن، نوشتن، ویرایش و حتی حذف، مورد استفاده قرار داد.

استفاده از اندیس رشته ای
در PHP اجباری برای استفاده از اندیس عددی وجود ندارد و می توان بجای اعداد، از رشته ها نیز بعنوان اندیس استفاده نمود. برای مثال:
$stateCapitals['SistanAndBalushestan'] = 'Zahedan';
$stateCapitals['Tehran'] = 'Tehran';
$stateCapitals['Fars'] = 'Shiraz';

به این آرایه ها، آرایه های انجمنی (Associative) می گویند و مشابه آرایه های با اندیس عددی (Numeric)، با کمک اندیس هر عنصر می توانید مقدار آنرا مورد دستیابی قرار دهید:
echo $stateCapitals['SistanAndBaluchestan'] . '<br />' . PHP_EOL;
echo $stateCapitals['Tehran'] . '<br />' . PHP_EOL;
echo $stateCapitals['Fars'] . '<br />' . PHP_EOL;

خروجی کد فوق بصورت زیر خواهد بود:
Zahedan
Tehran
Shiraz

مزیت اصلی این آرایه ها در آن است که درصورت اضافه شدن یک عنصر جدید در بین عناصر قبلی، شماره ترتیب آنها تغییر نمی کند. برای درک بهتر، فرض کنید در یک آرایه، خانه اول (اندیس 0) برای نگهداری نام، خانه دوم (اندیس 1) برای نگهداری نام خانوادگی، خانه سوم (اندیس 2) برای نگهداری شماره دانشجویی و خانه چهارم (اندیس 3) برای نگهداری معدل درنظر گرفته شده است:
$student[] = 'Ali';
$student[] = 'Hoseini';
$student[] = '92143572';
$student[] = '17.25';

حال فرض کنید ناگهان این نکته به یادتان می افتد که نام پدر را فراموش کرده اید و باید آنرا بعد از نام خانوادگی درج کنید. بنابراین، کد فوق به صورت زیر تغییر می کند:
$student[] = 'Ali';
$student[] = 'Hoseini';
$student[] = 'Ahmad';
$student[] = '92143572';
$student[] = '17.25';

نکته اصلی در اینجاست که با انجام تغییر فوق، در تمام برنامه باید خطوطی که به اندیس های 2 و 3 اشاره می کردند را اصلاح کنید تا به اندیس های جدید یعنی 3 و 4 اشاره کنند. حال اگر از آرایه های انجمنی استفاده کنیم، چنین مشکلی نخواهیم داشت:
$student['name'] = 'Ali';
$student['family'] = 'Hoseini';
$student['father'] = 'Ahmad';
$student['stid'] = '92143572';
$student['avg'] = '17.25';

کد فوق علاوه بر خوانایی بیشتر، دارای این مزیت است که وجود یا عدم وجود یک یا چند عنصر یا اضافه شدن عناصر جدید در بین عناصر قبلی، نحوه دستیابی به عناصر دیگر را تحت تأثیر قرار نمی دهد زیرا برای دستیابی به هر عنصر، از نام آن استفاده می کنیم نه شماره ترتیب آن. البته این آرایه ها دارای معایبی نیز هستند. برای مثال، نمی توان توسط حلقه معمولی for آنها را مورد پیمایش قرار داد و باید از برخی راهکارهای جایگزین که در ادامه توضیح خواهیم داد، استفاده کنیم.

استفاده از تابع array
یک روش آسان برای تعریف آرایه و مقداردهی عناصر آن بطور همزمان، استفاده از دستور array است. خروجی این دستور، یک آرایه است و مقادیری را که باید در عناصر آرایه درج شوند، بعنوان پارامتر ورودی دریافت می کند:
$cities = array('Zahedan', 'Tehran', 'Shiraz');

دستور فوق معادل دستورات زیر است:
$cities[] = 'Zahedan';
$cities[] = 'Tehran';
$cities[] = 'Shiraz';

در روش های قبل مشاهده کردیم که فقط در اولین روش (ذکر نکردن اندیس) شماره گذاری عناصر از صفر شروع می شود و در سایر روش ها می توانیم شماره گذاری عناصر را بصورت دلخواه تغییر دهیم. برای مثال:
$a[1] = 5;
$a[3] = 'Ali';
// OR
$families['Ahmad'] = 'Hoseini';
$families['Reza'] = 'Kamalian';

برای اینکه در تابع array اندیس عناصر را مشخص کنیم، باید قبل از هر مقدار، اندیس موردنظر را نوشته و بعد از آن، علامت <= را بنویسیم و سپس، مقدار اندیس موردنظر را درج کنیم. دستورات زیر، بازنویسی دستورات قبلی با کمک تابع array هستند:
$a = array(1 => 5, 3 => 'Ali');
// OR
$families = array('Ahmad' => 'Hoseini', 'Reza' => 'Kamalian');

در این ساختار، اگر اندیس یک عنصر ذکر نشود، آنرا بعنوان اندیس عددی درنظر گرفته و یک واحد بیشتر از آخرین اندیس عددی موجود، درنظر می گیرد. مثال:
$numbers = array(10 => 5, 'grade' => 9, 7, 4, 'average' => 15, 25 => 12, 9);

دستور فوق معادل دستورات زیر است:
$numbers[10] = 5;
$numbers['grade'] = 9;
$numbers[11] = 7;
$numbers[12] = 4;
$numbers['average'] = 15;
$numbers[25] = 12;
$numbers[26] = 9;

استفاده از تابع range
گاهی اوقات نیازمند ذخیره کردن محدوده ای از اعداد یا کارکترها بصورت یک آرایه هستیم. برای مثال، ممکن است بخواهیم اعداد از 1 تا 100 را در خانه های یک آرایه قرار دهیم یا حروف بزرگ الفبا را در درون آرایه ذخیره کنیم. در این مواقع، تابع range به کمک ما می آید. این تابع دو پارامتر اجباری و یک پارامتر اختیاری دارد. پارامتر اول شروع محدوده موردنظر، پارامتر دوم پایان محدوده موردنظر و پارامتر سوم که اختیاری است، گام حرکت را مشخص می کند که مقدار پیشفرض آن درصورت ذکر نشدن، 1 است. برای درک بهتر، به مثال های زیر دقت کنید:

$years = range(2014, 2001, 2);
/*
$years[0] = 2014
$years[1] = 2012
$years[2] = 2010
$years[3] = 2008
$years[4] = 2006
$years[5] = 2004
$years[6] = 2002
*/
$letters = range('A', 'Z');
/*
$letters[0] = 'A'
$letters[1] = 'B'
$letters[2] = 'C'
$letters[3] = 'D'
$letters[4] = 'E'
$letters[5] = 'F'
$letters[6] = 'G'
$letters[7] = 'H'
$letters[8] = 'I'
$letters[9] = 'J'
$letters[10] = 'K'
$letters[11] = 'L'
$letters[12] = 'M'
$letters[13] = 'N'
$letters[14] = 'O'
$letters[15] = 'P'
$letters[16] = 'Q'
$letters[17] = 'R'
$letters[18] = 'S'
$letters[19] = 'T'
$letters[20] = 'U'
$letters[21] = 'V'
$letters[22] = 'W'
$letters[23] = 'X'
$letters[24] = 'Y'
$letters[25] = 'Z'
*/

نمایش محتویات آرایه ها
برای نمایش محتوای آرایه ها، روش های مختلفی وجود دارد. یکی از این روش ها که قبلاً با آن آشنا شدید، استفاده از حلقه for است که طبیعتاً زمانی کاربرد دارد که اندیس عناصر آرایه از نوع عددی و به ترتیب باشد:
$a = array(5, 8, 4);
for($i = 0; $i < 3; $i++) {
   echo $a[$i] . '<br />' . PHP_EOL;
}
/*
Output:
5
8
4
*/

نمایش آرایه به کمک تابع print_r
دستور print_r یک آرایه را بعنوان پارامتر دریافت کرده و عناصر آنرا همراه با اندیس مربوطه، به ترتیب در خروجی می نویسد:
$cities['SistanAndBaluchestan'] = 'Zahedan';
$cities['Tehran'] = 'Tehran';
$cities['Fars'] = 'Shiraz';
print_r($cities);
/*
Output:
Array
(
   [SistanAndBaluchestan] => Zahedan
   [Tehran] => Tehran
   [Fars] => Shiraz
)
*/

البته این تابع دارای یک پارامتر اختیاری نیز می باشد که یک مقدار true یا false است و درصورت ذکر نشدن، مقدار پیشفرض آن false خواهد بود. درصورتی که این پارامتر با مقدار true تنظیم شود، تابع print_r بجای نمایش خروجی، آنرا بعنوان نتیجه، باز می گرداند (درمورد توابع و مقادیر بازگشتی آنها در جلسه بعد توضیح خواهیم داد).

نمایش آرایه به کمک تابع var_dump

دستور var_dump نیز دارای ساختاری مشابه print_r است، با این تفاوت که توضیحات کامل تری ارائه می دهد:
$cities['SistanAndBaluchestan'] = 'Zahedan';
$cities['Tehran'] = 'Tehran';
$cities['Fars'] = 'Shiraz';
var_dump($cities);
/*
Output:
array(3) {
   ["SistanAndBaluchestan"] => string(7) "Zahedan"
   ["Tehran"] => string(6) "Tehran"
   ["Fars"] => string(6) "Shiraz"
}
*/

دقت کنید که از آنجا که خروجی دستورات PHP برای مرورگر وب ارسال می شود، درنتیجه با اجرای کدهای فوق، خروجی را به شکل منظم مشابه نمونه های ذکر شده، نخواهید دید و همه عبارات در یک سطر طولانی نوشته خواهد شد. علت این مسئله آن است که مرورگر از استانداردهای HTML پیروی می کند و در این استاندارد، رفتن به سطر جدید با تگ </ br> مشخص می شود نه کارکتر New Line. اگر می خواهید HTML کارکترهای New Line و Space و... را نادیده نگیرد، باید خروجی موردنظر را در درون تگ pre قرار دهید:
echo '<pre>';
print_r($cities);
echo '</pre>';
// or
echo '<pre>' . print_r($cities, true) . '</pre>';
// or
echo '<pre>';
var_dump($cities);
echo '</pre>';

نمایش آرایه به کمک ساختار تکرار foreach
زبان PHP دارای یک ساختار تکرار دیگر به نام foreach است که هدف آن، پیمایش تک تک عناصر آرایه و انجام دستورات حلقه برروی هرکدام از عناصر است. برای درک بهتر، به مثال زیر که تمام عناصر آرایه را نمایش می دهد، دقت کنید:
$cities = array(
   'SistanAndBaluchestan' => 'Zahedan',
   'Tehran' => 'Tehran',
   'Fars' => 'Shiraz'
);
foreach($cities as $city) {
   echo $city . '<br />' . PHP_EOL;
}
/*
Output:
Zahedan
Tehran
Shiraz
*/

در این ساختار، ابتدا باید اسم آرایه موردنظر جهت پیمایش را درون پرانتز بعد از foreach بنویسیم و سپس، کلمه کلیدی as را نوشته و در ادامه، یک متغیر دلخواه برای نگهداری موقت عناصر آرایه ذکر می کنیم. بدین ترتیب، هربار یکی از عناصر آرایه استخراج شده و در متغیر مشخص شده قرار می گیرد و بدنه حلقه اجرا می شود و این روند برای همه عناصر آرایه تکرار خواهد شد. البته اگر در درون حلقه به اندیس عناصر نیز احتیاج داشته باشیم، باید از ساختاری مشابه کد زیر استفاده کنیم:
$cities = array(
   'SistanAndBaluchestan' => 'Zahedan',
   'Tehran' => 'Tehran',
   'Fars' => 'Shiraz'
);
foreach($cities as $state => $city) {
   echo "{$state} : {$city}<br />" . PHP_EOL;
}
/*
Output:
SistanAndBaluchestan : Zahedan
Tehran : Tehran
Fars : Shiraz
*/

در این روش، بعد از کلمه کلیدی as یک متغیر دلخواه برای نگهداری اندیس عناصر نوشته و سپس علامت <= را درج کرده و در ادامه، یک متغیر دلخواه برای نگهداری مقدار عناصر درج می کنیم. بدین ترتیب، هربار که حلقه اجرا می شود، اندیس عنصر مربوطه در متغیر اول و مقدار آن در متغیر دوم قرار می گیرد و بدنه حلقه اجرا خواهد شد.
درمورد ساختار foreach باید به این نکات دقت کنید:
  • این ساختار تمام عناصر آرایه را به ترتیب از ابتدا به انتها پیمایش میکند و نمی توان آرایه را از انتها به ابتدا پیمایش نمود.
  • گام حرکت در این ساختار همیشه یک واحد است و برای مثال، نمی توان آرایه را به صورت یک در میان، پیمایش نمود.
  • همیشه یک کپی از عنصر جاری حلقه در هر پیمایش، در متغیر مشخص شده قرار می گیرد و تغییرات روی متغیر مربوطه، موجب تغییر عنصر اصلی آرایه نخواهد شد.
  • درصورت نیاز، می توان مشابه سایر ساختارهای تکرار از دستورات ;break و ;continue برای خروج از حلقه یا نادیده گرفتن یک دور خاص از آن، استفاده نمود.
ویرایش آرایه ها
برای تغییر مقدار یک عنصر آرایه، کافی است توسط اندیس، به آن عنصر اشاره کرده و مقدار جدید را در آن ذخیره کنیم:
$stateCount['Iran'] = 25;
echo $stateCount['Iran'] . '<br />' . PHP_EOL;
// Output: 25
$stateCount['Iran'] = 31;
echo $stateCount['Iran'] . '<br />' . PHP_EOL;
// Output: 31

حذف عناصر آرایه
ممکن است گاهی نیاز به حذف یکی از عناصر آرایه پیدا کنید. باید دقت کنید که عناصر آرایه نیز همچون متغیرهای معمولی، قابل تعریف، ویرایش و حذف هستند. در PHP برای حذف یک متغیر باید از دستور unset استفاده کنیم:
$colors = array('red', 'green', 'pink', 'blue', 'yellow');
unset($colors[2]);
print_r($colors);
/*
Output:
Array
(
   [0] => red
   [1] => green
   [3] => blue
   [4] => yellow
)
*/

البته باید دقت کنید که تمام متغیرها (حتی خود آرایه) با کمک دستور unset قابل حذف هستند. ضمناً همانطور که در مثال فوق مشاهده می کنید، حذف یکی از عناصر آرایه در PHP باعث نمی شود که اندیس عناصر بعد از آن، تغییر کند و یک واحد به عقب کشیده شود. همچنین درصورتی که تمام عناصر یک آرایه را حذف کنید، باز هم آرایه از بین نمی رود؛ بلکه یک آرایه بدون عنصر (آرایه خالی) خواهیم داشت. آرایه خالی نیز با عدم وجود یک آرایه متفاوت است. برای درک بهتر، آرایه خالی را مثل یک بشقاب درنظر بگیرید که درون آن، میوه ای نیست. عدم وجود آرایه نیز مثل آن است که اصلاً بشقابی نداشته باشیم.

تعریف اولیه آرایه

عادت کنید هرگاه نیاز به تعریف یک آرایه جدید دارید، ابتدا مشابه کد زیر، یک آرایه خالی ایجاد کنید:
$x = array();

دقت کنید که اگر این کار را انجام ندهید، در پروژه های گروهی که ممکن است فایل های اسکریپت مختلف، همدیگر را صدا زده و کدهای دیگری را در خود ضمیمه کنند، احتمال بروز خطاهای ناخواسته وجود خواهد داشت. برای مثال، ممکن است با دستوری مثل $x[] = 5; قصد ایجاد یک آرایه جدید به نام x$ داشته باشید اما کد دیگری که در برنامه، قبلاً فراخوانی شده است نیز آرایه ای به این نام تعریف کرده باشد و درنتیجه دستور شما، به انتهای آن آرایه، عنصر جدیدی اضافه کند و در این حالت، استفاده از تابع array بدون پارامتر، جهت ایجاد یک آرایه خالی به شما در جهت اطمینان از خالی بودن آرایه x$ قبل از درج مقدار جدید، کمک خواهد کرد (درمورد فراخوانی اسکریپت های دیگر که اصطلاحاً به آن، ضمیمه کردن کدها می گوییم، در جلسات آینده توضیح خواهیم داد).