5

私はサイトのナビゲーションを構築していますが、私の人生では再帰を理解できません。この設計を使用して、MySQLを介してすべてのデータを保存しています。

ここに画像の説明を入力してください

再帰がどのように機能するかについていくつかのリンクを読みましたが、理解するのが難しいので遅くなければなりません。私は何かを書こうとしました、そしてそれが私が本当に必要とするものにさえ近くないことを知っています、しかしそれは始まりです:

PDO

public function viewCategories()
{
    $viewSQL = "SELECT * FROM categories";  
    try
    {
        $pdo = new PDO('mysql:host=localhost;dbname=store','root','');
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        $categoryVIEW = $pdo->prepare($viewSQL);
        $categoryVIEW->execute();
        $array = $categoryVIEW->fetchAll(PDO::FETCH_ASSOC);
        $categoryVIEW->closeCursor();
        $json = json_encode($array);
        return $json;
    }
    catch(PDOexception $e)
    {
        return $e->getMessage();
        exit();
    }
}

再帰

$return = json_decode($category->viewCategories(),true);

function buildNavigation($json)
{
    foreach($json as $item)
    {
        if($item['category_id'] === $item['parent'])
        {
            print('<li>'.$item['category_name'].'</li>');
            if($item['category_id'] === $item['parent'])
            {
                print('<li>match'.$item['category_name'].'</li>');
                buildNavigation($json);
            }
        }
}
buildNavigation($return);

予想通り、これが条件に入ることはありません。これは知識を持っているのは良いことなので、私は自分でこれを理解しようとしましたが、それは私の精神的な能力を超えていると思います:(

見てくれてありがとう:)

アップデート

私はこれがすでに答えられていることを知っていますが、連想配列を構築するためにこれを行うことができる方法はありますか?私はここから入手したALMOSTが機能する関数で遊んでいます、それは私が望まない余分な配列を追加します。

方法

private function buildCategories($array,$parent)
{
    $result = array();
    foreach($array as $row)
    {
        if($row['parent'] == $parent)
        {
            $result[$row['category_name']] = $this->buildCategories($array,$row['category_id']);
        }
    }
    return $result;
}
$json = json_encode($this->buildCategories($array,NULL));
return $json;

これ欲しい:

{"reloading":{"components","presses and dies","tumblers & scales","tools & accessories","shotshell reloading"}

しかし、私が得るものはこれです:

{"reloading":{"components":[],"presses and dies":[],"tumblers & scales":[],"tools & accessories":[],"shotshell reloading":[]}
4

2 に答える 2

17

これが再帰の例です。

function buildNavigation($items, $parent = NULL)
{
    $hasChildren = false;
    $outputHtml = '<ul>%s</ul>';
    $childrenHtml = '';

    foreach($items as $item)
    {
        if ($item['parent'] == $parent) {
            $hasChildren = true;
            $childrenHtml .= '<li>'.$item['category_name'];         
            $childrenHtml .= buildNavigation($items, $item['category_id']);         
            $childrenHtml .= '</li>';           
        }
    }

    // Without children, we do not need the <ul> tag.
    if (!$hasChildren) {
        $outputHtml = '';
    }

    // Returns the HTML
    return sprintf($outputHtml, $childrenHtml);
}

print buildNavigation($items);

そのスクリプトは次の出力を生成します:

<ul>
    <li>Menu 1</li>
    <li>Menu 2
        <ul>
            <li>Sub Menu 2.1</li>
            <li>Sub Menu 2.2</li>
            <li>Sub Menu 2.3
                <ul>
                    <li>Sub Menu 2.2.1</li>
                    <li>Sub Menu 2.2.2</li>
                    <li>Sub Menu 2.2.3</li>
                </ul>
            </li>
        </ul>
    </li>
    <li>Menu 3</li>
</ul>
于 2012-10-21T22:09:30.673 に答える
0

上記のコードを少し変更して、ユーザーがメニューの各レベルに異なるcssを適用できるようにしました。これで、最初のサブメニューにあるときにchild-class1のようなサブメニューのクラスが表示され、child-class2が表示されます。 2番目のサブメニューなどにあるとき...

  <?php
 function buildNavigation($items, $parent = NULL, $n=NULL)
    {
$hasChildren = false;
if ($parent == NULL)
{
    $level=0;
    $outputHtml = '<ul class="parent-class">%s</ul>';
}
else
{
    if($n==NULL)
    {
        $level=1;
    }
    else
    {
        $level=$n;
    }
    $outputHtml = '<ul class="child-class'.$level.'">%s</ul>';  
} 
$childrenHtml = '';
foreach($items as $item)
{
    if ($item['parent'] == $parent) {
        $hasChildren = true;
        $childrenHtml .= '<li><a href="/'.$item['slug'].'">'.$item['ptitle'].'</a>';
        $next = ++$level;
        $childrenHtml .= buildNavigation($items, $item['pageid'],$next);         
        $childrenHtml .= '</li>';           
    }
}

// Without children, we do not need the <ul> tag.
if (!$hasChildren) {
    $outputHtml = '';
}

// Returns the HTML
return sprintf($outputHtml, $childrenHtml);
}
echo  buildNavigation($ppages);
?>

こんな感じで出てきます

    <ul class="parent-class">
      <li>
        <a href="http://example.com/page-1">page 1</a>
           <ul class="child-class1">
              <li>
                 <a href="http://example.com/this-is-child-page">this is child page</a>
                  <ul class="child-class2">
                     <li>
                        <a href="http://example.com/child-of-child">child of child</a>                 </li>
                  </ul>
              </li>
          </ul>
      </li>
 </ul>

@MaximeMorin氏に感謝します。

于 2013-11-21T22:47:04.577 に答える