1.5الجداول وسلاسل المحارف
الأساسي في 30 ثانية
- المفهرس = قائمة، والترابطي = معطيات مسماة : $tab[0] بالموضع، و$tab['nom'] بالمفتاح — واختر حسب الطبيعة.
- المتعدد الأبعاد = صيغة الويب : قائمة سطور ترابطية — وهي تماما نتيجة استعلام، تُجال بـ foreach.
- لا تعِد الاختراع : count وin_array وarray_map/filter وimplode/explode وstr_replace وtrim… — وmb_* للترميز العالمي (Unicode).
حالة مستمرة — رياد يهيكل معطياته في قسنطينة
يستقبل رياد قائمة الخدمات مع أسعارها : فيخزنها أولا في متغيرات منفصلة $p1 و$p2 و$p3 — فيتشوش منذ الرابعة. فيعيد الهيكلة إلى جدول ترابطي لكل خدمة، ثم إلى قائمة متعددة الأبعاد جاهزة للعرض بـ foreach. ويستبدل حلقة البحث المنزلية بـ in_array، والعدّ اليدوي بـ count، ويصحح strlen التي قطعت عنوانا مشكولا بالانتقال إلى mb_strlen. فصار لمعطياته أخيرا صيغة تكبر دون أن تنكسر.
الحلقة الأخيرة من الحالة 1.1-1.4 — يهيكل رياد معطياته بعد المتغيرات والقرارات والحلقات والدوال.
1. الجداول، البنية المحورية
الجداول (tableaux) هي بنية بيانات PHP. فالجدول المفهرس : وصول بمؤشر رقمي (من 0) — $fruits = ['pomme', 'banane']; $fruits[0]. والجدول الترابطي : وصول بمفتاح نصي — $personne = ['nom' => 'Alice']; $personne['nom'] (حاضر في كل موضع : معطيات مهيكلة). وقد تكون الجداول متعددة الأبعاد (جداول في جداول — مثلا قائمة مستخدمين). وتُجال بـ foreach، وتُعدّ بـ count()، وتُضاف بـ $tab[] = valeur;.
يرتّب رياد خدماته في قائمة ترابطيات (اسم + سعر لكل واحدة) : فإضافة خدمة تعني إضافة سطر — ولا متغير $p4 أبدا بعدها.
2. الدوال الأصلية والترميز العالمي
لـ PHP مئات الدوال الأصلية. للجداول : count وin_array وarray_map (تحويل) وarray_filter (ترشيح) وarray_reduce (تجميع) وimplode / explode. وللسلاسل : strlen وstr_replace وsubstr وtrim وstr_contains (من PHP 8). والمنعكس : لا تعِد اختراع الموجود (فالتوثيق الرسمي ممتاز). وحذار الترميز العالمي : فالدوال الكلاسيكية تعمل على البايتات (مشكلة مع المشكول في UTF-8) — فاستعمل دوال متعدد البايتات (mb_strlen وmb_substr).
يعُدّ رياد بـ count، ويبحث بـ in_array، ويقيس عناوينه المشكولة بـ mb_strlen : ثلاث حلقات منزلية محذوفة، وعرض مصحح.
🔎 مثال ملموس — 🔎 مثال ملموس — مفهرس وترابطي ومتعدد الأبعاد
صيغة معطيات الويب، كما فعل رياد لخدماته.
$utilisateurs = [
['nom' => 'Alice', 'age' => 30],
['nom' => 'Bob', 'age' => 25],
];
foreach ($utilisateurs as $u) {
echo htmlspecialchars($u['nom']) . ' ';
}
echo count($utilisateurs); // 2
القراءة : وهي تماما صيغة نتيجة استعلام (قائمة سطور)، تُجال بـ foreach.
الدرس : وصول آمن إلى المفاتيح بـ ?? ($tab['cle'] ?? افتراضي) — ولا مفتاح غائب مفاجئ أبدا.
مفردات القسم
- الجدول المفهرس
- مجموعة تُنال عناصرها بمؤشر رقمي (من 0) : $fruits = ['pomme', 'banane']; $fruits[0].
مثال بسيط: قائمة أسماء خدمات رياد.
ما ليس كذلك: ترابطي لقائمة مرتبة بسيطة.
رد فعل: قائمة متجانسة وترتيب مهم = مفهرس.
- الجدول الترابطي
- مجموعة تُنال عناصرها بمفتاح نصي : $personne = ['nom' => 'Alice']; $personne['nom']. حاضر في كل موضع (معطيات مهيكلة).
مثال بسيط: كل خدمة لرياد (اسم + سعر مسميان).
ما ليس كذلك: $prestation[1] بدلا من $prestation['tarif'].
رد فعل: معطيات مسماة = مفاتيح صريحة.
- الجدول المتعدد الأبعاد
- جداول في جداول (مثلا قائمة مستخدمين، كل واحد جدول ترابطي) ؛ ويمثّل معطيات معقدة.
مثال بسيط: فهرس رياد الكامل، مُدرَجا ثم معروضا.
ما ليس كذلك: متغيرات منفصلة $p1 و$p2 و$p3.
رد فعل: قائمة كيانات = مفهرس ترابطيات.
- دوال الجداول/السلاسل
- مئات الدوال الأصلية : للجداول (count وin_array وarray_map/filter/reduce وsort وimplode/explode…) وللسلاسل (strlen وstr_replace وsubstr وtrim وstr_contains…).
مثال بسيط: count وin_array اللتان عوّضتا الحلقات المنزلية لرياد.
ما ليس كذلك: حلقة يدوية للبحث عن قيمة.
رد فعل: قبل حلقة : هل الدالة الأصلية موجودة ؟
- الدوال متعددة البايتات (mb_)
- لمعالجة الترميز العالمي (Unicode) صحيحا (محارف مشكولة/غير لاتينية) : mb_strlen وmb_substr… ؛ فالدوال الكلاسيكية تعمل على البايتات (مشكلة في UTF-8).
مثال بسيط: العنوان المشكول لرياد مقيسا بـ mb_strlen.
ما ليس كذلك: قطع « référencement » بـ substr وكسر محرف.
رد فعل: نص مشكول = mb_* منهجيا.
في التطبيق — تطبيقيا — تناول الجداول والسلاسل
- أنشئ جدولا مفهرسا وجدولا ترابطيا ؛ ونَل عناصرهما (بالمؤشر / بالمفتاح) وأضف عنصرا (`$tab[] = ...`).
- أنشئ جدولا متعدد الأبعاد (مثلا قائمة مستخدمين، كل واحد جدول ترابطي) وجُله بـ foreach.
- استعمل دوال الجداول : count وin_array وarray_map (تحويل) وarray_filter (ترشيح) وimplode/explode.
- تناول السلاسل : strlen وstr_replace وsubstr وtrim وstrtolower ؛ ولاحظ الدوال متعددة البايتات (mb_strlen) للترميز العالمي.
نص جاهز للنطق — دافع عن الدالة الأصلية (30 ث)
« قبل كتابة هذه الحلقة، لنتحقق هل توجد أصلية : فـ in_array تبحث وarray_filter ترشّح وimplode تجمع — مجرّبة وسريعة ومقروءة. ونحجز شيفرتنا للمنطق المهني، لا لإعادة كتابة ما يفعله PHP أصلًا. »
يُقال في مراجعة الشيفرة ؛ وافتح php.net على الدالة المرشحة.
نموذج نسخ ولصق — فهرس متعدد الأبعاد + أصليات + mb_*
'Vitrine', 'tarif' => 10000],
['nom' => 'Boutique', 'tarif' => 25000],
];
$catalogue[] = ['nom' => 'Sur mesure', 'tarif' => 50000];
echo count($catalogue); // 3
foreach ($catalogue as $prestation) {
echo htmlspecialchars($prestation['nom']) . ' : ' . $prestation['tarif'] . "\n";
}
$tarifs = array_column($catalogue, 'tarif');
echo in_array(25000, $tarifs) ? 'Tarif present' : 'Absent';
echo mb_strlen('Référencement'); // يحسب المشكول بدقة
فهرس في قسنطينة
كما فعل رياد : قائمة ترابطيات اسم/سعر — فالعرض بـ foreach يتبع تماما صيغة نتيجة قاعدة مستقبلية.
مفتاح قد يغيب
$prestation['promo'] ?? 'aucune' : فالوصول الآمن يتفادى التحذير حين يخلو سطر من المفتاح.
بحث أو ترشيح
in_array لـ « موجود ؟ » وarray_filter لـ « أيها ؟ » — أصليتان بدلا من حلقتين منزلتين.
نص مشكول
العناوين بالفرنسية تُلزم : mb_strlen/mb_substr للقياس والقطع دون كسر محرف مشكول.
✓ ممارسات جيدة
- اختر مفهرسا (قائمة) أو ترابطيا (معطيات مسماة) حسب طبيعة المعطيات.
- نَل المفاتيح بأمان (isset و?? للمفاتيح الغائبة).
- ابحث عن دالة أصلية قبل كتابة حلقة.
✗ أخطاء شائعة
- النيل من مفتاح غائب دون تحقق (تحذير/خطأ).
- معالجة نص مشكول بـ strlen/substr (بايتات) بدلا من mb_*.
- إعادة كتابة يدوية لما تفعله دالة أصلية أفضل.
النقاط الأساسية
- الجداول هي البنية المحورية في PHP : مفهرسة (مؤشر رقمي `$tab[0]`) وترابطية (مفتاح نصي `$tab['nom']` حاضرة في كل موضع) ومتعددة الأبعاد (جداول في جداول).
- لـ PHP مئات الدوال الأصلية : للجداول (count وin_array وarray_map/filter/reduce وsort وimplode/explode) وللسلاسل (strlen وstr_replace وsubstr وtrim وstr_contains).
- المنعكس : لا تعِد اختراع الموجود — فقبل كتابة حلقة ابحث عن الدالة الأصلية (وغالبا أكفأ). وتوثيق PHP الرسمي ممتاز، فاستشره.
- حذار الترميز العالمي (Unicode) : فالدوال الكلاسيكية (strlen وsubstr) تعمل على البايتات (مشكلة مع المشكول/غير اللاتيني في UTF-8) ؛ فاستعمل دوال متعدد البايتات (mb_*).
تحدي 48 ساعة — طبّق غدا
أعِد هيكلة متغيرات منفصلة إلى جدول (النموذج أعلاه) : واستبدل حلقة منزلية بـ count/in_array/array_filter وstrlen على نص مشكول بـ mb_strlen. وتحقق من العرض. تكفي 25 دقيقة.
- أختار مفهرسا أو ترابطيا أو متعدد الأبعاد حسب المعطيات.
- أستعمل الأصليات (count وin_array وarray_map/filter وimplode/explode).
- أعالج الترميز العالمي بـ mb_* وأنال المفاتيح بـ ?? آمن.
أسئلة شائعة
جداول مفهرسة أم ترابطية : متى تستعمل أيها، وكيف تُحسن استعمالها ؟
الجدول المفهرس : وصول بمؤشر رقمي — يمثّل قائمة عناصر من طبيعة واحدة (`$couleurs = ['rouge', 'vert', 'bleu']`)، حين يهم الترتيب أو عند الجمع (`$tab[] = ...`). والجدول الترابطي : وصول بمفتاح نصي ذي معنى — يمثّل معطيات مهيكلة (`$utilisateur = ['nom' => 'Alice', ...]`)، لكيان (مستخدم ومنتج وسطر قاعدة). شائع جدا في ويب PHP (`$_POST` ونتائج القاعدة). والتركيب (متعدد الأبعاد) حاضر في كل موضع : مفهرس ترابطيات = قائمة كيانات، وهو تماما نتيجة استعلام، يُجال بـ foreach. والممارسات الحسنة : اختر حسب الطبيعة، وسمِّ المفاتيح بوضوح، ونَل بأمان (isset و`??`)، وجُل بـ foreach.
لماذا تعتمد على دوال PHP الأصلية بدلا من برمجة كل شيء بنفسك ؟
كسب الوقت (in_array في استدعاء واحد مقابل حلقة) والموثوقية (مجرّبة بملايين الاستعمالات والحالات الحدّية مُدارة) والأداء (منفَّذة بـ C وسريعة) والمقروئية (`array_filter($users, ...)` يقول القصد) والمعيارية (معروفة للجميع). والفئات : السلاسل والجداول والتواريخ والرياضيات والملفات والتحقق. والمنعكس : قبل كتابة حلقة اسأل « هل توجد أصلية ؟ » واستشر php.net. واحجز شيفرتك لمنطقك المهني.
ما بنية البيانات المحورية في PHP ؟