یک array در PHP در حقیقت یک نقشه ترتیبی است. یک نقشه یک نوع پیونددهنده مقدارها به کلیدها است. این نوع برای کاربردهای مختلف بهینهسازی شده است. میتواند بصورت یک آرایه٬ لیست (بردار)٬ جدول درهمسازی (یک پیادهاسزی نقشه)٬ دیکشنری٬ مجموعه٬ پشته٬ صف٬ و حتی بیشتر با آن رفتار شود. با توجه به این که مقدارهای array میتواند array دیگر٬ درخت و array چند بعدی نیز ممکن است.
توضیح این ساختارهای داده فراتر از حوزه این راهنما است اما حداقل یک مثال برای هر یک از آنها فراهم شده است. برای اطلاعات بیشتر به منابع گسترده موجود در این باره ببینید.
یک array میتواند با استفاده از ساخت زبانی array() ساخته شود. پارامترهای آن تعداد دلخواهی زوجهای کلید => مقدار است.
array( key => value , ... ) // key یک integer یا string است // value هر مقداری از هر نوعی باشد
<?php
$arr = array("foo" => "bar", 12 => true);
echo $arr["foo"]; // bar
echo $arr[12]; // 1
?>
یک key میتواند integer یا یکor a string باشد. اگر یک کلید نمایش استاندارد integer بهمان صورت تفسیر خواهد گردید (برای نمونه "8" به عنوان 8 استاندارد خواهد شد در حالی که "08" به عنوان "08" ارزیابی خواهد شد). Float در key به integer گرد خواهد شد. انواع پیوندی و اندیسدار array نوع یکسانی در PHP هستند و هر دو شامل اندیسهای integer و string است.
نوع میتواند هر نوع PHP باشد.
Note:
تلاش برای دسترسی به کلید آرایه تعریف نشده همانند دسترسی به هر متغیر تعریف نشده دیگر است: پیام خطای E_NOTICE-level ایجاد خواهد شد و نتیجه NULL بود.
<?php
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
echo $arr["somearray"][6]; // 5
echo $arr["somearray"][13]; // 9
echo $arr["somearray"]["a"]; // 42
?>
اگر یک کلید تعیین نشده باشد٬ بیشترین مقدار اندیس integer انتخاب شده و کلید جدید همان مقدار به اضافه یک است. اگر یک کلید پیش از این یک مقدار اختصاص داده شده باشد. آن مقدار بازنویسی میگردد.
<?php
// This array is the same as ...
array(5 => 43, 32, 56, "b" => 12);
// ...this array
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>
پیش از PHP 4.3.0 اضافه نمودن اعضا به یک array دارای کلید بیشترین منفی٬ یک کلید جدید براساس فرایند بالا تولید خواهد کرد. از زمان PHP 4.3.0 کلید جدید 0 خواهد بود.
استفاده از TRUE به عنوان key برابر مقدار integer 1 به عنوان کلید خواهد بود. استفاده از FALSE به عنوان key برابر مقدار integer 0 به عنوان کلید خواهد بود. استفاده از NULL به عنوان کلید برابر با مقدار رشته خالی ارزیابی خواهد گردید. استفاده از رشته خالی به عنوان کلید (یا بازنویسی) یک کلید با رشته خالی و مقدار آن خواهد ساخت. این کار همانند استفاده از براکت خالی نیست.
Array و object نمیتوانند به عنوان کلید استفاده شود. انجام این کار یک هشدار تولید خواهد کرد: Illegal offset type.
یک array موجود با تعیین قطعی مقدار در آن تغییر خواهد یافت.
انتصاب مقادیر به array با تعیین کلید در براکت ممکن است. کلید را میتوان حذف نمود که در نتیجه یک براکت خالی باقی خواهد ماند ([]).
$arr[key] = value; $arr[] = value; // key may be an integer or string // value may be any value of any type
اگر $arr هنوز بوجود نیامده باشد٬ ساخته خواهد شد در نتیجه میتوان گفت این کار راهی جایگزین برای ساخت یک array است. برای تغییر یک مقدار مشخص مقدار جدید با استفاده از کلید به آن انتصاب داده میشود. برای از بین بردن یک کلید/مقدار تابع unset() را بر روی آن فراخوانی نمایید.
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // This is the same as $arr[13] = 56;
// at this point of the script
$arr["x"] = 42; // This adds a new element to
// the array with key "x"
unset($arr[5]); // This removes the element from the array
unset($arr); // This deletes the whole array
?>
Note:
همانطور که در بالا ذکر شد بیشترین اندیس موجود integer به کار خواهد رفت و کلید جدید بیشترین مقدار کلید به اضافه یک است. اگر اندیس integer وجود نداشته باشد کلید 0 (صفر) خواهد بود. اگر یک کلید مقدار مشخص شدهای داشته باشد آن مقدار بازنویسی خواهد شد.
توجه کنید بیشترین مقدار کلید استفاده شده در اینجا ممکن است هم اکنون در arrayموجود نباشد . تنها پیشنیاز برای استفاده از کلید وجود آن در array است که از دفعه پیشین array دوباره اندیس گیرد. مثال پایین نشان میدهد :
<?php
// Create a simple array.
$array = array(1, 2, 3, 4, 5);
print_r($array);
// Now delete every item, but leave the array itself intact:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
// Append an item (note that the new key is 5, instead of 0).
$array[] = 6;
print_r($array);
// Re-index:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>The above example will output:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
توابع مفیدی برای کار با آرایهها وجود دارد. بخش توابع آرایه را ببینید.
Note:
تابع unset() امکان حذف کلید از array را فراهم نمایید. آگاه باشید آرایه دوباره اندیسنگاری نخواهد شد. اگر یک رفتار واقعی حذف و جابجایی مورد نیاز باشد array با استفاده از تابع array_values() دوباره اندیسگذاری خواهد شد.
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* will produce an array that would have been defined as
$a = array(1 => 'one', 3 => 'three');
and NOT
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// Now $b is array(0 => 'one', 1 =>'three')
?>
ساختار کنترلی foreach برای array وجود دارد. یک راه ساده برای برعکس نمودن یک array ایجاد کرده است.
همیشه از نقل قول برای اندیس رشتهای استفاده نمایید. برای نمونه $foo['bar'] صحیح در حالی که $foo[bar] صحیح نیست. اما چرا? به صورت معمول با دستور زیر در اسکریپتهای قدیمی روبرو خواهید شد:
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
این اشتباه است اما کار میکند. دلیل این امر وجود ثابت تعریف نشده (bar) به غیر از string ('bar' به علامت '' توجه نمایید) است. PHP ممکن است در آینده ثابتهایی همنام با چنین کدی تعریف نماید. این کد بدلیل تبدیل خودکار رشته بدون علامت (یک string بدون نقل قول که به هیچ یک از سمبلهای شناخته شده مشابه نیست) به string به همراه string بدون علامت بدون مشکل عمل مینماید. برای نمونه اگر ثابتی با نام bar تعریف نشده باشد آنگاه PHP نوع داده string یعنی 'bar' را جایگزین کرده و از آن استفاده خواهد کرد.
Note: این به معنای استفاده همیشگی نقل قول برای کلید نیست. کلیدهایی که ثابت یا متغیر هستند نباید از نقل قول برای آنها استفاده کرد. چرا که نقل قول مانع از تفسیر آنها توسط PHP خواهد شد.
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Simple array:
$array = array(1, 2);
$count = count($array);
for ($i = 0; $i < $count; $i++) {
echo "\nChecking $i: \n";
echo "Bad: " . $array['$i'] . "\n";
echo "Good: " . $array[$i] . "\n";
echo "Bad: {$array['$i']}\n";
echo "Good: {$array[$i]}\n";
}
?>The above example will output:
Checking 0: Notice: Undefined index: $i in /path/to/script.html on line 9 Bad: Good: 1 Notice: Undefined index: $i in /path/to/script.html on line 11 Bad: Good: 1 Checking 1: Notice: Undefined index: $i in /path/to/script.html on line 9 Bad: Good: 2 Notice: Undefined index: $i in /path/to/script.html on line 11 Bad: Good: 2
مثالهایی برای نمایش این رفتار:
<?php
// Show all errors
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// Correct
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// Incorrect. This works but also throws a PHP error of level E_NOTICE because
// of an undefined constant named fruit
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// This defines a constant to demonstrate what's going on. The value 'veggie'
// is assigned to a constant named fruit.
define('fruit', 'veggie');
// Notice the difference now
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// The following is okay, as it's inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]"; // Hello apple
// With one exception: braces surrounding arrays within strings allows constants
// to be interpreted
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// This will not work, and will result in a parse error, such as:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// This of course applies to using superglobals in strings as well
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// Concatenation is another option
print "Hello " . $arr['fruit']; // Hello apple
?>
زمانی که error_reporting را برای نمایش خطاهای سطج show E_NOTICE تنظیم کرده باشید (برای نمونه با تنظیم مقدار به E_ALL) چنین کاربردهایی سریعا مشخص خواهد شد. به طور پیشفرض error_reporting notice را نشان نمیدهد.
همانطور که در بخش دستور گفته شد٬ هر چه داخل براکت قرار گیرد ('[' و ']') یک عبارت خواهد بود. این موضوع به معنای کارکرد کد زیر است:
<?php
echo $arr[somefunc($bar)];
?>
این مثال استفاده از یک تابع برای بازگرداندن مقدار اندیس است. PHP در مورد ثابتها نیز اطلاع دارد:
<?php
$error_descriptions[E_ERROR] = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE] = "This is just an informal notice";
?>
توجه کنید که E_ERROR یک تشخیص دهنده صحیح است مانند bar در مثال ابتدایی است. اما در مثال آخر همانند زیر است:
<?php
$error_descriptions[1] = "A fatal error has occured";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>
زیرا E_ERROR برابر 1 است٬ غیره.
در زمانی در آینده تیم PHP کلمه کلیدی یا ثابت دیگری ممکن است اضافه نماید. برای نمونه استفاده از کلماتی مانند empty و default به این صورت اشتباه است زیرا آنها کلمات رزرو شده هستند.
Note: برای تکرار٬ در یک string با "" همراه نکردن اندیسهای آرایه با نقل قول "$foo[bar]" نیز صحیح است. مثال بالا برای جزئیات بیشتر درباره چرایی آن بخش تحلیل متغیر در رشته را ببینید.
برای هر نوع دیگر: integer٬ float٬ string٬ boolean و resource٬ تبدیل یک مقدار به یک array یک آرایه با تک عضوی با اندیس صفر خواهد شد و مقدار آن مقدار خطی تبدیل شده است. به عبارت دیگر (array)$scalarValue دقیقا همانند array($scalarValue) است.
اگر یک object به array تبدیل شود نتیجه یک array خواهد بود و اعضای آن ویژگیهای object است. کلیدها نام متغیرهای عضو است که چندین استثنا دارد: متغیرهای خصوصی نام کلاس را به نام متغیر اضافه خواهند کرد. متغیرهای حفاظت شده یک '*' به نام متغیر اضافه شده است. این مقدارهای اضافه شده بایتهای null داشته که در هر طرف آن اضافه شده است. این نتیجه یک رفتار نامشخص ایجاد خواهد کرد:
<?php
class A {
private $A; // This will become '\0A\0A'
}
class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA'
}
var_dump((array) new B());
?>
کد بالا نشان میدهد که دو کلید با نامهای 'AA' دارد در حالی که یکی از آنها دارای نام '\0A\0A' است.
میتوان آرایههای را با استفاده از تابع array_diff() و عملگرهای آرایه استفاده نمود.
نوع آرایه در PHP همه فن حریف است. در اینجا چند مثال نشان داده شده است:
<?php
// this
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // key will be 0
);
// is completely equivalent with
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // key will be 0
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// will result in the array array(0 => 'a' , 1 => 'b' , 2 => 'c'),
// or simply array('a', 'b', 'c')
?>
Example #1 استفاده از array()
<?php
// Array as (property-)map
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// strictly numerical keys
$array = array( 7,
8,
0,
156,
-10
);
// this is the same as array(0 => 7, 1 => 8, ...)
$switching = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // key = 6 (maximum of integer-indices was 5)
'8' => 2, // key = 8 (integer!)
'02' => 77, // key = '02'
0 => 12 // the value 10 will be overwritten by 12
);
// empty array
$empty = array();
?>
Example #2 مجموعه
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
echo "Do you like $color?\n";
}
?>
The above example will output:
Do you like red? Do you like blue? Do you like green? Do you like yellow?
تغییر مقدار array بصورت مستقیم ممکن است زیرا PHP 5 آنها را با مرجع ارسال مینماید. پیش از آن کارهای دیگری نیز باید انجام میشد:
Example #3 مجموعه
<?php
// PHP 5
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); /* ensure that following writes to
$color will not modify the last array element */
// Workaround for older versions
foreach ($colors as $key => $color) {
$colors[$key] = strtoupper($color);
}
print_r($colors);
?>
The above example will output:
Array ( [0] => RED [1] => BLUE [2] => GREEN [3] => YELLOW )
این مثال ساخت آرایه براساس یک را نشان میدهد.
Example #4 اندیس براساس یک
<?php
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>
The above example will output:
Array ( [1] => 'January' [2] => 'February' [3] => 'March' )
Example #5 پر نمودن یک آرایه
<?php
// fill an array with all items from a directory
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>
Array دارای ترتیب است. ترتیب با استفاده از توابع مرتب کننده متفاوت قابل تغییر است. بخش توابع آرایه را برای اطلاعات بیشتر ببینید. تابع count() میٰتواند تعداد اعضای موارد در array را بشمارد.
Example #6 مرتب نمودن یک آرایه
<?php
sort($files);
print_r($files);
?>
مقدار یک array هرچیزی میتواند باشد و حتی میتواند یک array دیگر باشد. این کار ایجاد array چندبعدی و بازگشتی را ممکن میسازد.
Example #7 آرایههای بازگشتی و چندبعدی
<?php
$fruits = array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third"
)
);
// Some examples to address values in the array above
echo $fruits["holes"][5]; // prints "second"
echo $fruits["fruits"]["a"]; // prints "orange"
unset($fruits["holes"][0]); // remove "first"
// Create a new multi-dimensional array
$juices["apple"]["green"] = "good";
?>
انتصاب Array همیشه کپی نمودن مقدار است. همچنین اشارهگر داخلی array استفاده شده توسط current() و توابع مشابه بازنویسی خواهد شد. از عملگر مرجع برای کپی نمودن array با مرجع استفاده نمایید.
<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 is changed,
// $arr1 is still array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // now $arr1 and $arr3 are the same
?>