0

相互参照を含むデータベーステーブルから一連のIDをフェッチしようとしています。各要素の「トピック」には、同じテーブル内にある「親トピック」の列が含まれています。単一の親トピックが与えられた場合、それを親として持つすべてのサブトピックの配列を作成し、次にそれらのトピックのすべてのサブトピックなどを作成します。

これはそれほど難しいことではないようですが、独学のプログラマーとして、私はすべての間違ったツールを使用していると感じています。特にmerge-array()とのvar_dump()セクションは間違っていると感じており、全体的なアプローチについてはよくわかりません。これらの要素を何に置き換える必要がありますか?

function get_subtopics($parent_topic)
{
    //returns an array of subtopics minus the first 
    $all_subs = array();

    $query = $this->db->get_where('topics', array('parent_topic' => $parent_topic));

    $subs = $query->result_array();
    $resubs = array();
    $query->free_result();
    //push subs to all_subs

    //while the subs array has members, find their child
    while (count($subs)>0) {
        foreach ($subs as $s) {
            $query = $this->db->get_where('topics', array('parent_topic' => $s['id']));
            $resubs = array_merge($resubs, $query->result_array());
            $query->free_result();
        }
        $all_subs = array_merge($all_subs, $resubs);
        var_dump($resubs);
    }


    //Returns an array of ids
    return $all_subs;
}

編集:これの目的は、ランダムジェネレーターの問題が引き出されるトピックの「プール」を形成することです-私は、それらを区別するためのツリー構造なしで、すべてのサブトピックを1つの配列にまとめようとしています。「math」などの親トピックを指定するユーザーは、「algebra」、「algebra:quadratics」、「calculus」などの数学サブトピックを均等に組み合わせて、問題を引き出す必要があります。それが少し明確になることを願っています。

4

1 に答える 1

1

これを行うには 2 つの方法があります。データベースからすべてのレコードを取得し、以下のような php 再帰関数を使用してツリー構造を構築します。

//Build menu array containing links and subs
$items = Array( 
    //highest level
    'cms' => Array(
        'title' => 'CMS',
        //Array containing submenu items for cms
        'subs' => Array(
            'intro-to-cms' => Array('title' => 'Intro to CMS'),
            'specific-cms' => Array('title' => 'Specific CMS'),
            'installing-a-cms' => Array('title' => 'Installing a CMS')
        ),
    )
);

//Display the menu
echo navlinks($items, $page);

/**
 * Recursive function creates a navigation out of an array with n level children
 * @param type $items
 * @return string containing treestructure
 */
function navlinks($items, $page=false)
{
  $html = '<ul>';
  foreach ($items AS $uri => $info) {
    //Check if the pagename is the same as the link name and set it to current when it is
    $html .= '<li'.($info['title'] == $page ? ' class="current"' : '').'>';
    echo '  <a href="' . $uri . '">' . $info['title'] . '</a>';
    //If the link has a sub array, recurse this function to build another list in this listitem
    if (isset($info['subs']) && is_array($info['subs'])) {
      $html .= navlinks($info['subs']);
    }
    $html .= '</li>';
  }
  $html .= '</ul>';
  return $html;
}

1 つの親とその下にある子をフィルター処理するには、stackoverflow に関する以前のコメントで説明したように、事前にかなりトリッキーなクエリが必要です。(下のリンク)

MySQL 親 -> 子クエリ

于 2013-01-04T18:43:53.750 に答える