رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
استخراج مقادیر بصورت Parent - Child (حل شد)
#1
دوستان این ساختار جدول گروه های اخباره
هر گروه میونه والد گروه های دیگه بشه و میتونه خودش فرزند یه گروه دیگه باشه

این دساتان هم با parent_id کنترل میشه

حالا من میخوام اینارو توی dropdownlist نشون بدم بطوری کهفرزندها دقیقا زیر وال های خودشون نشون داده بشن

این تابع رو نوشتم و بصورت آرایه استخراج میکنه ولی تو نمایشش به مشکل خوردم


function showOptions($parentId=0){
      $output = array();
      $query = arrayQuery("SELECT *  FROM `news_categories` WHERE (`parent_id` = $parentId) ORDER BY `id`");
      foreach($query as $rows){
          if($rows['parent_id'] == $parentId){
              $child = showOptions($rows['id']);
              if($child){
                  $rows['child'] = $child;
              }
              $output[] = $rows;
          }
         
      }
      return $output;
      
     // pre($query);      
  }






   
پاسخ
تشکر شده توسط:
#2
//========================================
//dropdownList.php
function dropdownList($nodes, $indent=0) {
	if ($indent >= 20) return;	// Stop at 20 sub levels
	foreach ($nodes as $node) {
		echo '<option value="'.$node['parent_id'].'">'. str_repeat('&nbsp;',$indent*4) .$node['name'].'</option>';
			if (isset($node['child']))
			dropdownList($node['child'],$indent+1);
	}
}


echo '<select>';
dropdownList($tree);
echo '</select>';

یادگیری مداوم حداقل شرط لازم برای موفقیت در هر زمینه ای است که در آن فعالیت می کنید؛ هر روز چیز جدیدی بیاموزید.
پاسخ
تشکر شده توسط: sm_pakdel
#3
(26-03-1394، 06:57 ب.ظ)bgsrb88 نوشته:
//========================================
//dropdownList.php
function dropdownList($nodes, $indent=0) {
 if ($indent >= 20) return; // Stop at 20 sub levels
 foreach ($nodes as $node) {
 echo '<option value="'.$node['parent_id'].'">'. str_repeat('&nbsp;',$indent*4) .$node['name'].'</option>';
 if (isset($node['child']))
 dropdownList($node['child'],$indent+1);
 }
}


echo '<select>';
dropdownList($tree);
echo '</select>';

درست نمایش نمیده من میخوام زیر هر گزینه زیر مجموعه های خودش نمایش داده بشه
پاسخ
تشکر شده توسط:
#4
متوجه منظورتون نمیشم
بصورت دستی یه نمونه قرار بدید.

یادگیری مداوم حداقل شرط لازم برای موفقیت در هر زمینه ای است که در آن فعالیت می کنید؛ هر روز چیز جدیدی بیاموزید.
پاسخ
تشکر شده توسط:
#5
پائین همین صفحه سمت چپ drop down لیست پرش به انجمنو ببینید من دقیقا همینو میخوام
پاسخ
تشکر شده توسط:
#6
خوب شما باید به ازای هر لول که جلو رفتین، تو رفتگی ایجاد کنید. از تابع بازگشتی هم استفاده کنید. اگه خودتون موفق نشدین بگین تا براتون نمونه کد بگذارم.
پاسخ
تشکر شده توسط: sm_pakdel
#7
اگه با یی کار میکنید حتما ابزاربهتری موجود هست

اما اینو امتحان کنید.

//========================================
//fastMapTree.php
function fastMapTree($dataset) {
	$tree = array();
	foreach ($dataset as $id=>&$node) {
		if ($node['parent_id'] === null) {
			$tree[$id] = &$node;
		} else {
			if (!isset($dataset[$node['parent_id']]['child'])) $dataset[$node['parent_id']]['child'] = array();
			$dataset[$node['parent_id']]['child'][$id] = &$node;
		}
	}
	
	return $tree;
}

//========================================
//dropdownList.php
function dropdownList($nodes, $indent=0) {
 if ($indent >= 20) return; // Stop at 20 sub levels
 foreach ($nodes as $node) {
 echo '<option value="'.$node['id'].'">'. str_repeat('&nbsp;',$indent*4) .$node['name'].'</option>';
 if (isset($node['child']))
 dropdownList($node['child'],$indent+1);
 }
}
 
$dataset = arrayQuery("SELECT *  FROM `news_categories` ORDER BY `parent_id`");
echo '<select>';
dropdownList(fastMapTree($dataset));
echo '</select>';

یادگیری مداوم حداقل شرط لازم برای موفقیت در هر زمینه ای است که در آن فعالیت می کنید؛ هر روز چیز جدیدی بیاموزید.
پاسخ
تشکر شده توسط: sm_pakdel
#8
تست کردم درست کار نمی کنه
زیر مجموعه ها رو جابجا نمایش میده
پاسخ
تشکر شده توسط:
#9
ببینید این کارتون رو راه میندازه؟
function showOptions($parentId = 0, $level = 0)
{
    $output = array();
    foreach(arrayQuery("SELECT * FROM `news_categories` WHERE (`parent_id`='{$parentId}') ORDER BY `id`") as $row) {
        $output[] = array('level' => $level, 'data' => $row);
        foreach(showOptions($row['id'], $level + 1) as $subRow) {
            $output[] = array('level' => $level + 1, 'data' => $subRow);
        }
    }
    return $output;
}
echo '<select name="category_id">';
foreach(showOptions() as $option) {
    list($level, $data) = array_values($option);
    echo '<option value="' . $data['id'] . '">';
    for($i = 0; $i < $level; $i++) {
        echo '&nbsp;&nbsp;&nbsp;&nbsp;';
    }
    echo $data['name'] . '</option>';
}
echo '</select>';
پاسخ
تشکر شده توسط:
#10
(28-03-1394، 01:02 ب.ظ)ADMIN نوشته: خوب شما باید به ازای هر لول که جلو رفتین، تو رفتگی ایجاد کنید. از تابع بازگشتی هم استفاده کنید. اگه خودتون موفق نشدین بگین تا براتون نمونه کد بگذارم.

میشه یه نمونه کد برای بزارید
مرسی
پاسخ
تشکر شده توسط:
#11
گذاشتم. پست قبلی رو نگاه کنید.
پاسخ
تشکر شده توسط:
#12
به این شکل تو کلاس استفاده کردم


    public function showOptions($parentId = 0, $level = 0)
    {
        $output = array();
        $resault = Database::arrayQuery("SELECT * FROM `articles_categories` WHERE (`parent_id`='{$parentId}') ORDER BY `id`");
        foreach($resault as $row) {

           $output[] = array('level' => $level, 'data' => $row);
           foreach($this->showOptions($row['id'], $level + 1) as $subRows) {
               $output[] = array('level' => $level + 1, 'data' => $row);
           }
        }
        return $output;
    }

    public function viewList(){

        foreach($this->showOptions() as $option) {
            list($level, $data) = array_values($option);
            echo '<option value="' . $data['id'] . '">';
            for($i = 0; $i < $level; $i++) {
                echo '&nbsp;&nbsp;&nbsp;&nbsp;';
            }
            echo $data['name'] . '</option>';
        }
    }


ولی نتیجه رو درست بر نمی گردونه

محاسباتش درسته ولی بجای اسم زیر گروه اسم گروه اصلی رو نشون میده
پاسخ
تشکر شده توسط:
#13
کدی که از این کلاس استفاده کردین رو هم بگذارین. وقتی جواب نمیگیرین، خروجی متدها رو با print_r نشون بدین ببینید کجا مشکل دارین.
پاسخ
تشکر شده توسط: sm_pakdel
#14
(30-03-1394، 03:31 ب.ظ)ADMIN نوشته: کدی که از این کلاس استفاده کردین رو هم بگذارین. وقتی جواب نمیگیرین، خروجی متدها رو با print_r نشون بدین ببینید کجا مشکل دارین.

id ها درستن اما اسامی اشتباهه
برای زیر گروه ها هم اسم گروه اصلی شونو نمایش میده
پاسخ
تشکر شده توسط:
#15
این کد دیگه باید کار کنه:
class Categories
{
   private function showOptions($parentId = 0, $level = 0, &$result)
   {
       foreach(arrayQuery("SELECT * FROM `news_categories` WHERE (`parent_id`='{$parentId}') ORDER BY `id`") as $row) {
           $result[] = array('level' => $level, 'data' => $row);
           $this->showOptions($row['id'], $level + 1, $result);
       }
   }

   public function displayOptions($parentId = 0) {
       $options = array();
       $this->showOptions($parentId, 0, $options);
       echo '<select name="category_id">';
       foreach($options as $option) {
           list($level, $data) = array_values($option);
           echo '<option value="' . $data['id'] . '">';
           for($i = 0; $i < $level; $i++) {
               echo '&nbsp;&nbsp;&nbsp;&nbsp;';
           }
           echo $data['name'] . '</option>';
       }
       echo '</select>';
   }
}
$category = new Categories;
$category->displayOptions();

اینم نمونه خروجی:
   
پاسخ
تشکر شده توسط: sm_pakdel




کاربران در حال بازدید این موضوع: 1 مهمان