وظيفة foreach as
تستخدم ( PHP FOREACH AS ) لعمل التكرار looping داخل المصفوفات, بحيث تقوم بالمرور علي عناصر المصفوفة وتطبيق عملية معينة علي كل منها. وتبدأ عملية التكرار من أول قيمة وتنتهي عند آخر قيمة داخل المصفوفة بشكل تلقائي, لذا ليس عليك معرفة كم مرة تتم عملية التكرار looping .
صيغة كتابة foreach as <?php foreach($array as $value) { // code here } ?>حيث يكون:
1- array$ هو اسم المتغير الذي قمت بتخصيص المصفوفة له
2- value$ هو متغير تختاره حسب رغبتك ويتم تخصيص قيم المصفوفة لهذا المتغير
نفترض أننا نريد طباعة الـ Index الخاص بمصفوفة معينة, وكما نعلم أن الفهرس يبدأ من 0 لكن لا نعلم أين نهايته. أنظر المصفوفة التالية
$paper = array("Copier", "Inkjet", "Laser", "Photo");ونريد أن نحصل على النتيجة التالية
0: Copier
1: Inkjet
2: Laser
3: Photo
وللحصول على هذه النتيجة يجب عمل عمليتين تكرار , واحدة لبدء الترقيم (الفهرسة index) والثانية تبدأ بتخصيص أول قيمة داخل المصفوفة إلى متغير وطباعته ثم تستمر حتى آخر قيمة.
<?php $paper = array("Copier", "Inkjet", "Laser", "Photo"); $j = 0; foreach($paper as $item) { echo "$j: $item<br>"; ++$j; } ?>شرح الكود
1- في السطر رقم 2 قمنا بعمل مصفوفة ( PHP ARRAY ) وخصصناها للمتغير paper$.
2- كما نعلم أن فهرسة المصفوفات دائماً تبدأ بالرقم 0 لأول عنصر في المصفوفة لذلك في السطر رقم 3 قمنا بتعريف متغير j$ وخصصنا له القيمة (0) باستخدام معامل ( PHP OPERATORS ) التخصيص (=) حتي يتم بدء العداد Counter باستخدام هذه القيمة.
3- في السطر رقم 4 بدأنا جملة التكرار ( PHP FOREACH AS ), بحيث نقول أن كل قيمة داخل المصفوفة paper$ يتم تخصيصها للمتغير item$ , وبالتالي يتم تطبيق الكود الموجود بين { } على القيمة الأولي ثم الثانية وهكذا.
[highlight background=”” color=””]اسم المتغير item$ اختياري يمكنك تغيره إن شئت[/highlight]
تسلسل الإجراءات
4- عند بدء تنفيذ الكود كما يظهر في السطر رقم 6 يتم بطباعة قيمة المتغير j$ وهي 0 تليها طباعة قيمة المتغير item$ والتي ستكون أول قيمة في المصفوفة “Copier”. لأن ( PHP FOREACH AS ) تأخذ أول قيمة في المصفوفة paper$ ثم تخصصها للمتغير item$ ثم يتم تنفيذا الكود. بعد تنفيذ الكود يتم تخصيص القيمة الثانية للمتغير item$ ثم تنفيذ الكود مرة أخرى وهكذا.
5- لكن جملة ( PHP FOREACH AS ) تقوم بالتكرار داخل المصفوفة فقط , بينما نريد قيمة المتغير j$ تزداد في كلة مرة يتم تنفيذ الكود وهذا لا يمكن عمله إلا باستخدام معامل الزيادة (++) . لذلك قمنا بتطبيق المعامل على المتغير j$ في السطر رقم 7.
ثم تنتهي أول حلقة loop من جملة ( PHP FOREACH AS ) وتبدأ الحلقة الثانية بطباعة القيمة الجديدة للمتغير j$ متبوعاً بالقيمةالجديدة للمتغير item$ وهي ثاني قيمة في المصفوفة. ويتم تكرار الحلقات حتي تنتهي قيم المصفوفة.
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_functions/foreach_as/foreach_as.php” target=”_blank” size=”” color=”” class=””]
وللعلم لا يتم تغير الصفوفة الرئيسية عند استخدام foreach as . لأنك فقط تقوم بتطبيق بتطبيق كود معين على كل عنص من عناصر المصفوفة للاستفادة منه منفصلاً. وكمثال على ذلك لاح الكود التالي
<?php $names = array( "Mohamed", "Ahmed", "Mahmoud" ); foreach ( $names as $name) { $name = strtoupper( $name ); echo $name.'<br>'; } echo "<pre>"; print_r( $names ); echo "</pre>"; ?>شرح الكود :
1 – في السطر رقم 2 قمنا بتعريف مصفوفة names$ تحتوي على مجموعة من الأسماء تبدأ بالأحرف الكبيرة
2 – في السطر رقم 3 طبقنا جملة foreach as على المصفوفة لتقوم بتنفيذ الدالة ()strtoupper والتي تستخدم لتحويل حالة جميع الأحرف للأحرف الكبيرة كما يظهر في السطر رقم 4
3 – في السطر رقم 5 قمنا بطباعة قيمة المتغير name$ .
في هذه الحالة تقوم foreach بتطبيق دالة ()strtoupper على القيمة الأولى في المصفوفة ثم طباعتها , ثم تنتقل للقيمة الثانية ثم الثالثة.
4 – لكن عند تطبيق دالة ()print_r على الدالة الأصلية ستظهر الأسماء بحالتها العادية . مما يدل على أن foreach لم تؤثر على قيم المصفوفة الأصلية.
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_functions/foreach_as/foreach_as_original_array.php” target=”_blank” size=”” color=”” class=””]
استخدام foreach مع المصفوفات الترابطيةكما نعلم أن المصفوفة الترابطية ( PHP Associative Array ) يتم تعريفها بهذا الشكل
<?php $variable= array('key'=> "value") ;?>وبالتالي يتم كتابة جملة ( PHP FOREACH AS ) للمصفوفات الترابطية بهذا الشكل
<?php foreach($paper as $item => $description) { // code here } ?>بحيث تكون paper$ هي variable$, وتكون item$ هي key , وتكون description$ هي value
[highlight background=”” color=””]اسماء المتغيرات اختيارية يمكنك تغيرها إن شئت[/highlight]
أنظر الكود التالي
<?php $paper = array('copier' => "Copier & Multipurpose", 'inkjet' => "Inkjet Printer", 'laser' => "Laser Printer", 'photo' => "Photographic Paper"); foreach($paper as $Akey => $Avalue) echo "$Akey: $Avalue<br>"; ?>شرح الكود
1- في السطر رقم 2 تم عمل المصفوفة وتخصيصها للمتغير paper$
2- في السطر رقم 6 تم بدء جملة ( PHP FOREACH AS ) بحيث سيتم تخصيص كل مفتاح key داخل المصفوفة إلي المتغير Akey$ , وكل قيمة value إلى المتغير Avalue$
3- في السطر رقم 7 طلب طباعة المفتاح الأول متبوعاً بالقيمة المخصصة له فتكون النتيجة هي copier: Copier & Multipurpose.
ثم يتم التكرار لكل key/value داخل المصفوفة حتي يتم الانتهاء من أخر قيمة في المصفوفة.
[highlight background=”” color=””]لاحظ عدم استخدام الأقواس المجعدة { } في جملة ( PHP FOREACH AS ) لأنه لا يوجد غير سطر برمجي فقط[/highlight]
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_functions/foreach_as/foreach_as_associative_array.php” target=”_blank” size=”” color=”” class=””]
استخدام foreach مع المصفوفة متعددة الأبعادنعلم أن المصفوفة متعددة الأبعاد Multidimensional Arrays هي عبارة عن مصفوفات متداخلة, بحيث كل مصفوفة تعتبر بذاتها قيمة Value . أنظر الكود التالي
<?php $products = array( 'paper' => array( 'copier' => "Copier & Multipurpose", 'inkjet' => "Inkjet Printer", 'laser' => "Laser Printer", 'photo' => "Photographic Paper"), 'pens' => array( 'ball' => "Ball Point", 'hilite' => "Highlighters", 'marker' => "Markers"), 'misc' => array( 'tape' => "Sticky Tape", 'glue' => "Adhesives", 'clips' => "Paperclips") ); foreach($products as $section => $items) foreach($items as $key => $value) echo "$section:\t$key\t($value)<br>"; ?>في الكود السابق
1- تعريف مصفوفة مترابطة وتخصيصها للمتغير products$
2- إضافة محتويات المصفوفة علي هيئة key/value بحيث يكون الـ key هو (paper-pens-misc) والـ value لكل مفتاح عبارة عن مصفوفة داخلية تحتوي علي مجموعة من القيم .
3- ثم نبدأ في السطر رقم 17 بعمل تكرار looping يبدأ بتخصيص كل مفتاح داخل المصفوفة products$ إلى section$ وكل قيمة إلي items$.
4- بالتالي في كل مرة يتم التكرار تصبح قيمة المتغير section# إما (paper-pens-misc) ويصبح المتغير items$ هو المصفوفة المقابلة لأي من (paper-pens-misc) حسب التي يتم تخصيصها للمتغير section$ .
لكن نحن نريد تطبيق كود على القيم داخل المصفوفات الداخلية , لذلك بعد أن تم تخصيص هذه المصفوفات إلى المتغير item$ فيمكننا أيضا تطبيق جملة ( PHP FOREACH AS ) عليها هي الأخرى.
5- في السطر رقم 18 نقوم ببدء التكرار داخل المصفوفة items$ بحيث يتم تخصيص كل مفتاح key إلى المتغير key$ وكل قيمة value للمتغير value$
6- يتم تكرار تطبيق السطر رقم 19 علي كل key/value بحيث يقوم بطباعة section$ التي تعبر عن مفتاح المصفوفة الأساسية products$ , ثم طباعة المفتاح للمصفوفة الداخلية key$ متبوعاً بقيمة المفتاح وهي value$ حتى ينتهي من أخر قيمة داخل المصفوفة الأولي , ثم ينتقل للمصفوفة الثانية المخصصة للقيمة الثانية إلي أن ينتهي منها ثم ينتقل للثالثة.
[button title=”عرض نتيجة الكود” link=”https://makiomar.com/php_functions/foreach_as/foreach_as_multi_array.php” target=”_blank” size=”” color=”” class=””]
بالطبع يمكنك الوصول لأي عنصر داخل أي مصفوفة باستخدام الأقواس المربعة square brackets
echo $products['misc']['glue'];والتي ستقوم بطباعة adhesives
ويمكن التعامل بنفس المنطق مع المصفوفات المفهرسة رقمياً. ولتوضيح ذلك نفترض أن هناك مصفوفة تم تخصيصها للمتغير test$ وتم إضافة مصفوفات داخلية وكل مصفوفة تحتوي علي مجموعة من الأحرف , أنظر الكود التالي
<?php $test = array( array('r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'), array('p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array(' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '), array('P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'), array('R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R') ); echo "<pre>"; foreach($test as $row) { foreach ($row as $letter) echo "$letter "; echo "<br>"; } echo "</pre>"; ?>يتضح من تركيب المصفوفات أنها مصفوفات رقمية وتعلمنا طريقة استخدام ( PHP FOREACH AS ) مع هذا النوع من المصفوفات. فكما يظهر في السطر رقم 13 أنه مطلوب عمل تكرار داخل المصفوفة test$ بحيث يتم تخصيص كل قيمة داخلها إلي المتغير row$.
يصبح المتغير row$ بذاته مصفوفة رقمية أخري, فنقوم في السطر رقم 15 بعمل التكرار باستخدام ( PHP FOREACH AS ) متداخلة بحيث يتم تخصيص كل قيمة داخل المصفوفة row$ إلى المتغير letter$.
ثم نطلب طباعة قيمة المتغير letter$ فيقوم بطباعة كل حرف في المصفوفة الأولى إلى أن ينتهي منها ثم ينتقل للمصفوفة التي تليها.
[highlight background=”” color=””]لاحظ استخدام الأقواس المجعدة { } في جملة ( PHP FOREACH AS ) لوجود أكثر من سطر برمجي[/highlight]
بالطبع يمكنك الوصول لأي عنصر داخل أي مصفوفة باستخدام الأقواس المربعة square brackets
echo $test[7][3];والتي ستقوم بطباعة القيمة الرابعة من المصفوفة الثامنة وهي Q لأننا نعلم أن المصفوفات الرقمية تبدأ بالرقم المفهرس 0 ,وبالتالي يتم الإشارة للقيمة الرابعة بالرقم 3 والثامنة بالرقم 7.