1.5 · الجداول وسلاسل المحارف

المستوى 1 · أساسيات اللغة

1.5الجداول وسلاسل المحارف

الهدف: إتقان الجداول (المفهرسة والترابطية والمتعددة الأبعاد) واستغلال الدوال الأصلية للجداول/السلاسل — البنية والأدوات المحورية لتناول البيانات.
الوقت المقدّر: 11 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 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 : ثلاث حلقات منزلية محذوفة، وعرض مصحح.

خطأ شائع في الفهم: « تكفي الجداول المفهرسة لكل شيء » أو « strlen تعُدّ المحارف ». لا. فالمعطيات المسماة (مستخدم ومنتج وسطر قاعدة) تستدعي ترابطيا : فـ $config[3] لا يقول شيئا، و$config['langue'] يقول كل شيء — والاختيار يتبع طبيعة المعطيات. وstrlen تعُدّ بايتات : ففي UTF-8 يزن « é » بايتين، فتعُدّه strlen ضعفا — وللنص المشكول، mb_strlen هي التي تعُدّ صحيحا.
الجداول والدوال البنية المحورية مفهرس / ترابطيبمؤشر (0…) / بمفتاح نصي+متعدد الأبعادجداول في جداول (نتائج القاعدة)+الدوال الأصليةcount وarray_map/filter وmb_* (الترميز العالمي) لا تعِد الاختراع : ابحث عن الدالة الأصلية واستشر التوثيق.
البنية المحورية
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) اختر : يضع رياد القوائم المتجانسة في مفهرس، والكيانات المسماة في ترابطي، ومجموعات الكيانات في متعدد الأبعاد. 2) جُل : foreach على القائمة، ووصول آمن إلى المفاتيح بـ ??، وإضافة بـ $tab[] =. 3) استعمل الأدوات : count وin_array وarray_map/filter بدلا من الحلقات المنزلية ؛ وmb_* متى كان النص مشكولا. الدرس : الصيغة الصحيحة + الدالة الأصلية = معطيات تكبر دون أن تنكسر.

🔎 مثال ملموس — 🔎 مثال ملموس — مفهرس وترابطي ومتعدد الأبعاد

صيغة معطيات الويب، كما فعل رياد لخدماته.

$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_* منهجيا.

في التطبيق — تطبيقيا — تناول الجداول والسلاسل

  1. أنشئ جدولا مفهرسا وجدولا ترابطيا ؛ ونَل عناصرهما (بالمؤشر / بالمفتاح) وأضف عنصرا (`$tab[] = ...`).
  2. أنشئ جدولا متعدد الأبعاد (مثلا قائمة مستخدمين، كل واحد جدول ترابطي) وجُله بـ foreach.
  3. استعمل دوال الجداول : count وin_array وarray_map (تحويل) وarray_filter (ترشيح) وimplode/explode.
  4. تناول السلاسل : strlen وstr_replace وsubstr وtrim وstrtolower ؛ ولاحظ الدوال متعددة البايتات (mb_strlen) للترميز العالمي.
أصبحت تتقن الجداول (المفهرسة والترابطية والمتعددة الأبعاد) وتستغل الدوال الأصلية للجداول/السلاسل — البنية والأدوات المحورية لتناول البيانات في PHP.

نص جاهز للنطق — دافع عن الدالة الأصلية (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_* وأنال المفاتيح بـ ?? آمن.
تقييم ذاتي 1-5 : هل لمعطياتي الصيغة الملائمة (قائمة مقابل مسماة) ؟هل أبحث عن الأصلية قبل كتابة حلقة ؟

أسئلة شائعة

جداول مفهرسة أم ترابطية : متى تستعمل أيها، وكيف تُحسن استعمالها ؟

الجدول المفهرس : وصول بمؤشر رقمي — يمثّل قائمة عناصر من طبيعة واحدة (`$couleurs = ['rouge', 'vert', 'bleu']`)، حين يهم الترتيب أو عند الجمع (`$tab[] = ...`). والجدول الترابطي : وصول بمفتاح نصي ذي معنى — يمثّل معطيات مهيكلة (`$utilisateur = ['nom' => 'Alice', ...]`)، لكيان (مستخدم ومنتج وسطر قاعدة). شائع جدا في ويب PHP (`$_POST` ونتائج القاعدة). والتركيب (متعدد الأبعاد) حاضر في كل موضع : مفهرس ترابطيات = قائمة كيانات، وهو تماما نتيجة استعلام، يُجال بـ foreach. والممارسات الحسنة : اختر حسب الطبيعة، وسمِّ المفاتيح بوضوح، ونَل بأمان (isset و`??`)، وجُل بـ foreach.

لماذا تعتمد على دوال PHP الأصلية بدلا من برمجة كل شيء بنفسك ؟

كسب الوقت (in_array في استدعاء واحد مقابل حلقة) والموثوقية (مجرّبة بملايين الاستعمالات والحالات الحدّية مُدارة) والأداء (منفَّذة بـ C وسريعة) والمقروئية (`array_filter($users, ...)` يقول القصد) والمعيارية (معروفة للجميع). والفئات : السلاسل والجداول والتواريخ والرياضيات والملفات والتحقق. والمنعكس : قبل كتابة حلقة اسأل « هل توجد أصلية ؟ » واستشر php.net. واحجز شيفرتك لمنطقك المهني.

تحقّق من فهمك

ما بنية البيانات المحورية في PHP ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 1أسئلة جديدة وأصعب للتحقق من مكتسباتك