0

私はテーブルを持っています

ここに画像の説明を入力

下の図のように再帰的に表示したい

ここに画像の説明を入力

PHPで再帰関数を使用しています

function  reccall($cat_id)
 {
   global $no,$recArray;
   $sql = "SELECT a.*
      FROM cat_master   
           WHERE 
        parent_id = $cat_id 
      ORDER BY 
        id ASC
      ";
         $result = mysql_query($sql) or die("Could not fetech Recursively");
    while($row = mysql_fetch_object($result))
    {
      $recArray[$no]['value'] = mysql_real_escape_string($row->value);
      $recArray[$no]['id'] = $row->id;
       ++$no;
      reccall($row->id);
    }
    return $recArray;    
 } 

しかし、注文が絵ではないような構造化配列を生成することはできません。単純な配列が常に作成されます。上記の順序のような構造化配列の作成を手伝ってくれる人はいますか。

4

2 に答える 2

1
<?
// I identified this function separately because it is performed only once, for preparing data
// It's collect an array of all parents in the correct order for each id
function dest($array) {
    foreach($array as $key=>$value) {
        if($value['pid']==0) continue;

        $pid = $key;
        $array[$key]['dest'] = array();
        while ( $pid = $array[$pid]['pid'] ) {
            if($key == $pid) exit("this tree is broken");
            $array[$key]['dest'][] = $pid;
        }
    }

    return $array;
}
// Recursive function that puts the items in the correct tree. removes the parameter dest.
function tree($array) {
    foreach($array as $key=>$value) {
        if( is_array($value['dest']) && !empty($value['dest']) ) {
            $pid = array_pop($value['dest']);
            if( empty($value['dest']) ) unset($value['dest']);

            $array[$pid]['childrens'][$key] = $value;
            $array[$pid]['childrens'] = tree($array[$pid]['childrens']);
            unset($array[$key]);
        }
    }

    return $array;
}

$array = array(
    1 => array(
        'title'=>'q',
        'pid'=>0,
        ),
    2 => array(
        'title'=>'w',
        'pid'=>1,
        ),
    3 => array(
        'title'=>'e',
        'pid'=>0,
        ),
    4 => array(
        'title'=>'r',
        'pid'=>2,
        ),
    5 => array(
        'title'=>'t',
        'pid'=>1,
        ),
);

$tree = tree( dest($array) );

echo '<pre>';
print_r($array);
print_r($tree);
?>

ちなみに、これらの配列はあまり有用ではないことに注意してください。関数の結果を使用することをお勧めしますdest()

于 2012-05-24T12:49:54.633 に答える
1

関数の代わりにこの関数を使用すると、問題が解決されることを願っています

function reccall($cat_id)
 {
     $sql = "SELECT a.*
      FROM cat_master   
           WHERE 
        parent_id = $cat_id 
      ORDER BY 
        id ASC
      ";
         $result = mysql_query($sql) or die("Could not fetech Recursively");
    while($row = mysql_fetch_object($result))
    {
      $recArray[$no]['main']['value'] = mysql_real_escape_string($row->value);
      $recArray[$no]['main']['id'] = $row->id;         
      $recArray[$no]['child'] = reccall($row->id);
       ++$no;
    }
    return $recArray;    
 } 
于 2012-06-07T12:37:00.187 に答える