آموزش PHP جلسه 12: بررسی قواعد دستوری آرایه ها (بصورت جامع)

در جلسه ی دهم، آرایه ها را بصورت مقدماتی، معرفی کردیم.
در این جلسه، قصد داریم تا جزئیات آن را بررسی کنیم.

به کمک آرایه میتوان، چندین مقدار را در یک متغیر، ذخیره کرد.
با استفاده از کلمه ی کلیدی array() میتوان یک آرایه ساخت. هر خانه از آرایه، متشکل شده است از یک جفت key => value بهمراه یک کاما(,).
فرم کلی تعریف یک آرایه را ببینید:

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

برای درک فایده ی استفاده از آرایه ها، به مثال زیر توجه کنید:

<?php
$student1 = 'mohsen movahed';
$student2 = 'ali mohamadi';
$student3 = 'mohamad safari';
...
...
...

طبق مثال بالا، اگر بخواهیم اسامی 3 دانش آموز را ذخیره کنیم، میتوانیم 3 متغیر برای آنها در نظر گرفته و با صدا زدن نام متغیر آن(مثلاً echo $student1;) میتوان نام دانش آموز را چاپ کرد. اما اگر 20 دانش آموز یا 100 دانش آموز یا ... داشته باشیم، آیا ساخت 100 متغیر، کار درستی است؟
بهترین راه، استفاده از یک آرایه است که در داخل آن، اسامی 100 دانش آموز را ثبت کرد.
اینکار باعث میشود یک متغیر با تعداد 100 اندیس داشته باشیم.
با توضیحاتی که داده شد، پس نتیجه میگیریم، مثال بالا را در یک آرایه پیاده کنیم:

<?php
$student = array(
    1 => 'mohsen movahed',
    2 => 'ali mohamadi',
    3 => 'mohamad safari',
    // ...
    // ...
    // ...
);

حالا اگر بخواهیم دانش آموز اول را چاپ کنیم، کافیست متغیر را بهمراه اندیس(نام های دیگر آن index و key) صدا بزنیم:

<?php
echo $student[1]; // mohsen movahed
/*-------------------*/
echo $student{1}; // mohsen movahed
نکته: برای مشخص کردن اندیس ها میتوانید از [] یا {} استفاده کنید. یعنی $student[1] و $student{1} یک معنی میدهند.

 

نکات آرایه ها:

نکته 1: برای چاپ کل آرایه، بجای استفاده از var_dump() میتوانید از print_r() استفاده کنید. این تابع دارای خروجی ساده تری میباشد.

<?php
$student = array(
	1 => 'mohsen movahed',
	2 => 'ali mohamadi',
	3 => 'mohamad safari',
	// ...
	// ...
	// ...
);

print_r($a);
// output: 
// Array ( [1] => mohsen movahed [2] => ali mohamadi [3] => mohamad safari )

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

<?php
$student = array(
	1 => 'mohsen movahed',
	2 => 'ali mohamadi',
	3 => 'mohamad safari',
	// ...
	// ...
	// ...
);

$result = print_r($student, true);
$output =  '<pre>' . $result . '</pre>';
echo $output;
/* output:
*			Array
*			(
*			    [1] => mohsen movahed
*			    [2] => ali mohamadi
*			    [3] => mohamad safari
*			)
*/

با توجه به مقدار true، تابع print_r() آرایه را چاپ نخواهد کرد و خروجی آن در متغیر $result قرار میگیرد.
البته کد بالا را میتوان به شکل زیر، نوشت:

<?php
$student = array(
	1 => 'mohsen movahed',
	2 => 'ali mohamadi',
	3 => 'mohamad safari',
	// ...
	// ...
	// ...
);

echo '<pre>' . print_r($student, true) . '</pre>';

 

نکته 2: علامت کاما بعد از آخرین عنصر آرایه، اختیاری است.

<?php
$a = array(1, 2);
$b = array(1, 2,);

نکته 3: از PHP 5.4 به بعد، شما میتوانید از علامت [] بجای array() استفاده کنید.

<?php
$a = array(1, 2);

// as of PHP 5.4
$b = [1, 2];

نکته 4: ایندکس آرایه(key)، میتواند integer یا string باشد و مقدار آرایه(value)، میتواند از هر نوعی باشد.
مثال زیر، نمونه ای برای ایندکس های عددی میباشد:

<?php
$a = [
    20 => 'mohamad',
    -2 => 2.25,
    100 => true,
    1 => 1396
];

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*			(
*			    [20] => mohamad
*			    [-2] => 2.25
*			    [100] => 1
*			    [1] => 1396
*			)
*/

همانطور که میبینید، ایندکس ها از نوع اعداد صحیح(مثبت و منفی) هستند و مقادیرشان از نوع string و float و boolean و integer میباشد.

 

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

<?php
$a[] = "محسن";
$a[] = "محمد";
$a[] = "علی";
$a[] = "سعید";

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*			(
*			    [0] => محسن
*			    [1] => محمد
*			    [2] => علی
*			    [3] => سعید
*			)
*/

زمانیکه ایندکس را تعیین نمیکنیم، بصورت پیش فرض، حداقل مقدار اندیس از 0 شروع میشود و خانه های بعدی یک واحد نسبت به مقدار ایندکس قبلی، اضافه خواهند شد. یعنی اگر ایندکس خانه ی اول 0 باشد، خانه ی دوم، یک واحد بیشتر از خانه ی قبلی میشود یعنی 1 و ...
پس اگر ایندکس خانه ای 20 باشد، خانه ی بعدی 21 میباشد.

مثال قبلی، معادل دستورات زیر، میباشد:

<?php
$a[0] = "محسن";
$a[1] = "محمد";
$a[2] = "علی";
$a[3] = "سعید";

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*			(
*			    [0] => محسن
*			    [1] => محمد
*			    [2] => علی
*			    [3] => سعید
*			)
*/

 

با توجه به نکته ی ایندکس گذاری، حالا اگر ایندکس یک عنصر برابر با -5 بود و برای خانه ی بعدی، ایندکسی تعریف نشده باشد، مقدار ایندکس خانه ی یعدی، چند میباشد؟
برای درک موضوع، به مثال زیر توجه کنید:

<?php
$a = [
	'first' => 'a',
	-5 => 'b',
	'c',
	'd',
	101 => 'e',
	-1 => 'f',
	'g'
];


echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*			(
*			    [first] => a
*			    [-5] => b
*			    [0] => c
*			    [1] => d
*			    [101] => e
*			    [-1] => f
*			    [102] => g
*			)
*/

در بالا گفتیم ایندکس های عددی ، بطور خودکار از حداقل مقدار یعنی 0 تا یک واحد بیشتر از خانه ی قبلی، مقدار دهی میشوند. بنابراین اعداد زیر 0 در مقدار دهی خودکار، لحاظ نمیشوند.

 

نکته 7: همانطور که گفتیم، ایندکس آرایه میتواند از نوع string باشد:

<?php
$a = [
	'first' => 'mohsen movahed',
	'second' => 'علی محمدی',
	'سومین' => 'mohamad safari'
];

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*			Array
*			(
*			    [first] => mohsen movahed
*			    [second] => علی محمدی
*			    [سومین] => mohamad safari
*			)
*/
به این نوع از آرایه که ایندکس هایش بصورت string نام گذاری شده است، آرایه ی انجمنی یا Associative Array میگویند.

مثال قبلی معادل دستورات زیر میباشد:

<?php
$a['first'] = 'mohsen movahed';
$a['second'] = 'علی محمدی';
$a['سومین'] = 'mohamad safari';

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*			Array
*			(
*			    [first] => mohsen movahed
*			    [second] => علی محمدی
*			    [سومین] => mohamad safari
*			)
*/

 

نکته 8: ایندکس های یک آرایه میتواند ترکیبی از integer و string باشد:

<?php
$a = [
	'mohsen',
	'first' => 'ali',
	10 => '',
	'second' => true,
	-1 => null
];

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*			Array
*			(
*			    [0] => mohsen
*			    [first] => ali
*			    [10] => 
*			    [second] => 1
*			    [-1] => 
*			)
*/

همانطور که خروجی دستورات بالا را میبینید، ایندکس 10 و -1 هیچ مقداری ندارند.
اما برای اینکه بفهمیم نوعشان آیا یکی است یا خیر، میتوانید از var_dump() استفاده کنید:

<?php
$a = [
	'mohsen',
	'first' => 'ali',
	10 => '',
	'second' => true,
	-1 => null
];

var_dump($a[10]); // string '' (length=0)
var_dump($a[-1]); // null

همانطور که میبینید، نوعشان با یکدیگر متفاوت است. یکی string و دیگری null است.
در PHP تابعی بنام gettype() وجود دارد که نوع value را نشان میدهد. در مثال قبلی میتوانید از این تابع استفاده کنید:

<?php
$a = [
	'mohsen',
	'first' => 'ali',
	10 => '',
	'second' => true,
	-1 => null
];

echo gettype($a[0]) . '<br>'; // string
echo gettype($a['first']) . '<br>'; // string
echo gettype($a[10]) . '<br>'; // string
echo gettype($a['second']) . '<br>'; // boolean
echo gettype($a[-1]); // NULL

 

نکته 9: برای مثال قبل، میتوان آرایه را بصورت زیر معرفی کرد:

<?php
$a[] = 'mohsen';
$a['first'] = 'ali';
$a[10] = '';
$a['second'] = true;
$a[-1] = null;

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*			Array
*			(
*			    [0] => mohsen
*			    [first] => ali
*			    [10] => 
*			    [second] => 1
*			    [-1] => 
*			)
*/

نکته 10: میتوانید عناصر آرایه را بهمراه ایندکس و بدون ایندکس، تعریف کنید:

<?php
$a = [
    'mohsen',
    'mohamad',
    20 => 'hassan',
    'ali',
    '101' => 'hamid',
    'hossein',
    'name' => 'bahman',
    'farid'
];

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*           (
*               [0] => mohsen
*               [1] => mohamad
*               [20] => hassan
*               [21] => ali
*               [101] => hamid
*               [102] => hossein
*               [name] => bahman
*               [103] => farid
*           )
*/

همانطور که میبینید، اگر ایندکسی برای آرایه نگذارید، خانه ی اول آرایه، بصورت پیشفرض 0 در نظر گرفته میشود.
ایندکس خانه ی سوم را 20 در نظر گرفته ایم. بنابراین خانه ی چهارم که ایندکسی ندارد، بطور اتومات 21 در نظر گرفته میشود.
ایندکس خانه ی پنجم را رشته ی 101 نوشته ایم. اما رشته ی 101 به یک integer تبدیل(cast) میشود و خانه ی ششم بطور خودکار، 102 در نظر گرفته میشود.
خانه ی آخر، چون ایندکسی در نظر گرفته نشده است، ادامه ی ایندکس عددی قبل یعنی 103 در نظر گرفته میشود.

در مورد casting ها در جلسه ی بعدی صحبت خواهیم گرد.

 

نکته 11: بعد از تعریف آرایه، میتوانید مقداری جدیدی را به آن آرایه، اضافه کنید:

<?php
$a = ['a', 'b', 'c'];

$a[] = 'd';
$a['example'] = 'e';
$a[] = 'h';


echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*			(
*			    [0] => a
*			    [1] => b
*			    [2] => c
*			    [3] => d
*			    [example] => e
*			    [4] => h
*			)
*/

نکته 12: اگر ایندکس ها مقدار یکسانی داشته باشند، آخرین مقدار داده شده، overwrite میشود:

<?php
$a = ['a', 'b', 'c', 'd'];

$a[false] = 'aa';

$a[true] = 'bb';
$a[true] = 'bbb';

$a[3] = 'dd';


echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*			(
*			    [0] => aa
*			    [1] => bbb
*			    [2] => c
*			    [3] => dd
*			)
*/

همانطور که میبینید، ایندکس false مقدار 0 و ایندکس true مقدار 1 در نظر گرفته میشود.

 

نکته 13: ایندکس های رشته ای را در داخل کوتیشن بذارید:

<?php
$config[site] = 'http://bithub.ir'; 
// Notice: Use of undefined constant site - assumed 'site'

وقتی ایندکس رشته را در داخل کوتیشن نمیگذارید، ابتدا site را بعنوان ثابت(constant) در نظر میگیرد ولی از آنجاییکه ثابتی بنام site تعریف نکرده ایم و وجود ندارد، پس site را به string تبدیل میکند. پس بهتر است خودتان اینکار را انجام دهید:

<?php
$config['site'] = 'http://bithub.ir';
$config['title'] = 'آموزش برنامه نویسی | بیت هاب';
$config['administrator'] = 'محسن موحد';
$config['direction'] = 'rtl';
?>

<!DOCTYPE html>
<html dir="<?= $config['direction'] ?>">
<head>
	<title><?= $config['title'] ?></title>
</head>
<body>
	<p>به سایت <?= $config['site'] ?> خوش آمدید.</p>
	<p>مدیریت سایت: <?= $config['administrator'] ?></p>
</body>
</html>

نکته 14: میتوانید به کمک متغیرها با ایندکس ها کار کنید:

<?php
$a = [
	'first' => 'a',
	'b',
	'c'
];

$str = 'first';
$i = 0;

echo $a[$str]; // a
echo $a[$i]; // b
echo $a[$i + 1]; // c

 

آرایه های چند بعدی (Multi-dimensional Arrays):

آرایه ی چند بعدی، آرایه ایست که شامل یک یا چندین آرایه در داخل خود باشد.
برای اینکه با یک مثال، یک آرایه ی دو بعدی را معرفی کنیم، مثال دانش آموزان را بیاد بیاورید.
تصور کنید برای هر دانش آموز، اسم و فامیل و کد دانش آموزی اش را بخواهیم در یک آرایه داشته باشیم:

<?php
$student = array(
	0 => array('name' => 'mohsen', 'family' => 'movahed', 'code' => '123456'),
	1 => array('name' => 'ali', 'family' => 'mohamadi', 'code' => '987654'),
	2 => array('name' => 'hassan', 'family' => 'razeghi', 'code' => '147258'),
	// ...
	// ...
	// ...
);
echo '<pre>' . print_r($student, true) . '</pre>';
/* output:
*           Array
*			(
*			    [0] => Array
*			        (
*			            [name] => mohsen
*			            [family] => movahed
*			            [code] => 123456
*			        )
*
*			    [1] => Array
*			        (
*			            [name] => ali
*			            [family] => mohamadi
*			            [code] => 987654
*			        )
*
*			    [2] => Array
*			        (
*			            [name] => hassan
*			            [family] => razeghi
*			            [code] => 147258
*			        )
*
*			)
*/

در مثال میبینید، یک آرایه بنام $student معرفی کرده ایم که داخل آن، مشخصات 3 دانش آموز را وارد کرده ایم.
مشخصات هر دانش آموز را با یک آرایه، مشخص کرده ایم.
کلیت ماجرا، مانند آرایه های تک بعدی است. در قسمت آرایه های یک بعدی، توضیح دادیم که جفت key => value داریم. اینجا هم بهمان صورت است. و تفاوتش اینست که یک آرایه جای value نشسته است. آرایه های داخلی هم، همانند دیگر آرایه ها میتوانند در درون خود یک آرایه ی دیگر بعنوان value های خود بپذیرند.

حالا اگر بخواهیم، نام دومین دانش آموز را از داخل آرایه، چاپ کنیم:

<?php
echo $student[1]['name']; // ali

کافیست فقط اندیس های مربوط به آن دانش آموز را بنویسیم.
از آنجایی که اندیس های آرایه ی $student از 0 شروع شده است، بنابراین اندیس دومین دانش آموز برابر است با 1.
اگر آرایه تک بعدی بود کافی بود $student[1] را بنویسید تا value آن چاپ شود. ولی ازآنجایی که value دارای یک آرایه است، پس باید اندیس آرایه ی درونی را هم صدا بزنید. $student[1]['name']

مثال دیگری را ببینید:

<?php
$a = array(
	array(11, 12, 13, 14),
	15,
	array(16, 'a' => 17),
	'b' => array(100 => 18)
);

echo $a[0][2]; // 13
echo $a[1]; // 15
echo $a[2]['a']; // 17
echo $a['b'][100]; // 18

همانطور که در مثال ها میبینید، فرقی نمیکند آرایه را چگونه پیاده سازی کنید. برای نشان دادن مقادیر آرایه، کافیست اندیس هارا درست وارد کنید.

اگر بخواهیم آرایه ای سه بعدی یا چهار بعدی یا ... پیاده کنیم:

<?php
$a = array(
	'a' => array(
		'b' => array(
			10,
			'c' => array(
				'd' => 20,
			),
		)
	)
);

/*----------------------------------*/
echo $a['a']['b'][0]; // 10
echo $a['a']['b']['c']['d']; // 20
/*----------------------------------*/

echo '<pre>' . print_r($a, true) . '</pre>';
/* output:
*           Array
*			(
*			    [a] => Array
*			        (
*			            [b] => Array
*			                (
*			                    [b] => 10
*			                    [c] => Array
*			                        (
*			                            [d] => 20
*			                        )
*
*			                )
*
*			        )
*
*			)
*/

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

البته با توجه به نکته ای که در ابتدا گفتیم، میتوانید از [] بجای array() استفاده کنید:

<?php
$a = [
	'a' => [
		'b' => [
			10,
			'c' => [
				'd' => 20,
			],
		]
	]
];

مطالب سایت را بدون ذکر منبع (http://bithub.ir) در جایی منتشر نکنید. با تیشکر.


مطالب مرتبط

برای ارسال نظر، باید عضو سایت شوید.