2017-12-05 14 views
0

問題はidに相対的な入れ子のレベルを推定することです。ここでは、DBの一例である:ここでは http://sqlfiddle.com/#!9/22b0d2/1テーブル再帰PHPの子のレベル?

は、PHPコードの例です:

function getCats($res){ 

    $levels = array(); 
    $tree = array(); 
    $cur = array(); 

    while($rows = mysqli_fetch_assoc($res)){ 

     $cur = &$levels[$rows['id']]; 
     $cur['parent_id'] = $rows['parent_id']; 
     $cur['name'] = $rows['name']; 

     if($rows['parent_id'] == 0){ 
      $tree[$rows['id']] = &$cur; 
     } 
     else{ 
      $levels[$rows['parent_id']]['children'][$rows['id']] = &$cur; 
     } 

    } 

    return $tree; 

} 

function getTree($arr){ 

    $out = ''; 
    $counter = 1; 

    $out .= '<ul>'; 
    foreach($arr as $k=>$v){ 
     $out .= '<li><a href="?id='.$k.'">'.$v['name'].'</a></li>'; 
     if(!empty($v['children'])){ 
      $out .= getTree($v['children']); 
     } 

    } 
    $out .= '</ul>'; 
    return $out; 

} 
$mysql = new mysqli('localhost', 'root', '', 'testids'); 
$res = $mysql->query("SELECT * FROM categories ORDER BY id"); 
$cats = getCats($res); 
echo getTree($cats); 

Result Example

それはこのようなものだように機能を作り直す助けてください: ちょうどからではないに見えます<ul>であるが、<table>からである。 id = 1から見た場合、最初のレベルではid 2id 3、2番目のレベルではid 5であり、それはid 1の子であるためです。 Image Level Example

Array 
(
    [1] =&gt; Array 
     (
      [parent_id] =&gt; 0 
      [name] =&gt; name1 
      [children] =&gt; Array 
       (
        [2] =&gt; Array 
         (
          [parent_id] =&gt; 1 
          [name] =&gt; name2 
          [children] =&gt; Array 
           (
            [4] =&gt; Array 
             (
              [parent_id] =&gt; 2 
              [name] =&gt; name4 
              [children] =&gt; Array 
               (
                [5] =&gt; Array 
                 (
                  [parent_id] =&gt; 4 
                  [name] =&gt; name5 
                 ) 

               ) 

             ) 

           ) 

         ) 

        [3] =&gt; Array 
         (
          [parent_id] =&gt; 1 
          [name] =&gt; name3 
         ) 

       ) 

     ) 

) 
+0

注mysqli' 'へのオブジェクト指向インターフェースは、有意に少ない冗長なコードを読みやすく、監査作り、かつ容易に時代遅れの' mysql_query'インタフェースと混同しません。手続き型スタイルに多額の投資をする前に、それを切り換える価値があります。例: '$ db = new mysqli(...)'と '$ db-> prepare(" ... ")'手続き型インタフェースはmysqli' APIが導入されたPHP 4時代のアーティファクトであり、コード。 – tadman

+0

結果をテーブルのID列で並べ替えるには? – miknik

+0

あなたはprint_r($ cats)できますか? –

答えて

1
<?php 
/* 
$ray = array(
    array('id' => 1,'name' => 'name1','parent_id' => 0), 
    array('id' => 2,'name' => 'name2','parent_id' => 1), 
    array('id' => 3,'name' => 'name3','parent_id' => 1), 
    array('id' => 4,'name' => 'name4','parent_id' => 2), 
    array('id' => 5,'name' => 'name5','parent_id' => 4) 
); 
*/ 

$mysql = new mysqli('localhost', 'root', '', 'testids'); 
$res = $mysql->query("SELECT * FROM categories ORDER BY id"); 

$data = array(); 
while($row = mysqli_fetch_assoc($res)){ 
    $data['ids'][$row['id']]  = $row['name']; 

    if(isset($data['level'][$row['parent_id']])){ 
     $level = $data['level'][$row['parent_id']] + 1; 
    } else { 
     $level = 0; 
    } 

    $data['level'][$row['id']] = $level; 
} 

echo ' 
<table> 
    <tr> 
     <th>ID</th> 
     <th>Level</th> 
     <th>Name</th> 
    </tr>'; 
foreach($data['level'] as $id=>$level){ 
    echo ' 
    <tr> 
     <td>'.$id.'</td> 
     <td>'.$level.'</td> 
     <td>'.$data['ids'][$id].'</td> 
    </tr>'; 
} 
echo ' 
</table>'; 
?> 
1

は、この問題のためにそこにいくつかのソリューションがあります。

以下のいずれかが、これはおそらくひどいPHPコードであることに注意してくださいhttps://www.sitepoint.com/hierarchical-data-database/

<?php 

function getConnection() { 
    try { 
     $con = new PDO('sqlite:db.sqlite3') or die('connot open database'); 
     return $con; 
    } catch(PDOException $e) { 
     echo $e; 
     return null; 
    } 
} 


function showChildren($parent, $level) { 
    $con = getConnection(); 
    if ($con) { 
     $stmt = $con->query('SELECT id, name, parent_id from categories WHERE parent_id = ' . $parent); 
     while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
      echo '<tr>'; 
      echo '<td>' . $row['id'] . '</td>'; 
      echo '<td>' . $level . '</td>'; 
      echo '<td>' . $row['name'] . '</td>'; 
      echo '</tr>'; 
      showChildren($row['id'], $level+1); 
     } 
    } 
} 

echo '<table>'; 
echo '<tr><th>ID</th><th>LEVEL</th><th>NAME</th></tr>'; 

showChildren(0, 0); 

echo '</table>'; 

から変更されています。テンプレート文字列、準備された文などの最近のコーディング標準を忠実に守っていないことは確実です。しかし、それはあなたの質問にテーブルを作成します。

+0

これは非常に部分的な解決策です。 OPはこの特定のユースケース*でどのようにこのクエリを使用しますか?どのように元のコードに適合しますか?ここに追加できる情報がたくさんあります。 –

+0

元の質問者がこれをどのように使用しているかを確認してください。正直なところ、そのテンプレートと私は彼/彼女はその前提から描画し、より良い書き換えを願っています... – SciGuyMcQ

+0

ありがとう、私は自分のためのコードを書き直そうとします。私はコードをどのように構成するかの論理を完全には理解していないので、もっと尋ねました。しかし、私は理解しようとします。 –