تالار گفتمان nCIS.ir

نسخه‌ی کامل: استخراج مقادیر بصورت Parent - Child (حل شد)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
صفحات: 1 2
دوستان این ساختار جدول گروه های اخباره
هر گروه میونه والد گروه های دیگه بشه و میتونه خودش فرزند یه گروه دیگه باشه

این دساتان هم با 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);      
  }






[attachment=53]
//========================================
//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>';
(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>';

درست نمایش نمیده من میخوام زیر هر گزینه زیر مجموعه های خودش نمایش داده بشه
متوجه منظورتون نمیشم
بصورت دستی یه نمونه قرار بدید.
پائین همین صفحه سمت چپ drop down لیست پرش به انجمنو ببینید من دقیقا همینو میخوام
خوب شما باید به ازای هر لول که جلو رفتین، تو رفتگی ایجاد کنید. از تابع بازگشتی هم استفاده کنید. اگه خودتون موفق نشدین بگین تا براتون نمونه کد بگذارم.
اگه با یی کار میکنید حتما ابزاربهتری موجود هست

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

//========================================
//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>';
تست کردم درست کار نمی کنه
زیر مجموعه ها رو جابجا نمایش میده
ببینید این کارتون رو راه میندازه؟
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>';
(28-03-1394، 01:02 ب.ظ)ADMIN نوشته: [ -> ]خوب شما باید به ازای هر لول که جلو رفتین، تو رفتگی ایجاد کنید. از تابع بازگشتی هم استفاده کنید. اگه خودتون موفق نشدین بگین تا براتون نمونه کد بگذارم.

میشه یه نمونه کد برای بزارید
مرسی
گذاشتم. پست قبلی رو نگاه کنید.
به این شکل تو کلاس استفاده کردم


    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>';
        }
    }


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

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

id ها درستن اما اسامی اشتباهه
برای زیر گروه ها هم اسم گروه اصلی شونو نمایش میده
این کد دیگه باید کار کنه:
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();

اینم نمونه خروجی:
[attachment=61]
صفحات: 1 2