0

この多次元配列を階層構造で表示するふりをして、子のコメントを親の下に表示します。

$comments = Array
(
[0] => Array
    (
        [id] => 1
        [text] => What is the capital of Japan?
        [parent_id] => 0
    )
[1] => Array
    (
        [id] => 2
        [text] => What is the capital of Canada?
        [parent_id] => 0
    )
[2] => Array
    (
        [id] => 3
        [text] => I think is Kyoto
        [parent_id] => 1
    )
[3] => Array
    (
        [id] => 4
        [text] => You are wrong, is Tokyo
        [parent_id] => 3
    )

ここで多くの回答を検索しましたが、それらのほとんどは、DB への複数のクエリ、または配列内の不要なサブレベル フィールドに関係していました。非常にシンプルで効率的なループ関数で実行できます。私は専門家ではなく、非常に基本的なコードを使用していますが、今回はうまく機能していません。

親コメントのみを表示する関数で初期ループを発行しましょう (親は [parent_id]=0 を持っています)

echo '<ol>';
loopComments($comments, 0);
echo '</ol>';

関数は次のとおりです。

function loopComments($comments, $parent) {
    foreach ($comments as $post) {
        if ($post[parent_id] == $parent) {      
            printPost($post);
        }
    }
}

//The function below prints the post and searches for related answers
//sadly FAILS when looping again! 

function printPost($post) {
    echo "<li>".$post['text']."</li>";
    loopComments($comments, $post['parent_id']);
}

悲しいことに、「警告: foreach() に無効な引数が指定されました」というメッセージが表示されます

4

2 に答える 2

0

あなたのコードに何か問題があると思います。

STEP:
1. loopCommentsを呼び出します。
2.初めて loopCommentsprintPostを呼び出します。
3. printPost でコメントを使用しますが、printPostで定義しないでください(これはprintPostの外の呼び出し関数loopCommentsで定義されます)。

したがって、問題は次のとおりです。 printPost foreachループでは
変数$postsを使用する必要がありますが、 $commentsは使用しないでください。

于 2013-01-12T14:45:58.930 に答える
0

printPost()関数内でその配列を使用するには、関数内でコメント変数を解析する 1 つのパラメーターが必要です。

function printPost($post, $comments) {}

あなたがそれを呼び出すとき、あなたは持っているでしょう

function loopComments($comments, $parent) {
    foreach ($comments as $post) {
        if ($post[parent_id] == $parent) {      
            printPost($post, $comments);
        }
    }
}
于 2013-01-12T14:38:22.527 に答える