الفرق بين المراجعتين لصفحة: «PHP/array»

من موسوعة حسوب
< PHP
ط استبدال النص - 'PHP/Function/count' ب'PHP/count'
تعديلات تنسيقية
 
(17 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:المصفوفات في PHP}}</noinclude>
<noinclude>{{DISPLAYTITLE:المصفوفات في PHP}}</noinclude>
المصفوفة في PHP هي خريطة (map) مرتّبة، والخريطة هي نوع ترتبط فيه القيم مع المفاتيح، ولها استخدامات عديدة، فيمكن التعامل معها كمصفوفة أو قائمة (vector) أو جدول hash (نوع من الخرائط) أو قاموس (dictionary) أو مجموعة (collection) أو مكدس (stack) أو طابور (queue) وغير ذلك، حتى أن قيم المصفوفة يمكن أن تكون مصفوفات أخرى، مما يسمح بإنشاء مصفوفات متعدد الأبعاد.
المصفوفة في PHP هي خريطة (map) مرتّبة، والخريطة هي نوع ترتبط فيه القيم مع المفاتيح، ولها استخدامات عديدة، فيمكن التعامل معها كمصفوفة أو قائمة (vector) أو جدول hash (نوع من الخرائط) أو قاموس (dictionary) أو مجموعة (collection) أو مكدس (stack) أو طابور (queue) وغير ذلك، حتى أن قيم المصفوفة يمكن أن تكون مصفوفات أخرى، ممّا يسمح بإنشاء مصفوفات متعددة الأبعاد.


لن نشرح جميع هذه الأنواع في هذا التوثيق، لكن ستجد مثالًا واحدًا على الأقل لكلٍ منهاهم،ابحث عن مقالات حول هذا الموضوع للمزيد من المعلومات.
لن نشرح جميع هذه الأنواع في هذا التوثيق، لكن ستجد مثالًا واحدًا على الأقل لكلٍ منها.


== الصياغة ==
== الصياغة ==


=== إنشاء المصفوفات باستخدام <code>[[PHP/array|array()‎]]</code> ===
=== إنشاء المصفوفات باستخدام <code>[[PHP/array|array()‎]]</code> ===
يمكن إنشاء مصفوفة باستخدام البنية <code>array()‎</code>، وتأخذ هذه البنية أزواج من المفاتيح والقيم (على الشكل <code>key => value</code>) مفصولةٌ بفاصلة لتُعدّ كوسائط لهذه البنية.
يمكن إنشاء مصفوفة باستخدام البنية <code>array()‎</code>، وتأخذ هذه البنية أزواجا من المفاتيح والقيم (على الشكل <code>key => value</code>) مفصولةً بفاصلة لتُعدّ كوسائط لهذه البنية.
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
array(
array(
 
  key  => value,
    key  => value,
  key2 => value2,
 
  key3 => value3,
    key2 => value2,
  ...
 
    key3 => value3,
 
    ...
 
)
)
</syntaxhighlight>
</syntaxhighlight>
يمكن إضافة فاصلة بعد آخر عنصر في المصفوفة اختياريًا، ولا يفضل ذلك في المصفوفات المتكونة من سطر واحد، على سبيل المثال، يفضّل كتابة <code>array(1, 2)</code>‎ بدلًا من <code>array(1, 2, )‎</code>، وبالنسبة للمصفوفات متعددة الأسطر، فمن الشائع استخدام الفاصلة الزائدة لتسهيل عملية إضافة عناصر جديدة في آخر المصفوفة.
يمكن إضافة فاصلة بعد آخر عنصر في المصفوفة اختياريًا، ولا يفضل ذلك في المصفوفات المتكونة من سطر واحد. على سبيل المثال، يفضّل كتابة <code>array(1, 2)</code>‎ بدلًا من <code>(array(1, 2,‎</code>، وبالنسبة للمصفوفات متعددة الأسطر، فمن الشائع استخدام الفاصلة الزائدة لتسهيل عملية إضافة عناصر جديدة في آخر المصفوفة.


وبدءًا من الإصدار 5.4 من PHP أصبح بالإمكان استخدام صياغة قصيرة للمصفوفة، وذلك باستخدام القوسين المربعين <code>[]</code> بدلًا من البنية <code>array()‎</code>.
بدءًا من الإصدار 5.4 من PHP أصبح بالإمكان استخدام صياغة قصيرة للمصفوفة، وذلك باستخدام القوسين المربعين <code>[]</code> بدلًا من البنية <code>array()‎</code>.


'''المثال 1: مصفوفة بسيطة'''
المثال 1: مصفوفة بسيطة
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$array = array(
$array = array(
 
  "foo" => "bar",
    "foo" => "bar",
  "bar" => "foo",
 
    "bar" => "foo",
 
);
);


سطر 41: سطر 31:


$array = [
$array = [
 
  "foo" => "bar",
    "foo" => "bar",
  "bar" => "foo",
 
    "bar" => "foo",
 
];
];
?>
?>
</syntaxhighlight>
</syntaxhighlight>


المفتاح يمكن أن يكون [[PHP/Types/integer|عددًا صحيحًا]] أو [[PHP/Types/string|سلسلةً نصيةً]]، وأما القيمة فيمكن أن تكون من أي نوع.
المفتاح يمكن أن يكون [[PHP/integer|عددًا صحيحًا]] أو [[PHP/string|سلسلةً نصيةً]]، وأما القيمة فيمكن أن تكون من أي نوع.


يحوّل المفتاح قسريًا (أي تُجرى عليه عملية cast) في الحالات التالية:
يحوّل المفتاح قسريًا (أي تُجرى عليه عملية cast) في الحالات التالية:
* [[PHP/Types/string|السلاسل النصية]] التي تحتوي على أعداد صحيحة عشرية صالحة، ما لم يسبق الرقم بعلامة <code>+</code> فإنه سيحوّل إلى نوع [[PHP/Types/integer|عدد صحيح]]، على سبيل المثال المفتاح "8" سيخزّن على شكل 8، ومن ناحية أخرى فإن "08" لن يحوّل لأنه ليس عددً صحيحًا عشريًا صالحًا.
* [[PHP/string|السلاسل النصية]] التي تحتوي على أعداد صحيحة عشرية صالحة، ما لم يسبق الرقم بعلامة <code>+</code> فإنه سيحوّل إلى نوع [[PHP/integer|عدد صحيح]]، على سبيل المثال المفتاح "8" سيخزّن على شكل 8، ومن ناحية أخرى فإن "08" لن يحوّل لأنه ليس عددًا صحيحًا عشريًا صالحًا.
* ستحوّل [[PHP/Types/float|الأعداد العشرية]] (float) إلى [[PHP/Types/integer|أعداد صحيحة]] أيضًا، وهذا معناه أنه سيقتطع الجزء الذي يأتي بعد الفاصلة، فعلى سبيل المثال ستُخزَّن القيمة التي لها المفتاح  8.7 في المفتاح 8.
* ستحوّل [[PHP/float|الأعداد العشرية]] (float) إلى [[PHP/integer|أعداد صحيحة]] أيضًا، وهذا معناه أنه سيقتطع الجزء الذي يأتي بعد الفاصلة، فعلى سبيل المثال ستُخزَّن القيمة التي لها المفتاح  8.7 في المفتاح 8.
* ستحوّل [[PHP/Types/boolean|القيم المنطقية]] إلى [[PHP/Types/integer|أعداد صحيحة]] أيضًا، فعلى سبيل المثال، المفتاح <code>true</code> سيخزّن على شكل 1 والمفتاح <code>false</code> سيخزّن على شكل 0.
* ستحوّل [[PHP/boolean|القيم المنطقية]] إلى [[PHP/integer|أعداد صحيحة]] أيضًا، فعلى سبيل المثال، المفتاح <code>true</code> سيخزّن على شكل 1 والمفتاح <code>false</code> سيخزّن على شكل 0.
* أما القيمة [[PHP/Types/null|Null]] فستحوّل إلى سلسلة نصية فارغة، على سبيل المثال المفتاح <code>null</code> سيخزّن على شكل "".
* أما القيمة [[PHP/null|Null]] فستحوّل إلى سلسلة نصية فارغة، على سبيل المثال المفتاح <code>null</code> سيخزّن على شكل "".
* لا يمكن استخدام المصفوفات [[PHP/Types/object|والكائنات]] كمفاتيح، وسيظهر لك تحذير عند استخدامها (warning: Illegal offset type).
* لا يمكن استخدام المصفوفات [[PHP/object|والكائنات]] كمفاتيح، وسيظهر لك تحذير عند استخدامها (warning: Illegal offset type).
إذا كان هنالك عناصر في المصفوفة تمتلك نفس المفتاح، فسيستخدم المفتاح الأخير فقط وسيكتب فوق العناصر الأخرى.
إذا كان هنالك عناصر في المصفوفة تمتلك نفس المفتاح، فسيستخدم المفتاح الأخير فقط وسيكتب فوق العناصر الأخرى.


'''المثال 2: تحويل النوع والكتابة فوق العناصر'''
المثال 2: تحويل النوع والكتابة فوق العناصر
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$array = array(
$array = array(
    1    => "a",
    1    => "a",
 
  "1"  => "b",
    "1"  => "b",
  1.5  => "c",
 
  true => "d",
    1.5  => "c",
 
    true => "d",
 
);
);


var_dump($array);
var_dump($array);
?></syntaxhighlight>
?></syntaxhighlight>


مخرجات المثال السابق هي:
مخرجات المثال السابق هي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 
 
array(1) {
array(1) {
  [1]=>
  [1]=>
  string(1) "d"
  string(1) "d"
}
}
</syntaxhighlight>
</syntaxhighlight>


جميع المفاتيح في المثال السابق حوِّلَت إلى 1، وسيُكتَب فوق قيم العناصر الجديدة (التي لها مفاتيح مكررة) وستبقى القيمة "d" الأخيرة مرتبطةً بالمفتاح 1.
جميع المفاتيح في المثال السابق حُوِّلَت إلى 1، وسيُكتَب فوق قيم العناصر الجديدة (التي لها مفاتيح مكررة) وستبقى القيمة "d" الأخيرة مرتبطةً بالمفتاح 1.


يمكن للمصفوفات في PHP أن تحتوي على مفاتيح [[PHP/Types/string|نصيّة]] أو [[PHP/Types/integer|عددية]] في نفس الوقت؛ ذلك لأنَّ لغة PHP لا تميز بين المصفوفات المفهرسة (indexed) والترابطية (associative).
يمكن للمصفوفات في PHP أن تحتوي على مفاتيح [[PHP/string|نصيّة]] أو [[PHP/integer|عددية]] في نفس الوقت؛ ذلك لأنَّ لغة PHP لا تميز بين المصفوفات المفهرسة (indexed) والترابطية (associative).


'''المثال 3: استخدام مفاتيح نصيّة وعددية'''
المثال 3: استخدام مفاتيح نصيّة وعددية
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$array = array(
$array = array(
 
  "foo" => "bar",
    "foo" => "bar",
  "bar" => "foo",
 
  100   => -100,
    "bar" => "foo",
  -100  => 100,
 
    100   => -100,
 
    -100  => 100,
 
);
);


var_dump($array);
var_dump($array);
?>
?>
</syntaxhighlight>
</syntaxhighlight>


مخرجات المثال السابق هي:
مخرجات المثال السابق هي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 
 
array(4) {
array(4) {
  ["foo"]=>
  ["foo"]=>
  string(3) "bar"
  string(3) "bar"
  ["bar"]=>
  ["bar"]=>
  string(3) "foo"
  string(3) "foo"
 
  [100]=>
  [100]=>
 
  int(-100)
  int(-100)
  [-100]=>
  [-100]=>
 
  int(100)
  int(100)
 
}</syntaxhighlight>
}</syntaxhighlight>


المفتاح اختياري، وإن لم يُحدَّد فستستخدم PHP قيمة آخر أكبر مفتاح عددي وتضيف عليه.
المفتاح اختياري، وإن لم يُحدَّد فستستخدم PHP قيمة آخر أكبر مفتاح عددي وتضيف عليه.


'''المثال 4: مصفوفة مفهرسة دون مفتاح'''
المثال 4: مصفوفة مفهرسة دون مفتاح
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$array = array("foo", "bar", "hello", "world");
$array = array("foo", "bar", "hello", "world");
var_dump($array);
var_dump($array);
?>
?>
</syntaxhighlight>
</syntaxhighlight>


مخرجات المثال السابق هي:
مخرجات المثال السابق هي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 
 
array(4) {
array(4) {
  [0]=>
  [0]=>
  string(3) "foo"
  string(3) "foo"
 
  [1]=>
  [1]=>
 
  string(3) "bar"
  string(3) "bar"
 
  [2]=>
  [2]=>
 
  string(5) "hello"
  string(5) "hello"
 
  [3]=>
  [3]=>
  string(5) "world"
 
  string(5) "world"
 
}
}
</syntaxhighlight>
</syntaxhighlight>
سطر 186: سطر 125:
ومن الممكن أيضًا تحديد المفاتيح لبعض العناصر وترك البقية، كما في المثال الآتي.
ومن الممكن أيضًا تحديد المفاتيح لبعض العناصر وترك البقية، كما في المثال الآتي.


'''المثال 5: بعض العناصر لها مفاتيح فقط'''
المثال 5: تحديد المفاتيح لبعض العناصر فقط
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$array = array(
$array = array(
 
       "a",
         "a",
       "b",
 
  6 => "c",
         "b",
       "d",
 
    6 => "c",
 
         "d",
 
);
);


var_dump($array);
var_dump($array);
?>
?>
</syntaxhighlight>
</syntaxhighlight>


مخرجات المثال السابق:
مخرجات المثال السابق:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 
array(4) {
array(4) {
  [0]=>
  [0]=>
  string(1) "a"
  string(1) "a"
 
  [1]=>
  [1]=>
 
  string(1) "b"
  string(1) "b"
  [6]=>
  [6]=>
 
  string(1) "c"
  string(1) "c"
 
  [7]=>
  [7]=>
 
  string(1) "d"
  string(1) "d"
 
}
}
</syntaxhighlight>
</syntaxhighlight>


كما ترى إن القيمة الأخيرة "d" أُسنِدَت للمفتاح 7، وهذا بسبب أن أكبر مفتاح على شكل عدد صحيح هو 6.
القيمة الأخيرة "d" أُسنِدَت للمفتاح 7، وهذا بسبب أن أكبر مفتاح على شكل عدد صحيح هو 6.


=== الوصول إلى عناصر المصفوفة باستخدام صيغة القوس المربع ===
=== الوصول إلى عناصر المصفوفة باستخدام صيغة القوس المربع ===
يمكن الوصول إلى عناصر المصفوفة باستخدام صيغة <code>array[key]‎</code>.
يمكن الوصول إلى عناصر المصفوفة باستخدام صيغة <code>array[key]‎</code>.


'''المثال 6: الوصول إلى عناصر المصفوفة'''
المثال 6: الوصول إلى عناصر المصفوفة
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$array = array(
$array = array(
 
    "foo" => "bar",
    "foo" => "bar",
    42    => 24,
 
    "multi" => array(
    42    => 24,
       "dimensional" => array(
 
       "array" => "foo"
    "multi" => array(
     )
 
         "dimensional" => array(
 
             "array" => "foo"
 
         )


    )
    )
);
);


var_dump($array["foo"]);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
var_dump($array["multi"]["dimensional"]["array"]);
?>
?>
</syntaxhighlight>
</syntaxhighlight>


مخرجات المثال السابق هي:
مخرجات المثال السابق هي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 
string(3) "bar"
string(3) "bar"
int(24)
int(24)
string(3) "foo"
string(3) "foo"
</syntaxhighlight>
</syntaxhighlight>
سطر 281: سطر 187:
ملاحظة: يمكن استخدام الأقواس المربعة <code>[]</code> أو المعقوفة <code>{}</code> للوصول إلى عناصر المصفوفة (أي يمكنك استخدام <code>‎$array[42]</code>‎ أو <code>‎$array{42}</code>‎).
ملاحظة: يمكن استخدام الأقواس المربعة <code>[]</code> أو المعقوفة <code>{}</code> للوصول إلى عناصر المصفوفة (أي يمكنك استخدام <code>‎$array[42]</code>‎ أو <code>‎$array{42}</code>‎).


بدءًا من الإصدار 5.4 من PHP، أصبح بالإمكان الوصول مؤشريًا (array dereference) إلى عناصر المصفوفة المُعادة من دالة مباشرةً، ففي السابق، كان يتطلب الأمر استخدام متغيرات مؤقتة. من الإصدار 5.4، أصبح بالإمكان الوصول مؤشريًا إلى مصفوفة.
بدءًا من الإصدار 5.4 من PHP، أصبح بالإمكان الوصول مؤشريًا (array dereference) إلى عناصر المصفوفة المُعادة من دالة مباشرةً، ففي السابق، كان يتطلب الأمر استخدام متغيرات مؤقتة.  


'''المثال 7: إسناد مؤشري لمصفوفة'''
المثال 7: إسناد مؤشري لمصفوفة
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
function getArray() {
function getArray() {
 
  return array(1, 2, 3);
    return array(1, 2, 3);
 
}
}


سطر 301: سطر 203:


$tmp = getArray();
$tmp = getArray();
$secondElement = $tmp[1];
$secondElement = $tmp[1];


سطر 307: سطر 208:


list(, $secondElement) = getArray();
list(, $secondElement) = getArray();
?>
?>
</syntaxhighlight>
</syntaxhighlight>


ملاحظة: ستظهر رسالة خطأ عند محاولة الوصول إلى مفتاح مصفوفة غير معرّفة كما في حالة الوصول إلى متغير غير معرّف، إذ سيظهر خطأ من نوع <code>E_NOTICE</code> والنتيجة ستكون <code>NULL</code>.
ملاحظة: ستظهر رسالة خطأ عند محاولة الوصول إلى مفتاح مصفوفة غير معرّفة كما في حالة الوصول إلى متغير غير معرّف، إذ سيظهر خطأ من نوع <code>E_NOTICE</code> والنتيجة ستكون <code>[[PHP/null|NULL]]</code>.


ملاحظة: إذا أُسند إلى المصفوفة مؤشرات ذات قيمة عددية وليس سلسلة نصية فإنها ستنتج القيمة <code>NULL</code> بصمت، دون إصدار رسالة خطأ.
ملاحظة: إذا أُسند إلى المصفوفة مؤشرات ذات قيمة عددية وليس سلسلة نصية فإنها ستنتج القيمة <code>[[PHP/null|NULL]]</code> بصمت، دون إصدار رسالة خطأ.


=== صيغة إنشاء/تعديل المصفوفات باستخدام الأقواس المربعة ===
=== صيغة إنشاء/تعديل المصفوفات باستخدام الأقواس المربعة ===
يمكن تعديل مصفوفة من خلال تعيين قيمة إلى مصفوفة مع تحديد المفتاح بين أقواس مربعة، ويمكن أيضًا حذف المفتاح، لتكون النتيجة زوج فارغ من الأقواس المربعة <code>[]</code>.
يمكن تعديل مصفوفة من خلال تعيين قيمة إلى مصفوفة مع تحديد المفتاح بين أقواس مربعة، ويمكن أيضًا حذف المفتاح، لتكون النتيجة زوجا فارغا من الأقواس المربعة <code>[]</code>.
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$arr[key] = value;
$arr[key] = value;
$arr[] = value;
$arr[] = value;
// المفتاح هو عدد صحيح أو سلسلة نصية
// المفتاح هو عدد صحيح أو سلسلة نصية
// القيمة من أي نوع
// القيمة من أي نوع
</syntaxhighlight>
</syntaxhighlight>


ستُنشَأ المصفوفة ‎<code>$arr</code> إذا لم تكن موجودةً، وهذه طريقة أخرى لإنشاء مصفوفة لكن لا يُنصَح بها، لأنه إذا كانت المصفوفة ‎<code>$arr</code> تحتوي على بعض القيم (على سبيل المثال سلسلة نصية) فإن هذه القيمة ستبقى وستتحول هذه الصيغة إلى عملية وصول إلى عناصر السلسلة النصية بدلًا من إنشاء مصفوفة (string access operator)، ومن الأفضل دائمًا تهيئة متغير عبر عملية إسناد مباشرة.
ستُنشَأ المصفوفة ‎<code>$arr</code> إذا لم تكن موجودةً، وهذه طريقة أخرى لإنشاء مصفوفة لكن لا يُنصَح بها، لأنه إذا كانت المصفوفة ‎<code>$arr</code> تحتوي على بعض القيم (على سبيل المثال سلسلة نصية) فإن هذه القيمة ستبقى وستتحول هذه الصيغة إلى عملية وصول إلى عناصر السلسلة النصية بدلًا من إنشاء مصفوفة (string access operator)، ومن الأفضل دائمًا تهيئة متغيّر عبر عملية إسناد مباشرة.


ملاحظة: بدءًا من الإصدار 7.1.0، سيؤدي استخدام معامل الفهرس (index operator) <code>[]</code> فارغ على سلسلة نصية إلى ظهور رسالة خطأ، فكانت السلسلة النصية تتحول إلى مصفوفة فيما سبق.
ملاحظة: بدءًا من الإصدار 7.1.0، سيؤدي استخدام معامل فهرس (index operator) <code>[]</code> فارغ على سلسلة نصية إلى ظهور رسالة خطأ، فكانت السلسلة النصية تتحول إلى مصفوفة فيما سبق.


لتغيير قيمة ما من القيم الموجودة في المصفوفة فأسند قيمةً جديدةً إلى ذلك العنصر باستخدام مفتاحه، ولحذف زوج مفتاح/قيمة، فاستخدم دالة <code>[[PHP/Function/unset|unset()‎]]</code>.
لتغيير قيمة ما من القيم الموجودة في المصفوفة، أسند قيمةً جديدةً إلى ذلك العنصر باستخدام مفتاحه، ولحذف زوج مفتاح/قيمة، استخدم دالة <code>[[PHP/unset|unset()‎]]</code>.
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$arr = array(5 => 1, 12 => 2);
$arr = array(5 => 1, 12 => 2);


// هذا التعبير يشبه التعبير
// هذا التعبير يشبه التعبير
// $arr[13] = 56;
// $arr[13] = 56;
// في هذه المرحلة
// في هذه المرحلة


سطر 348: سطر 240:


// هذا التعبير سيضيف عنصرًا جديدًا إلى المصفوفة
// هذا التعبير سيضيف عنصرًا جديدًا إلى المصفوفة
// له المفتاح x
// له المفتاح x


سطر 360: سطر 251:


unset($arr); 
unset($arr); 
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>


ملاحظة: كما ذكرنا في الأعلى، إذا لم يحدد مفتاح معين، فستؤخذ قيمة أكبر مفتاح على شكل عدد صحيح، والمفتاح الجديد سيكون قيمة أكبر مفتاح + 1 (ويجب أن تكون على الأقل 0)، فإذا لم تنشئ مفاتيح بعد فستكون 0.
ملاحظة: كما ذكرنا في الأعلى، إذا لم يحدد مفتاح معين، فستؤخذ قيمة أكبر مفتاح على شكل عدد صحيح، والمفتاح الجديد سيكون قيمة أكبر مفتاح + 1 (ويجب أن تكون على الأقل 0)، فإذا لم تُنشَأ مفاتيح بعد فستكون 0.


لاحظ أن أكبر قيمة مفتاح قد لا تكون موجودة حاليًا في المصفوفة، فقد تكون موجودةً في وقتٍ سابقٍ بعد آخر عملية إعادة فهرسة للمصفوفة، فسيستمر  منها حتى بعد حذفها كما في المثال التالي:
لاحظ أن أكبر قيمة مفتاح قد لا تكون موجودة حاليًا في المصفوفة، فقد تكون موجودةً في وقتٍ سابقٍ بعد آخر عملية إعادة فهرسة للمصفوفة، فسيستمر  منها حتى بعد حذفها كما في المثال التالي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php


سطر 374: سطر 263:


$array = array(1, 2, 3, 4, 5);
$array = array(1, 2, 3, 4, 5);
print_r($array);
print_r($array);


سطر 380: سطر 268:


foreach ($array as $i => $value) {
foreach ($array as $i => $value) {
    unset($array[$i]);
    unset($array[$i]);
}
}
print_r($array);
print_r($array);


سطر 390: سطر 275:


$array[] = 6;
$array[] = 6;
print_r($array);
print_r($array);


سطر 396: سطر 280:


$array = array_values($array);
$array = array_values($array);
$array[] = 7;
$array[] = 7;
print_r($array);
print_r($array);
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>


مخرجات المثال السابق هي:
مخرجات المثال السابق هي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 


Array
Array
(
(
    [0] => 1
    [0] => 1
    [1] => 2
    [1] => 2
    [2] => 3
    [2] => 3
    [3] => 4
    [3] => 4
    [4] => 5
    [4] => 5
)
)
Array
Array
(
(
)
)
Array
Array
(
(
    [5] => 6
    [5] => 6
)
)
Array
Array
(
(
    [0] => 6
    [0] => 6
    [1] => 7
    [1] => 7
)
)
</syntaxhighlight>
</syntaxhighlight>
سطر 452: سطر 313:
هنالك عدة دوال مفيدة للتعامل مع المصفوفات، راجع قسم دوال المصفوفة.
هنالك عدة دوال مفيدة للتعامل مع المصفوفات، راجع قسم دوال المصفوفة.


ملاحظة: تسمح لك دالة <code>[[PHP/Function/unset|unset()‎]]</code> بحذف المفاتيح من مصفوفة، لكن انتبه لأن المصفوفة لن يعاد فهرستها، إذا أردت الحذف مع إعادة الفهرسة، فيمكن إعادة فهرسة المصفوفة باستخدام الدالة <code>[[PHP/array-values|array_values()‎]]</code>.
ملاحظة: تسمح لك دالة <code>[[PHP/unset|unset()‎]]</code> بحذف المفاتيح من مصفوفة، لكن انتبه لأن المصفوفة لن يعاد فهرستها، إذا أردت الحذف مع إعادة الفهرسة، فيمكن إعادة فهرسة المصفوفة باستخدام الدالة <code>[[PHP/array_values|array_values()‎]]</code>.
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
unset($a[2]);


/* ستنتج مصفوفة معرّفة كهذه
/* ستنتج مصفوفة معرّفة كهذه
   $a = array(1 => 'one', 3 => 'three');
   $a = array(1 => 'one', 3 => 'three');
   وليس
   وليس
   $a = array(1 => 'one', 2 =>'three');
   $a = array(1 => 'one', 2 =>'three');
<nowiki>*</nowiki>/
<nowiki>*</nowiki>/


سطر 474: سطر 328:


//array(0 => 'one', 1 =>'three')
//array(0 => 'one', 1 =>'three')
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>
سطر 483: سطر 336:
استعمل علامات الاقتباس حول فهرس المصفوفة دومًا، والذي يكون على شكل سلسلة نصية، أي أن الصحيح كتابة ‎<code>$foo['bar']‎</code> بدلًا من <code>‎$foo[bar]</code>‎، وربما تجد هذه الصيغة شائعةً في السكربتات القديمة:
استعمل علامات الاقتباس حول فهرس المصفوفة دومًا، والذي يكون على شكل سلسلة نصية، أي أن الصحيح كتابة ‎<code>$foo['bar']‎</code> بدلًا من <code>‎$foo[bar]</code>‎، وربما تجد هذه الصيغة شائعةً في السكربتات القديمة:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$foo[bar] = 'enemy';
$foo[bar] = 'enemy';
echo $foo[bar];
echo $foo[bar];
//...
//...
?>
?>
</syntaxhighlight>
</syntaxhighlight>


على الرغم من أن الشيفرة السابقة خطأ إلا أنها تعمل، والسبب أن هذه الشفرة البرمجية لديها [[PHP/constants|ثابت]] غير معرف وهو <code>bar</code> بدلًا من [[PHP/Types/string|السلسلة النصية]] (<code>"bar"</code> لاحظ وجود علامتَي اقتباس تحيطان بالكلمة)، وتحوّل PHP تلقائيًا السلسلة النصية الخام (التي لا تحتوي على علامات اقتباس ولا تتوافق مع أي رمز معروف) إلى سلسلة نصية تحتوي على السلسلة النصية الخام، على سبيل المثال، إذا لم يكن هنالك ثابت معرّف باسم <code>bar</code>، فإنه فسيحوّل إلى السلسلة النصية <code>"bar"</code>.
على الرغم من أن الشيفرة السابقة خطأ إلا أنها تعمل، والسبب أن هذه الشفرة البرمجية لديها [[PHP/constants|ثابت]] غير معرف وهو <code>bar</code> بدلًا من [[PHP/string|السلسلة النصية]] (<code>"bar"</code> لاحظ وجود علامتَي اقتباس تحيطان بالكلمة)، وتحوّل PHP تلقائيًا السلسلة النصية الخام (التي لا تحتوي على علامات اقتباس ولا تتوافق مع أي رمز معروف) إلى سلسلة نصية تحتوي على السلسلة النصية الخام، على سبيل المثال، إذا لم يكن هنالك ثابت معرّف باسم <code>bar</code>، فإنه فسيحوّل إلى السلسلة النصية <code>"bar"</code>.


ملاحظة: وهذا لا يعني أنه يجب وضع علامات الاقتباس دائمًا، فلا تضعها على [[PHP/constants|الثوابت]] و<nowiki/>[[PHP/Variables|المتغيرات]]، لأنَّ ذلك يمنع تفسيرها:
ملاحظة: هذا لا يعني أنه يجب وضع علامات الاقتباس دائمًا، فلا تضعها على [[PHP/constants|الثوابت]] و<nowiki/>[[PHP/variables|المتغيرات]]، لأنَّ ذلك يمنع تفسيرها:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
error_reporting(E_ALL);
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('display_errors', true);
ini_set('html_errors', false);
ini_set('html_errors', false);


سطر 511: سطر 355:


$array = array(1, 2);
$array = array(1, 2);
$count = count($array);
$count = count($array);


for ($i = 0; $i < $count; $i++) {
for ($i = 0; $i < $count; $i++) {
    echo "\nChecking $i: \n";
    echo "\nChecking $i: \n";
    echo "Bad: " . $array['$i'] . "\n";
    echo "Bad: " . $array['$i'] . "\n";
    echo "Good: " . $array[$i] . "\n";
    echo "Good: " . $array[$i] . "\n";
 
    echo "Bad: {$array['$i']}\n"; 
    echo "Bad: {$array['$i']}\n";
  echo "Good: {$array[$i]}\n";
 
    echo "Good: {$array[$i]}\n";
 
}
}
?>
?>
</syntaxhighlight>
</syntaxhighlight>


ومخرجات المثال السابق هي:
ومخرجات المثال السابق هي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 
Checking 0: 
Checking 0: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
Notice: Undefined index:  $i in /path/to/script.html on line 9
Bad: 
Bad: 
Good: 1
Good: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Notice: Undefined index:  $i in /path/to/script.html on line 11
Bad: 
Bad: 
Good: 1
Good: 1
Checking 1: 
Checking 1: 
Notice: Undefined index:  $i in /path/to/script.html on line 9
Notice: Undefined index:  $i in /path/to/script.html on line 9
Bad: 
Bad: 
Good: 2
Good: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Notice: Undefined index:  $i in /path/to/script.html on line 11
Bad: 
Bad: 
Good: 2
Good: 2
</syntaxhighlight>
</syntaxhighlight>
سطر 565: سطر 387:
المزيد من الأمثلة لتبيان هذا السلوك:
المزيد من الأمثلة لتبيان هذا السلوك:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php


سطر 571: سطر 392:


error_reporting(E_ALL);
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');


سطر 577: سطر 397:


print $arr['fruit'];  // apple
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot
print $arr['veggie']; // carrot


// خطأ.  سيعمل التعبير الآتي لكن سيظهر لك خطأ من نوع 
// خطأ.  سيعمل التعبير الآتي لكن سيظهر لك خطأ من نوع 
// E_NOTICE
// E_NOTICE
// بسبب عدم تعريف الثابت 
// بسبب عدم تعريف الثابت 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
// Notice: Use of undefined constant fruit - assumed 'fruit' in...


سطر 597: سطر 413:


print $arr['fruit'];  // apple
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot
print $arr[fruit];    // carrot


// السطر التالي صحيح لأنه داخل السلسلة النصية
// السطر التالي صحيح لأنه داخل السلسلة النصية
//فلن يبحث المفسر عن الثوابت داخل السلسلة النصية، ولن يظهر خطأ من النوع 
//فلن يبحث المفسر عن الثوابت داخل السلسلة النصية، ولن يظهر خطأ من النوع 
// E_NOTICE
// E_NOTICE


سطر 611: سطر 424:


print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple
print "Hello {$arr['fruit']}";  // Hello apple


// هذا لن يعمل وسيظهر خطأ:
// هذا لن يعمل وسيظهر خطأ:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'


print "Hello $arr['fruit']";
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
print "Hello $_GET['foo']";


سطر 625: سطر 435:


print "Hello " . $arr['fruit']; // Hello apple
print "Hello " . $arr['fruit']; // Hello apple
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>


عند تعيين قيمة <code>error_reporting</code> لإظهار الأخطاء من المستوى <code>E_NOTICE</code> (عن طريق ضبطه إلى <code>E_ALL</code> على سبيل المثال)، فستظهر الأخطاء السابقة على الفور. تذكّر أنَّ  <code>error_reporting</code> مضبوطٌ لكيلا يعرض التبيهات من النوع <code>NOTICE</code>.
عند تعيين قيمة <code>error_reporting</code> لإظهار الأخطاء من المستوى <code>E_NOTICE</code> (عن طريق ضبطه إلى <code>E_ALL</code> على سبيل المثال)، فستظهر الأخطاء السابقة على الفور. تذكّر أنَّ  <code>error_reporting</code> مضبوطٌ لكيلا يعرض التنبيهات من النوع <code>NOTICE</code>.


وكما ورد في قسم البنية العامة يجب وضع تعبير داخل الأقواس المربعة <code>[]</code>، أي أن الشيفرة البرمجية التالية ستعمل:
وكما ورد في قسم البنية العامة يجب وضع تعبير داخل الأقواس المربعة <code>[]</code>، أي أن الشيفرة البرمجية التالية ستعمل:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
echo $arr[somefunc($bar)];
echo $arr[somefunc($bar)];
?>
?>
</syntaxhighlight>
</syntaxhighlight>
سطر 645: سطر 451:
تستطيع لغة PHP تفسير الثوابت أيضًا عندما تكون ضمن أقواس:
تستطيع لغة PHP تفسير الثوابت أيضًا عندما تكون ضمن أقواس:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$error_descriptions[E_ERROR]   = "A fatal error has occurred";
$error_descriptions[E_ERROR]   = "A fatal error has occurred";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_WARNING] = "PHP issued a warning";
$error_descriptions[E_NOTICE]  = "This is just an informal notice";
$error_descriptions[E_NOTICE]  = "This is just an informal notice";
?>
?>
</syntaxhighlight>
</syntaxhighlight>
سطر 660: سطر 460:
لاحظ أن <code>E_ERROR</code> هو معرف صحيح، مثل <code>bar</code> في المثال الأول، والمثال الأخير مشابه للمثال الآتي:
لاحظ أن <code>E_ERROR</code> هو معرف صحيح، مثل <code>bar</code> في المثال الأول، والمثال الأخير مشابه للمثال الآتي:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$error_descriptions[1] = "A fatal error has occurred";
$error_descriptions[1] = "A fatal error has occurred";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
$error_descriptions[8] = "This is just an informal notice";
?>
?>
</syntaxhighlight>
</syntaxhighlight>
سطر 679: سطر 473:
في المستقبل، قد يضيف فريق PHP ثابتًا آخر أو كلمةً محجوزةً جديدةً، وقد يكون هنالك ثابت في شيفرةٍ برمجيةٍ أخرى التي قد تتداخل مع الشيفرة الحالية، على سبيل المثال من الخطأ استخدام كلمات empty و default بهذه الطريقة لأنها كلمات محجوزة.
في المستقبل، قد يضيف فريق PHP ثابتًا آخر أو كلمةً محجوزةً جديدةً، وقد يكون هنالك ثابت في شيفرةٍ برمجيةٍ أخرى التي قد تتداخل مع الشيفرة الحالية، على سبيل المثال من الخطأ استخدام كلمات empty و default بهذه الطريقة لأنها كلمات محجوزة.


ملاحظة: نُذكِّر أنَّ بالإمكان التخلي عن علامتَي الاقتباس عند محاولة الوصول إلى عناصر مصفوفة ضمن سلسلة نصية محاطة بعلامتَي اقتباس مزدوجة. أي أنَّ التعبير <code>‎"$foo[bar]"</code>‎ صحيحٌ انظر للأمثلة أعلاه للمزيد من المعلومات.
ملاحظة: نُذكِّر أنَّ بالإمكان التخلي عن علامتَي الاقتباس عند محاولة الوصول إلى عناصر مصفوفة ضمن سلسلة نصية محاطة بعلامتَي اقتباس مزدوجة. أي أنَّ التعبير <code>‎"$foo[bar]"</code>‎ صحيحٌ.
 
انظر للأمثلة أعلاه للمزيد من المعلومات.


== التحويل إلى مصفوفات ==
== التحويل إلى مصفوفات ==
سطر 688: سطر 484:
هذه القيم مرفقة ببايت فارغ (null byte) قبلها أو بعدها وقد يؤدي ذلك إلى سلوك غير متوقع في بعض الحالات:
هذه القيم مرفقة ببايت فارغ (null byte) قبلها أو بعدها وقد يؤدي ذلك إلى سلوك غير متوقع في بعض الحالات:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php


class A {
class A {
    private $A; // '\0A\0A'
    private $A; // '\0A\0A'
}
}


class B extends A {
class B extends A {
    private $A; // '\0B\0A'
    private $A; // '\0B\0A'
    public $AA; // 'AA'
    public $AA; // 'AA'
}
}


var_dump((array) new B());
var_dump((array) new B());
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>
سطر 716: سطر 504:


== المقارنة ==
== المقارنة ==
يمكنك مقارنة المصفوفات باستخدام الدالة <code>[[PHP/array-diff|array_diff()‎]]</code> إضافةً إلى [[PHP/Operators/array|معاملات المصفوفة]].
يمكنك مقارنة المصفوفات باستخدام الدالة <code>[[PHP/array_diff|array_diff()‎]]</code> إضافةً إلى [[PHP/array operators|معاملات المصفوفة]].


== أمثلة ==
== أمثلة ==
إن المصفوفات في PHP متنوعةٌ للغاية، وهذه بعض الأمثلة:
إن المصفوفات في PHP متنوعةٌ للغاية، وهذه بعض الأمثلة.


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
سطر 727: سطر 515:


$a = array( 'color' => 'red',
$a = array( 'color' => 'red',
            'taste' => 'sweet',
            'taste' => 'sweet',
            'shape' => 'round',
            'shape' => 'round',
            'name'  => 'apple',
            'name'  => 'apple',
            4        // key will be 0
            4        // key will be 0
          );
          );
$b = array('a', 'b', 'c');
$b = array('a', 'b', 'c');


سطر 743: سطر 525:


$a = array();
$a = array();
$a['color'] = 'red';
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a['name']  = 'apple';
$a[]        = 4;        // المفتاح سيكون 0
$a[]        = 4;        // المفتاح سيكون 0
$b = array();
$b = array();
$b[] = 'a';
$b[] = 'a';
$b[] = 'b';
$b[] = 'b';
$b[] = 'c';
$b[] = 'c';


سطر 765: سطر 538:


// $a:
// $a:
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 
// 'name' => 'apple', 0 => 4),
// 'name' => 'apple', 0 => 4),
// $b
// $b
// array(0 => 'a', 1 => 'b', 2 => 'c')
// array(0 => 'a', 1 => 'b', 2 => 'c')
// أو ببساطة
// أو ببساطة
// array('a', 'b', 'c').
// array('a', 'b', 'c').
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>


'''المثال 8: استخدام <code>array()‎</code>'''
المثال 9: مجموعة (Collection)<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
    echo "Do you like $color?\n";
?>




</syntaxhighlight>
المثال 10: استخدام <code>array()‎</code>
<syntaxhighlight lang="php">
<?php
<?php
// (property-)map
// (property-)map
$map = array( 'version'    => 4,
$map = array( 'version'    => 4,
              'OS'         => 'Linux',
              'OS'         => 'Linux',
              'lang'       => 'english',
              'lang'       => 'english',
              'short_tags' => true
              'short_tags' => true
            );
            );


سطر 802: سطر 571:


$array = array( 7,
$array = array( 7,
                8,
                8,
                0,
                0,
                156,
                156,
                -10
                -10
              );
              );


سطر 816: سطر 580:


// array(0 => 7, 1 => 8, ...)
// array(0 => 7, 1 => 8, ...)
$switching = array(         10, // المفتاح = 0
$switching = array(         10, // المفتاح = 0
                    5    =>  6,
                    5    =>  6,
                    3    =>  7, 
                    3    =>  7, 
                    'a'  =>  4,
                    'a'  =>  4,
                            11, // المفتاح = 6، فقد كان أكبر مفتاح على شكل صحيح يساوي 5
                            11, // المفتاح = 6، فقد كان أكبر مفتاح على شكل صحيح يساوي 5
                    '8'  =>  2, // المفتاح = 8، أي عدد صحيح
                    '8'  =>  2, // المفتاح = 8، أي عدد صحيح
                    '02' => 77, // المفتاح = '02' أي سلسلة نصية
                    '02' => 77, // المفتاح = '02' أي سلسلة نصية
                    0    => 12  // ستكون القيمة المرتبطة بالفهرس 0 هي 12 بدلًا من 10
                    0    => 12  // ستكون القيمة المرتبطة بالفهرس 0 هي 12 بدلًا من 10
                  );
                  );


سطر 838: سطر 593:


$empty = array();         
$empty = array();         
?> 
?> 


مثال 9: مجموعة (Collection)


<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
    echo "Do you like $color?\n";
}
?> 
</syntaxhighlight>
</syntaxhighlight>


'''المثال 9: المرور على العناصر باستخدام <code>[[PHP/foreach|foreach]]</code>'''<syntaxhighlight lang="php">
المثال 11: المرور على العناصر باستخدام <code>[[PHP/foreach|foreach]]</code><syntaxhighlight lang="php">
<?php
<?php
$colors = array('red', 'blue', 'green', 'yellow');
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
foreach ($colors as $color) {
     echo "Do you like $color?\n";
     echo "Do you like $color?\n";
}
}
?>
?>
</syntaxhighlight>مخرجات المثال السابق هي:<syntaxhighlight lang="php">
</syntaxhighlight>مخرجات المثال السابق هي:<syntaxhighlight lang="text">
 
 
Do you like red?
Do you like red?
Do you like blue?
Do you like blue?
Do you like green?
Do you like green?
Do you like yellow?
Do you like yellow?
</syntaxhighlight>
</syntaxhighlight>
سطر 879: سطر 614:
يمكنك تغيير قيمة مصفوفة مباشرة عن طريق التمرير بالمرجعية.
يمكنك تغيير قيمة مصفوفة مباشرة عن طريق التمرير بالمرجعية.


'''المثال 10: تغيير عنصر في الحلقة'''
المثال 12: تغيير عنصر في الحلقة
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
foreach ($colors as &$color) {
foreach ($colors as &$color) {
    $color = strtoupper($color);
    $color = strtoupper($color);
}
}
unset($color);
unset($color);
print_r($colors);
print_r($colors);
?> 
?> 


</syntaxhighlight>
</syntaxhighlight>


مخرجات المثال السابق هي:<syntaxhighlight lang="php">
مخرجات المثال السابق هي:<syntaxhighlight lang="text">
Array
Array
(
(
    [0] => RED
    [0] => RED
    [1] => BLUE
    [1] => BLUE
    [2] => GREEN
    [2] => GREEN
    [3] => YELLOW
    [3] => YELLOW
)
)


سطر 916: سطر 638:
</syntaxhighlight>هذا المثال سينشئ مصفوفة تبدأ من 1.
</syntaxhighlight>هذا المثال سينشئ مصفوفة تبدأ من 1.


'''مثال 11: مصفوفة تبدأ بالموقع الأول'''
المثال 13: مصفوفة تبدأ بالموقع الأول


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$firstquarter  = array(1 => 'January', 'February', 'March');
$firstquarter  = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
print_r($firstquarter);
?>
?>
</syntaxhighlight>
</syntaxhighlight>


مخرجات المثال السابق:
مخرجات المثال السابق:
<syntaxhighlight lang="php">
<syntaxhighlight lang="text">
 
 
Array 
Array 
(
(
    [1] => 'January'
    [1] => 'January'
    [2] => 'February'
    [2] => 'February'
    [3] => 'March'
    [3] => 'March'
)
)
</syntaxhighlight>
</syntaxhighlight>


'''المثال 12: ملء المصفوفة'''
المثال 14: ملء المصفوفة
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">


<?php
<?php
سطر 954: سطر 665:


$handle = opendir('.');
$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
while (false !== ($file = readdir($handle))) {
    $files[] = $file;
    $files[] = $file;
}
}
closedir($handle); 
closedir($handle); 
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>


المصفوفات مرتبة، ويمكن تغيير الترتيب باستخدام دوال الفرز والترتيب المختلفة يمكنك مراجعة قسم [[PHP/Function/Array|دوال المصفوفة]] للمزيد من المعلومات، يمكن أن تُستخدم الدالة <code>[[PHP/count|count()‎]]</code> عدد العناصر في المصفوفة.
المصفوفات مرتبة، ويمكن تغيير الترتيب باستخدام دوال الفرز والترتيب المختلفة يمكنك مراجعة قسم [[PHP/Array|دوال المصفوفة]] للمزيد من المعلومات، يمكن أن تُستخدم الدالة <code>[[PHP/count|count()‎]]</code> عدد العناصر في المصفوفة.


'''المثال 13: فرز مصفوفة'''
المثال 15: فرز مصفوفة
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
sort($files);
sort($files);
print_r($files);
print_r($files);
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>
سطر 982: سطر 684:
يمكن أن تتكون المصفوفة من أي شيء، بما في ذلك المصفوفات الأخرى، وهذا يتيح إنشاء مصفوفات متعددة الأبعاد ومتكررة.
يمكن أن تتكون المصفوفة من أي شيء، بما في ذلك المصفوفات الأخرى، وهذا يتيح إنشاء مصفوفات متعددة الأبعاد ومتكررة.


'''المثال 14: مصفوفات متعددة الأبعاد ومتكررة'''
المثال 16: مصفوفات متعددة الأبعاد ومتكررة
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$fruits = array ( "fruits"  => array ( "a" => "orange",
$fruits = array ( "fruits"  => array ( "a" => "orange",
                                       "b" => "banana",
                                       "b" => "banana",
                                       "c" => "apple"
                                       "c" => "apple"
                                     ),
                                     ),
                  "numbers" => array ( 1,
                  "numbers" => array ( 1,
                                       2,
                                       2,
                                       3,
                                       3,
                                       4,
                                       4,
                                       5,
                                       5,
                                       6
                                       6
                                     ),
                                     ),
                  "holes"   => array (      "first",
                  "holes"   => array (      "first",
                                       5 => "second",
                                       5 => "second",
                                            "third"
                                            "third"
                                     )
                                     )
                );
                );


سطر 1٬022: سطر 707:


echo $fruits["holes"][5];    // تطبع "second"
echo $fruits["holes"][5];    // تطبع "second"
echo $fruits["fruits"]["a"]; // تطبع "orange"
echo $fruits["fruits"]["a"]; // تطبع "orange"
unset($fruits["holes"][0]);  // تحذف "first"
unset($fruits["holes"][0]);  // تحذف "first"


سطر 1٬030: سطر 713:


$juices["apple"]["green"] = "good"; 
$juices["apple"]["green"] = "good"; 
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>
سطر 1٬036: سطر 718:
عمليات نسخ المصفوفات تتضمن نسخ القيم، يمكن استخدام معامل المرجع (reference operator) لنسخ المصفوفة بالمرجعية.
عمليات نسخ المصفوفات تتضمن نسخ القيم، يمكن استخدام معامل المرجع (reference operator) لنسخ المصفوفة بالمرجعية.
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
<?php
<?php
$arr1 = array(2, 3);
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2 = $arr1;
$arr2[] = 4; // $arr2 تغيّرت
$arr2[] = 4; // $arr2 تغيّرت
             // $arr1 هي array(2, 3)
             // $arr1 هي array(2, 3)


$arr3 = &$arr1;
$arr3 = &$arr1;
$arr3[] = 4; // $arr1 = $arr3 
$arr3[] = 4; // $arr1 = $arr3 
?> 
?> 
</syntaxhighlight>
</syntaxhighlight>

المراجعة الحالية بتاريخ 14:48، 6 يونيو 2018

المصفوفة في PHP هي خريطة (map) مرتّبة، والخريطة هي نوع ترتبط فيه القيم مع المفاتيح، ولها استخدامات عديدة، فيمكن التعامل معها كمصفوفة أو قائمة (vector) أو جدول hash (نوع من الخرائط) أو قاموس (dictionary) أو مجموعة (collection) أو مكدس (stack) أو طابور (queue) وغير ذلك، حتى أن قيم المصفوفة يمكن أن تكون مصفوفات أخرى، ممّا يسمح بإنشاء مصفوفات متعددة الأبعاد.

لن نشرح جميع هذه الأنواع في هذا التوثيق، لكن ستجد مثالًا واحدًا على الأقل لكلٍ منها.

الصياغة

إنشاء المصفوفات باستخدام array()‎

يمكن إنشاء مصفوفة باستخدام البنية array()‎، وتأخذ هذه البنية أزواجا من المفاتيح والقيم (على الشكل key => value) مفصولةً بفاصلة لتُعدّ كوسائط لهذه البنية.

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

يمكن إضافة فاصلة بعد آخر عنصر في المصفوفة اختياريًا، ولا يفضل ذلك في المصفوفات المتكونة من سطر واحد. على سبيل المثال، يفضّل كتابة array(1, 2)‎ بدلًا من (array(1, 2,‎، وبالنسبة للمصفوفات متعددة الأسطر، فمن الشائع استخدام الفاصلة الزائدة لتسهيل عملية إضافة عناصر جديدة في آخر المصفوفة.

بدءًا من الإصدار 5.4 من PHP أصبح بالإمكان استخدام صياغة قصيرة للمصفوفة، وذلك باستخدام القوسين المربعين [] بدلًا من البنية array()‎.

المثال 1: مصفوفة بسيطة

<?php
$array = array(
   "foo" => "bar",
   "bar" => "foo",
);

// بدءًا من الإصدار 5.4

$array = [
   "foo" => "bar",
   "bar" => "foo",
];
?>

المفتاح يمكن أن يكون عددًا صحيحًا أو سلسلةً نصيةً، وأما القيمة فيمكن أن تكون من أي نوع.

يحوّل المفتاح قسريًا (أي تُجرى عليه عملية cast) في الحالات التالية:

  • السلاسل النصية التي تحتوي على أعداد صحيحة عشرية صالحة، ما لم يسبق الرقم بعلامة + فإنه سيحوّل إلى نوع عدد صحيح، على سبيل المثال المفتاح "8" سيخزّن على شكل 8، ومن ناحية أخرى فإن "08" لن يحوّل لأنه ليس عددًا صحيحًا عشريًا صالحًا.
  • ستحوّل الأعداد العشرية (float) إلى أعداد صحيحة أيضًا، وهذا معناه أنه سيقتطع الجزء الذي يأتي بعد الفاصلة، فعلى سبيل المثال ستُخزَّن القيمة التي لها المفتاح  8.7 في المفتاح 8.
  • ستحوّل القيم المنطقية إلى أعداد صحيحة أيضًا، فعلى سبيل المثال، المفتاح true سيخزّن على شكل 1 والمفتاح false سيخزّن على شكل 0.
  • أما القيمة Null فستحوّل إلى سلسلة نصية فارغة، على سبيل المثال المفتاح null سيخزّن على شكل "".
  • لا يمكن استخدام المصفوفات والكائنات كمفاتيح، وسيظهر لك تحذير عند استخدامها (warning: Illegal offset type).

إذا كان هنالك عناصر في المصفوفة تمتلك نفس المفتاح، فسيستخدم المفتاح الأخير فقط وسيكتب فوق العناصر الأخرى.

المثال 2: تحويل النوع والكتابة فوق العناصر

<?php
$array = array(
    1    => "a",
   "1"  => "b",
   1.5  => "c",
   true => "d",
);

var_dump($array);
?>

مخرجات المثال السابق هي:

array(1) {
  [1]=>
  string(1) "d"
}

جميع المفاتيح في المثال السابق حُوِّلَت إلى 1، وسيُكتَب فوق قيم العناصر الجديدة (التي لها مفاتيح مكررة) وستبقى القيمة "d" الأخيرة مرتبطةً بالمفتاح 1.

يمكن للمصفوفات في PHP أن تحتوي على مفاتيح نصيّة أو عددية في نفس الوقت؛ ذلك لأنَّ لغة PHP لا تميز بين المصفوفات المفهرسة (indexed) والترابطية (associative).

المثال 3: استخدام مفاتيح نصيّة وعددية

<?php
$array = array(
   "foo" => "bar",
   "bar" => "foo",
   100   => -100,
   -100  => 100,
);

var_dump($array);
?>

مخرجات المثال السابق هي:

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

المفتاح اختياري، وإن لم يُحدَّد فستستخدم PHP قيمة آخر أكبر مفتاح عددي وتضيف عليه.

المثال 4: مصفوفة مفهرسة دون مفتاح

<?php
$array = array("foo", "bar", "hello", "world");
var_dump($array);
?>

مخرجات المثال السابق هي:

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}

ومن الممكن أيضًا تحديد المفاتيح لبعض العناصر وترك البقية، كما في المثال الآتي.

المثال 5: تحديد المفاتيح لبعض العناصر فقط

<?php
$array = array(
        "a",
        "b",
   6 => "c",
        "d",
);

var_dump($array);
?>

مخرجات المثال السابق:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

القيمة الأخيرة "d" أُسنِدَت للمفتاح 7، وهذا بسبب أن أكبر مفتاح على شكل عدد صحيح هو 6.

الوصول إلى عناصر المصفوفة باستخدام صيغة القوس المربع

يمكن الوصول إلى عناصر المصفوفة باستخدام صيغة array[key]‎.

المثال 6: الوصول إلى عناصر المصفوفة

<?php
$array = array(
    "foo" => "bar",
    42    => 24,
    "multi" => array(
       "dimensional" => array(
        "array" => "foo"
      )

    )
);

var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

مخرجات المثال السابق هي:

string(3) "bar"
int(24)
string(3) "foo"

ملاحظة: يمكن استخدام الأقواس المربعة [] أو المعقوفة {} للوصول إلى عناصر المصفوفة (أي يمكنك استخدام ‎$array[42]‎ أو ‎$array{42}‎).

بدءًا من الإصدار 5.4 من PHP، أصبح بالإمكان الوصول مؤشريًا (array dereference) إلى عناصر المصفوفة المُعادة من دالة مباشرةً، ففي السابق، كان يتطلب الأمر استخدام متغيرات مؤقتة.

المثال 7: إسناد مؤشري لمصفوفة

<?php
function getArray() {
  return array(1, 2, 3);
}

// PHP 5.4

$secondElement = getArray()[1];

// سابقًا

$tmp = getArray();
$secondElement = $tmp[1];

// أو

list(, $secondElement) = getArray();
?>

ملاحظة: ستظهر رسالة خطأ عند محاولة الوصول إلى مفتاح مصفوفة غير معرّفة كما في حالة الوصول إلى متغير غير معرّف، إذ سيظهر خطأ من نوع E_NOTICE والنتيجة ستكون NULL.

ملاحظة: إذا أُسند إلى المصفوفة مؤشرات ذات قيمة عددية وليس سلسلة نصية فإنها ستنتج القيمة NULL بصمت، دون إصدار رسالة خطأ.

صيغة إنشاء/تعديل المصفوفات باستخدام الأقواس المربعة

يمكن تعديل مصفوفة من خلال تعيين قيمة إلى مصفوفة مع تحديد المفتاح بين أقواس مربعة، ويمكن أيضًا حذف المفتاح، لتكون النتيجة زوجا فارغا من الأقواس المربعة [].

$arr[key] = value;
$arr[] = value;
// المفتاح هو عدد صحيح أو سلسلة نصية
// القيمة من أي نوع

ستُنشَأ المصفوفة ‎$arr إذا لم تكن موجودةً، وهذه طريقة أخرى لإنشاء مصفوفة لكن لا يُنصَح بها، لأنه إذا كانت المصفوفة ‎$arr تحتوي على بعض القيم (على سبيل المثال سلسلة نصية) فإن هذه القيمة ستبقى وستتحول هذه الصيغة إلى عملية وصول إلى عناصر السلسلة النصية بدلًا من إنشاء مصفوفة (string access operator)، ومن الأفضل دائمًا تهيئة متغيّر عبر عملية إسناد مباشرة.

ملاحظة: بدءًا من الإصدار 7.1.0، سيؤدي استخدام معامل فهرس (index operator) [] فارغ على سلسلة نصية إلى ظهور رسالة خطأ، فكانت السلسلة النصية تتحول إلى مصفوفة فيما سبق.

لتغيير قيمة ما من القيم الموجودة في المصفوفة، أسند قيمةً جديدةً إلى ذلك العنصر باستخدام مفتاحه، ولحذف زوج مفتاح/قيمة، استخدم دالة unset()‎.

<?php
$arr = array(5 => 1, 12 => 2);

// هذا التعبير يشبه التعبير
// $arr[13] = 56;
// في هذه المرحلة

$arr[] = 56;

// هذا التعبير سيضيف عنصرًا جديدًا إلى المصفوفة
// له المفتاح x

$arr["x"] = 42;

// هذا التعبير سيحدف عنصرًا من المصفوفة

unset($arr[5]);

// أما هذا التعبير فسيحدث المصفوفة كلها

unset($arr); 
?> 

ملاحظة: كما ذكرنا في الأعلى، إذا لم يحدد مفتاح معين، فستؤخذ قيمة أكبر مفتاح على شكل عدد صحيح، والمفتاح الجديد سيكون قيمة أكبر مفتاح + 1 (ويجب أن تكون على الأقل 0)، فإذا لم تُنشَأ مفاتيح بعد فستكون 0.

لاحظ أن أكبر قيمة مفتاح قد لا تكون موجودة حاليًا في المصفوفة، فقد تكون موجودةً في وقتٍ سابقٍ بعد آخر عملية إعادة فهرسة للمصفوفة، فسيستمر  منها حتى بعد حذفها كما في المثال التالي:

<?php

// إنشاء مصفوفة بسيطة.

$array = array(1, 2, 3, 4, 5);
print_r($array);

// حذف جميع العناصر دون تغيير خصائص المصفوفة

foreach ($array as $i => $value) {
    unset($array[$i]);
}
print_r($array);

// إضافة عنصر،لاحظ أن المفتاح الجديد هو 5 بدلًا من 0

$array[] = 6;
print_r($array);

// إعادة الفهرسة

$array = array_values($array);
$array[] = 7;
print_r($array);
?> 

مخرجات المثال السابق هي:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

دوال مفيدة

هنالك عدة دوال مفيدة للتعامل مع المصفوفات، راجع قسم دوال المصفوفة.

ملاحظة: تسمح لك دالة unset()‎ بحذف المفاتيح من مصفوفة، لكن انتبه لأن المصفوفة لن يعاد فهرستها، إذا أردت الحذف مع إعادة الفهرسة، فيمكن إعادة فهرسة المصفوفة باستخدام الدالة array_values()‎.

<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);

/* ستنتج مصفوفة معرّفة كهذه
   $a = array(1 => 'one', 3 => 'three');
   وليس
   $a = array(1 => 'one', 2 =>'three');
<nowiki>*</nowiki>/

$b = array_values($a);

//array(0 => 'one', 1 =>'three')
?> 

تستخدم بنية foreach خصيصًا للمصفوفات، فهي توفِّر طريقةً سهلةً للتكرار داخل المصفوفة.

لا تستعمل الصيغة ‎$foo[bar]‎

استعمل علامات الاقتباس حول فهرس المصفوفة دومًا، والذي يكون على شكل سلسلة نصية، أي أن الصحيح كتابة ‎$foo['bar']‎ بدلًا من ‎$foo[bar]‎، وربما تجد هذه الصيغة شائعةً في السكربتات القديمة:

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
//...
?>

على الرغم من أن الشيفرة السابقة خطأ إلا أنها تعمل، والسبب أن هذه الشفرة البرمجية لديها ثابت غير معرف وهو bar بدلًا من السلسلة النصية ("bar" لاحظ وجود علامتَي اقتباس تحيطان بالكلمة)، وتحوّل PHP تلقائيًا السلسلة النصية الخام (التي لا تحتوي على علامات اقتباس ولا تتوافق مع أي رمز معروف) إلى سلسلة نصية تحتوي على السلسلة النصية الخام، على سبيل المثال، إذا لم يكن هنالك ثابت معرّف باسم bar، فإنه فسيحوّل إلى السلسلة النصية "bar".

ملاحظة: هذا لا يعني أنه يجب وضع علامات الاقتباس دائمًا، فلا تضعها على الثوابت والمتغيرات، لأنَّ ذلك يمنع تفسيرها:

<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);

// مصفوفة بسيطة

$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";
}
?>

ومخرجات المثال السابق هي:

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

// إظهار جميع الأخطاء

error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');

// صحيح

print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// خطأ.  سيعمل التعبير الآتي لكن سيظهر لك خطأ من نوع 
// E_NOTICE
// بسبب عدم تعريف الثابت 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...

print $arr[fruit];    // apple

// سنعرف ثابتًا لإظهار ما يحدث.

define('fruit', 'veggie');

// لاحظ الفرق الآن

print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// السطر التالي صحيح لأنه داخل السلسلة النصية
//فلن يبحث المفسر عن الثوابت داخل السلسلة النصية، ولن يظهر خطأ من النوع 
// E_NOTICE

print "Hello $arr[fruit]";      // Hello apple

// مع استثناء واحد: تسمح الأقواس المعقوفة المحيطة بالمصفوفة داخل السلاسل النصية بتفسير الثوابت.

print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// هذا لن يعمل وسيظهر خطأ:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'

print "Hello $arr['fruit']";
print "Hello $_GET['foo']";

// من الخيارات الأخرى: دمج السلاسل النصية

print "Hello " . $arr['fruit']; // Hello apple
?> 

عند تعيين قيمة error_reporting لإظهار الأخطاء من المستوى E_NOTICE (عن طريق ضبطه إلى E_ALL على سبيل المثال)، فستظهر الأخطاء السابقة على الفور. تذكّر أنَّ  error_reporting مضبوطٌ لكيلا يعرض التنبيهات من النوع NOTICE.

وكما ورد في قسم البنية العامة يجب وضع تعبير داخل الأقواس المربعة []، أي أن الشيفرة البرمجية التالية ستعمل:

<?php
echo $arr[somefunc($bar)];
?>

استخدمنا القيمة المُعادة من دالة كفهرس للمصفوفة في المثال السابق.

تستطيع لغة PHP تفسير الثوابت أيضًا عندما تكون ضمن أقواس:

<?php
$error_descriptions[E_ERROR]   = "A fatal error has occurred";
$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 occurred";
$error_descriptions[2] = "PHP issued a warning";
$error_descriptions[8] = "This is just an informal notice";
?>

ذلك لأنَّ E_ERROR تساوي 1، …

لماذا هذا سيء إذا؟

في المستقبل، قد يضيف فريق PHP ثابتًا آخر أو كلمةً محجوزةً جديدةً، وقد يكون هنالك ثابت في شيفرةٍ برمجيةٍ أخرى التي قد تتداخل مع الشيفرة الحالية، على سبيل المثال من الخطأ استخدام كلمات empty و default بهذه الطريقة لأنها كلمات محجوزة.

ملاحظة: نُذكِّر أنَّ بالإمكان التخلي عن علامتَي الاقتباس عند محاولة الوصول إلى عناصر مصفوفة ضمن سلسلة نصية محاطة بعلامتَي اقتباس مزدوجة. أي أنَّ التعبير ‎"$foo[bar]"‎ صحيحٌ.

انظر للأمثلة أعلاه للمزيد من المعلومات.

التحويل إلى مصفوفات

إن نتيجة تحويل كل من الأعداد الصحيحة والأعداد العشرية والسلاسل النصية و القيم المنطقية والموارد هي مصفوفة ذاتُ عنصرٍ وحيدٍ في الموقع الأول (أي الفهرس 0) مع القيمة الأولية التي تم تحويلها، أي بعبارة أخرى، إن ‎(array) $scalarValue هي نفسها array($scalarValue)‎.

إن نتيجة تحويل كائن إلى مصفوفة هي مصفوفة متكونة من خاصيات الكائن، إذ إنَّ المفاتيح هي أسماء المتغيرات الأعضاء التابعة للكائن، لكن هنالك بعض الاستثناءات البارزة: لا يمكن الوصول إلى الخاصيات العددية وستُسبَق أسماء المتغيرات الخاصة باسم الصنف، وأسماء المتغيرات المحمية ستكون مسبقةً بالرمز"*".

هذه القيم مرفقة ببايت فارغ (null byte) قبلها أو بعدها وقد يؤدي ذلك إلى سلوك غير متوقع في بعض الحالات:

<?php

class A {
    private $A; // '\0A\0A'
}

class B extends A {
    private $A; // '\0B\0A'
    public $AA; // 'AA'
}

var_dump((array) new B());
?> 

سيبدو لك أنه سيكون هنالك مفتاحان باسم "AA"، لكن في الحقيقة ستجد أن واحدًا منهما يدعى "‎\0A\0A".

إذا جرّبنا تحويل NULL إلى مصفوفة فستكون النتيجة هي مصفوفة فارغة.

المقارنة

يمكنك مقارنة المصفوفات باستخدام الدالة array_diff()‎ إضافةً إلى معاملات المصفوفة.

أمثلة

إن المصفوفات في PHP متنوعةٌ للغاية، وهذه بعض الأمثلة.

<?php

// الشيفرة الآتية

$a = array( 'color' => 'red',
            'taste' => 'sweet',
            'shape' => 'round',
            'name'  => 'apple',
            4        // key will be 0
          );
$b = array('a', 'b', 'c');

// تماثل ما يلي

$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // المفتاح سيكون 0
$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';

// بعد تنفيذ الشيفرة البرمجية السابقة، ستصبح المصفوفة كما يلي

// $a:
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 
// 'name' => 'apple', 0 => 4),
// $b
// array(0 => 'a', 1 => 'b', 2 => 'c')
// أو ببساطة
// array('a', 'b', 'c').
?> 

المثال 9: مجموعة (Collection)

<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
    echo "Do you like $color?\n";
} 
?>

المثال 10: استخدام array()‎

<?php
// (property-)map
$map = array( 'version'    => 4,
              'OS'         => 'Linux',
              'lang'       => 'english',
              'short_tags' => true
            );

// مصفوفة ذات مفاتيح رقمية

$array = array( 7,
                8,
                0,
                156,
                -10
              );

// ما سبق يكافئ

// array(0 => 7, 1 => 8, ...)
$switching = array(         10, // المفتاح = 0
                    5    =>  6,
                    3    =>  7, 
                    'a'  =>  4,
                            11, // المفتاح = 6، فقد كان أكبر مفتاح على شكل صحيح يساوي 5
                    '8'  =>  2, // المفتاح = 8، أي عدد صحيح
                    '02' => 77, // المفتاح = '02' أي سلسلة نصية
                    0    => 12  // ستكون القيمة المرتبطة بالفهرس 0 هي 12 بدلًا من 10
                  );

// مصفوفة فارغة

$empty = array();         
?> 

المثال 11: المرور على العناصر باستخدام foreach

<?php
$colors = array('red', 'blue', 'green', 'yellow');
foreach ($colors as $color) {
    echo "Do you like $color?\n";
}
?>

مخرجات المثال السابق هي:

Do you like red?
Do you like blue?
Do you like green?
Do you like yellow?

يمكنك تغيير قيمة مصفوفة مباشرة عن طريق التمرير بالمرجعية.

المثال 12: تغيير عنصر في الحلقة

<?php
foreach ($colors as &$color) {
    $color = strtoupper($color);
}
unset($color);
print_r($colors);
?> 

مخرجات المثال السابق هي:

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

هذا المثال سينشئ مصفوفة تبدأ من 1.

المثال 13: مصفوفة تبدأ بالموقع الأول

<?php
$firstquarter  = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>

مخرجات المثال السابق:

Array 
(
    [1] => 'January'
    [2] => 'February'
    [3] => 'March'
)

المثال 14: ملء المصفوفة

<?php

// ملء المصفوفة بالعناصر من المجلد

$handle = opendir('.');
while (false !== ($file = readdir($handle))) {
    $files[] = $file;
}
closedir($handle); 
?> 

المصفوفات مرتبة، ويمكن تغيير الترتيب باستخدام دوال الفرز والترتيب المختلفة يمكنك مراجعة قسم دوال المصفوفة للمزيد من المعلومات، يمكن أن تُستخدم الدالة count()‎ عدد العناصر في المصفوفة.

المثال 15: فرز مصفوفة

<?php
sort($files);
print_r($files);
?> 

يمكن أن تتكون المصفوفة من أي شيء، بما في ذلك المصفوفات الأخرى، وهذا يتيح إنشاء مصفوفات متعددة الأبعاد ومتكررة.

المثال 16: مصفوفات متعددة الأبعاد ومتكررة

<?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"
                                     )
                );

// بعض الأمثلة لعناوين القيم في المصفوفة أعلاه 

echo $fruits["holes"][5];    // تطبع "second"
echo $fruits["fruits"]["a"]; // تطبع "orange"
unset($fruits["holes"][0]);  // تحذف "first"

// إنشاء مصفوفة جديدة متعددة الأبعاد

$juices["apple"]["green"] = "good"; 
?> 

عمليات نسخ المصفوفات تتضمن نسخ القيم، يمكن استخدام معامل المرجع (reference operator) لنسخ المصفوفة بالمرجعية.

<?php
$arr1 = array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 تغيّرت
             // $arr1 هي array(2, 3)

$arr3 = &$arr1;
$arr3[] = 4; // $arr1 = $arr3 
?> 

مصادر