مقدمة: السؤال الأبدي عن foreach والفهرس
\n\nإذا سبق لك البرمجة بلغة PHP، فبالتأكيد واجهت موقفًا تحتاج فيه ليس فقط إلى تكرار عناصر المصفوفة، بل أيضًا إلى معرفة الرقم الترتيبي للتكرار الحالي. قد يبدو الأمر بسيطًا، لكن هذا السؤال بالتحديد — "How to find the foreach index?" — يحصد آلاف المشاهدات على Stack Overflow. وليس من دون سبب!
\n\nفي عام 2025، بينما تواصل PHP تطورها وتزداد المشاريع تعقيدًا، فإن فهم كيفية التعامل الصحيح مع الفهارس في حلقة foreach لم يعد مجرد رفاهية، بل ضرورة ملحة. تعتمد على ذلك سهولة قراءة الكود، وأداؤه، ومدى سهولة صيانته من قبل زميلك (أو حتى أنت بعد ستة أشهر).
في هذا المقال، سنستعرض ثلاث طرق مثبتة للحصول على فهرس العنصر في foreach، وسنقدم أمثلة كود واقعية، ونناقش الأخطاء الشائعة، ونقدم توصيات يمكنك تطبيقها اليوم. هيا بنا!
الطريقة الأولى: استخدام مفاتيح المصفوفة (الأكثر أناقة)
\n\nأبسط وأكثر الطرق "أصالة" في PHP هي استخدام الصيغة foreach ($array as $key => $value). لا تتطلب هذه الطريقة متغيرات إضافية أو دوال، وتعمل مع أي مصفوفة، سواء كانت قوائم بمفاتيح رقمية أو مصفوفات ترابطية.
كيف تعمل؟
\nتخيل أن لديك مصفوفة من المستخدمين:
\n\n<?php\n$users = ['أحمد', 'سارة', 'خالد', 'نورة'];\n\nforeach ($users as $index => $name) {\n echo "المستخدم #{$index}: {$name}<br>";\n}\n?>\n\nالنتيجة ستكون:
\nالمستخدم #0: أحمد\nالمستخدم #1: سارة\nالمستخدم #2: خالد\nالمستخدم #3: نورة\n\nلاحظ أن $index ليس مجرد عداد. إنه المفتاح الحقيقي للمصفوفة. إذا كانت المصفوفة تحتوي على مفاتيح غير قياسية (مثل النصية)، فإن $index سيحتوي عليها تمامًا.
متى تستخدم هذه الطريقة؟
\n- \n
- دائمًا عندما يكون ذلك ممكنًا. هذه هي الطريقة الأكثر قابلية للقراءة والأعلى أداءً. \n
- عندما لا تحتاج إلى إعادة تعيين العداد أو التحكم فيه يدويًا. \n
- لجميع أنواع المصفوفات: سواء كانت قوائم أو مصفوفات ترابطية. \n
المأزق الشائع
\nإذا كانت المصفوفة تحتوي على "فجوات" في الفهارس (مثلًا بعد حذف عنصر)، فإن $index سيساوي المفتاح الفعلي، وليس الرقم الترتيبي. مثال:
<?php\n$fruits = [0 => 'تفاح', 2 => 'موز', 5 => 'كرز'];\n\nforeach ($fruits as $key => $fruit) {\n echo "المفتاح: {$key}, الفاكهة: {$fruit}<br>";\n}\n?>\n\nالنتيجة:
\nالمفتاح: 0, الفاكهة: تفاح\nالمفتاح: 2, الفاكهة: موز\nالمفتاح: 5, الفاكهة: كرز\n\nإذا كنت بحاجة إلى رقم ترتيبي متسلسل (0, 1, 2)، فهذه الطريقة لن تناسبك — ستحتاج إلى استخدام الطريقة الثانية.
\n\nالطريقة الثانية: العداد اليدوي (المرونة والتحكم)
\n\nالنهج التقليدي هو إنشاء متغير عداد وزيادته في كل تكرار. يمنحك هذا تحكمًا كاملاً في الترقيم.
\n\nمثال أساسي
\n\n<?php\n$items = ['كتاب', 'قلم', 'دفتر', 'قلم رصاص'];\n$counter = 0;\n\nforeach ($items as $item) {\n echo "المنتج #{$counter}: {$item}<br>";\n $counter++;\n}\n?>\n\nالنتيجة:
\nالمنتج #0: كتاب\nالمنتج #1: قلم\nالمنتج #2: دفتر\nالمنتج #3: قلم رصاص\n\nعداد يبدأ من 1
\nغالبًا ما تحتاج إلى عرض الترقيم للمستخدم بدءًا من 1. يمكنك فعل ذلك بسهولة:
\n\n<?php\n$tasks = ['غسل الأطباق', 'تمشية الكلب', 'حل الواجبات'];\n$taskNumber = 1;\n\nforeach ($tasks as $task) {\n echo "المهمة رقم {$taskNumber}: {$task}<br>";\n $taskNumber++;\n}\n?>\n\nالتحكم الشرطي في العداد
\nيتيح لك العداد اليدوي تخطي العناصر أو إعادة تعيين الترقيم:
\n\n<?php\n$numbers = [1, 2, 0, 3, 4, 0, 5];\n$v