سؤال

وبالتالي فإن القائمة النهائية ستبدو كما يلي:

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

بناءً على سجلات قاعدة البيانات التالية:

id        menu_title          parent_menu_id    menu_level    weight
1         Item A                0                           1                     1
2         Item B                0                           1                     0
3         Item C                0                           1                     2
4         SubItem A-2       1                           2                     1
5         Item B-1             2                           2                     0
6         Item B-1-1          5                           3                     1
7         SubItem A-1       1                           2                     0
8         Item B-1-2          5                           3                     0

كيف سأقوم بالعرض؟ أعتقد أن الأمر سيتضمن تخزين جميع العناصر في مصفوفة متعددة الأبعاد، ثم تكرارها بطريقة ما...

هل كانت مفيدة؟

المحلول

إن التعامل مع بنية البيانات بالشكل الذي تستخدمه غالبًا ما يتضمن تكرارًا أو استعلامات متعددة لبناء الشجرة.

هل فكرت في طرق أخرى لتخزين التسلسل الهرمي؟تحقق من اجتياز الطلب المسبق المعدل - إليك طريقة رائعة مقالة مبنية على PHP حول هذا الموضوع.

نصائح أخرى

تعتبر البيانات الهرمية مزعجة إلى حد ما في قاعدة البيانات العلائقية (باستثناء Oracle، التي لديها مشغلين START WITH/CONNECT BY للتعامل مع هذا).هناك في الأساس نموذجين:قائمة المجاورة والمجموعات المتداخلة.

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

ما سأفعله (وقد فعلته مؤخرًا في الواقع) هو:

  • تحديد محتويات القائمة بأكملها في استعلام واحد مرتبة حسب معرف الوالدين؛
  • إنشاء شجرة لبنية القائمة باستخدام المصفوفات الترابطية أو الفئات/الكائنات؛
  • قم بالسير على تلك الشجرة لإنشاء قوائم متداخلة وغير مرتبة؛و
  • استخدم مكونًا إضافيًا لـ jQuery مثل سوبرفيش لتحويل تلك القائمة إلى قائمة.

أنت تبني شيئًا مثل هذا:

$menu = array(
  array(
    'name' => 'Home',
    'url' => '/home',
  ),
  array(
    'name' => 'Account',
    'url' => '/account',
    'children' => array(
      'name' => 'Profile',
      'url' => '/account/profile',
    ),
  ),
  // etc
);

وتحويله إلى هذا:

<ul class="menu">;
  <li><a href="/">Home</a></li>
  <li><a href="/account">Account Services</a>
    <ul>
      <li><a href="/account/profile">Profile</a></li>
...

يعد PHP لإنشاء مصفوفة القائمة أمرًا بسيطًا إلى حد ما ولكن حله صعب بعض الشيء.يمكنك استخدام وظيفة المشي على الشجرة العودية التي تقوم بإنشاء ترميز قائمة HTML المتداخلة ولكنها ستترك تنفيذها كتمرين للقارئ.:)

الطريقة التي تقوم بها بتخزين البيانات الهرمية ليست فعالة كما تريد.قرأت المقال إدارة البيانات الهرمية في MySQL قبل بضع سنوات ومنذ ذلك الحين وجدت ذلك ال أفضل حل لإدارة البيانات القائمة على التسلسل الهرمي في SQL.أفضل فائدة تالية هي أنني أعتقد أنه يمكنك الحصول على الشجرة بأكملها باستعلام واحد.

لقد نشرت للتو في سؤال مماثل طريقتي الخاصة لتحويل بيانات MySQL الهرمية (قائمة الجوار) إلى قائمة (HTML)

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

اقرا المزيد من

https://stackoverflow.com/questions/2871861#3368622

شكرًا.

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

Item B
    Item B-1
        Item B-1-2
        Item B-1-1
Item A
    SubItem A-1
    SubItem A-2
Item C

قد يصبح

1 Item B
  1.1 Item B1
    1.1.1 Item B11
    1.1.2 Item B12
2 Item A
  2.1 Item A1
  2.2 Item B2
3 Item C

يمكن تخزين الرقم الموجود أمام كل عنصر في حقل وتحليله بناءً على الطول (الذي يمثل عمق مكان وجوده) لإخبارك بكل ما تحتاج لمعرفته حول المكان الذي يذهب إليه.

أستخدم التسلسلات الهرمية المتداخلة للأشياء الأكثر تعقيدًا التي تتطلب الحساب، ولكني أجد أن هذا الأسلوب قد خدم بشكل جيد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top