سترشدك هذه المقالة عبر طريقة لاسترداد جميع العقد التابعة والتابعة لوالد محدد يستخدم PHP مع نتائج استعلام MySQL. تلغي هذه التقنية الحاجة إلى إنشاء مصفوفة متعددة الأبعاد لبنية الشجرة وتمكنك من الحصول على جميع العقد مباشرة.
خذ بعين الاعتبار جدول MySQL منظم كقائمة مجاورة، حيث يتم تمثيل بيانات التسلسل الهرمي بأعمدة للمعرف والاسم وparent_id. يمكن لاستعلام SQL التالي استرداد كافة الصفوف من هذا الجدول في مصفوفة اقترانية:
$r = mysql_query("SELECT * FROM test "); $data = array(); while($row = mysql_fetch_assoc($r)) { $data[] = $row; }
لنفترض أننا نريد تصفية هذه المصفوفة للعقد الموجودة ضمن أحد الوالدين بالمعرف 3، بما في ذلك الأصل نفسه. يمكن لوظيفة fetch_recursive المخصصة هذه إنجاز ما يلي:
function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array()) { foreach($src_arr as $row) { if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid) { $rowdata = array(); foreach($row as $k => $v) $rowdata[$k] = $v; $cats[] = $rowdata; if($row['parent_id'] == $currentid) $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true)); } } return $cats; }
لاستخدام هذه الوظيفة، قم بتمرير مصفوفة البيانات $ التي تم الحصول عليها من الاستعلام باعتبارها الوسيطة الأولى ومعرف الأصل الذي تريد استرداد العقد الفرعية له باعتباره الوسيطة الثانية:
$list = fetch_recursive($data, 3);
ستحتوي القائمة $ الآن على مصفوفة ترابطية مع جميع العقد الفرعية والعقدة الأصلية (المعرف 3) مضمن.
يقوم هذا الحل باسترداد جميع العقد التابعة والعقد التابعة لأصل محدد بكفاءة دون الحاجة إلى بناء هيكل شجرة متعدد الأبعاد.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3