PHP تتحرك الخلية شجرة عقدة
سؤال
أواجه مشكلة عند محاولة الانتقال دون العقد أو الأم العقد لأعلى أو لأسفل...لست جيدا في الرياضيات.
CREATE TABLE IF NOT EXISTS `pages` ( `page-id` mediumint(8) unsigned
NOT NULL AUTO_INCREMENT,
page-left
mediumint(8) unsigned NOT NULL,
page-right
عدد صحيح(8) غير موقعة لا لاغية ،page-title
text NOT NULL,
page-content
text NOT NULL,
page-time
int(11) unsigned NOT NULL,page-slug
text NOT NULL,
page-template
text NOT NULL,
page-parent
mediumint(8) غير موقعة لا فارغة ،page-type
text NOT NULL, المفتاح الأساسي (page-id
) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;تضاف الى
pages
(page-id
,page-left
,page-right
,page-title
,page-content
,page-time
,page-slug
,page-template
,page-parent
,page-type
) القيم (17, 1, 6, '1', ", 0, 'الأم', ", 0, "), (18, 2, 5, '2', ", 0, 'SUB', ", 17, "), (19, 3, 4, '3', ", 0, 'SUB-SUB', ", 18, "), (20, 7, 8, '5', ", 0, 'اختبار', ", 0, ");
على سبيل المثال كيف تتحرك اختبار فوق الأم و أقول التحرك الفرعية أسفل الباطن من خلال اللعب مع الصفحة اليسرى/صفحة-حق الهويات ؟ رمز ليس مطلوبا فقط مساعدة مع SQL مفهوم أو الرياضيات ، سيساعدني على فهم كيفية نقل أفضل...
المحلول
وذلك أساسا كنت ترغب في تحويل الجوار قائمة على مجموعة متداخلة?أول تحديث قائمة الجوار (أي.تحديث page_parent القيم إلى القيم الصحيحة الجديد الخاص بك شجرة) ثم تشغيل التحويل أدناه.
باستخدام PHP (التعليمات البرمجية الأساسية, لم تختبر) :
class Tree
{
private $count = 0;
private $data = array();
/**
* Rebuild nested set
*
* @param $rawData array Raw tree data
*/
public function rebuild($rawData)
{
$this->data = $rawData;
$this->count = 1;
$this->traverse(0);
}
private function traverse($id)
{
$lft = $this->count;
$this->count++;
if (isset($this->data[$id])) {
$kid = $this->data[$id];
if ($kid) {
foreach ($kid as $c) {
$this->traverse($c);
}
}
}
$rgt = $this->count;
$this->count++;
// TODO: Update left and right values to $lft & $rgt in your DB for page_id $id
...
}
}
عند استدعاء هذا المبلغ rawData يجب أن تحتوي على مجموعة من معرف ، فهرستها من قبل الوالدين id, يمكن إنشاء هذا (استنادا إلى الجدول الخاص بك هيكل) على النحو التالي ($db يجب أن تحتوي نشط شركة تنمية نفط عمان كائن الاتصال):
$sql = 'SELECT page_id, page_parent FROM pages ORDER BY page_parent';
$stmt = $db->prepare($sql);
$rawData = array();
$stmt->execute();
while ($row = $stmt->fetch()) {
$parent = $row['page_parent'];
$child = $row['page_id'];
if (!array_key_exists($parent, $rawData)) {
$rawData[$parent] = array();
}
$rawData[$parent][] = $child;
}
للقيام التحويل سوف تحتاج شيئا مثل :
$tree = new Tree();
$tree->rebuild($rawData);
وذلك أساسا يمكنك إنشاء مجموعة التي تحتوي على كافة العقد في شجرة الخاص بك فهرستها من قبل الوالدين والتي سوف يكون اجتاز في العودية الطريقة لتحديد الصحيح اليسار واليمين القيم لكل عقدة.
راجع للشغل يمكنك أن تفعل ذلك في سهل SQL (بعد التكيف مع الجدول/عمود الأسماء) :http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id-structure