1

私は再帰関数にこだわっているようです。</ul>名前のないリスト ( ) とリスト項目 ( </li>)を閉じるのに問題があります

私が得るものは

 -aaa
 -bbb
     -b11
     -b22
     -b33
 -ccc
     -c11
     -c22
     -c33
 -ddd
     -d11
     -d22
     -d33
 -eee
 -fff

そして、私が欲しいのは:

 -aaa
 -bbb
     -b11
     -b22
         -b2a
         -b2c
         -b2b
     -b33
 -ccc
     -c11
     -c22
     -c33
         -c2a
         -c2c
             -c2c1
             -c2c2
         -c2b
 -ddd
     -d11
     -d22
     -d33
 -eee
 -fff

これは私が使用しているコードです

$html .= '<ul>';   
$i = 0;     
foreach ($result as $item) 
{
    $html .= "<li>$item->id";

    $html .= getSubjects($item->id, NULL, "",$i);    <--- start

    $html .= "</li>";   
 }   
 $html .= '</ul>';

そして機能

function getSubjects($chapter_id = NULL, $subject_id = NULL, $string = '', $i = 0 ) {
    $i++;
    // getting the information out of the database
    // Depending of his parent was a chapter or a subject
    $query = db_select('course_subject', 'su');
    //JOIN node with users
    $query->join('course_general_info', 'g', 'su.general_info_id = g.id');
    // If his parent was a chapter - get all the values where chapter id = ...
    if ($chapter_id != NULL) {
        $query
            ->fields('g', array('short_title', 'general_id'))
            ->fields('su', array('id'))
            ->condition('su.chapter_id', $chapter_id, '=');
        $result = $query->execute();
    }
    // if the parent is a subject - 
    // get value all the values where subject id = ...
    else {
        $query
        ->fields('g', array('short_title', 'general_id'))
        ->fields('su', array('id'))
        ->condition('su.subject_id', $subject_id, '=');
        $result = $query->execute();
    }
    // Because count doesn't work (drupal)
    $int = 0;
    foreach ($result as $t) {
        $int++;
    }
    //  if there no values in result - than return the string
    if ($int == 0) {
        return $string;
    }
    else {
        // Creating a new <ul>
        $string .= "<ul>";
        foreach ($result as $item) {
            // change the id's
            $subject_id = $item->id;
            $chapter_id = NULL;
            // and set the string --> with the function to his own function
            $string .= "<li>$item->short_title - id - $item->id ";
            getSubjects(NULL, $subject_id, $string, $i);
            $string .="</li>";
        }
        $string .= "</ul>";
    }
    // I thougt that this return wasn't necessary
    return $string;
}

誰かがこの種のことでもっと経験がありますか? すべてのヘルプは大歓迎です。

4

1 に答える 1

3

何をしようとしているのかわかりませんが、問題の解決に役立つかどうかをテストして確認できるコードを次に示します。

この部分はテスト用です。テスト用の 3 次元配列を作成します。

for ($x = 0; $x < 2; $x++) {
    $result["c$x"] = "ROOT-{$x}";
    for ($y = 0; $y < 3; $y++) {
        $result[$x]["c$y"] = "SECOND-{$x}-{$y}";
        $rnd_count1 = rand(0,3);
        for ($z = 0; $z < $rnd_count1; $z++) {
            $result[$x][$y]["c$z"] = "RND-{$x}-{$y}-{$z}";
            $rnd_count2 = rand(0,4);
            for ($c = 0; $c < $rnd_count2; $c++) {
                $result[$x][$y][$z][$c] = "LAST-{$x}-{$y}-{$z}-{$c}";
            }
        }
    }
}
// $result is now four dimensional array with some values
// Last two levels gets random count starting from 0 items.

アップデート:

テスト配列にいくつかのランダム性と第 4 レベルを追加しました。

そして、配列を順序なしリストにソートする関数は次のとおりです。

function recursive(array $array, $list_open = false){
    foreach ($array as $item) {
        if (is_array($item)) {
            $html .= "<ul>\n";
            $html .= recursive($item, true);
            $html .= "</ul>\n";
            $list_open = false;
        } else {
            if (!$list_open) {
                $html .= "<ul>\n";
                $list_open = true;
            }
            $html .= "\t<li>$item</li>\n";
        }
    }
    if ($list_open) $html .= "</ul>\n";
    return $html;
}


// Then test run, output results to page:
echo recursive($result);

アップデート:

<ul>これで、タグを適切に開いたり閉じたりするはずです。

于 2012-04-23T22:23:29.753 に答える