0

だから、私はこの非常に奇妙なエラーを抱えています-いくつかの高度なPHP開発者もやや奇妙と見なされる可能性があります。

2番目のforeachステートメントでは、そのforeachステートメントで作成された配列「$ reply_each」があり、「array_push()」-「$recent_discussion_each['discussion_replies_array']」という別の配列に変換されるはずです。これは、2番目のforeachステートメントで機能します。しかし、2番目のforeachステートメントが終了するとすぐに、「$ reply_each」配列は、スコープ外であるかのように消えます。スコープの問題ではないことを確認するために、関数の先頭で$ reply_eachを初期化しましたが、それは役に立ちませんでした。これは別のものである必要があります。

助けてください?

更新:2番目のforeachステートメント内で$ reserved_discussion_each ['discussion_replies_array']に対してcount()を実行すると、正しい値1が得られます。ただし、同じcount()を実行すると、今回は外部になります。 2番目のforeachステートメントの0の値が正しくありません。これは、以前に明確でなかった場合の問題です。

public function getRecentDiscussions($num_recent_discussions, $course_id) {
    //
    $this->load->database();
    //
    $recent_discussions_array = array();
    //
    // Construct query to fetch recent discussions along with their replies and some
    // basic user info about the authors
    $query_recent_discussions = $this->db->select('course_discussion.id AS course_discussion_id,
                                                   user.f_name,
                                                   user.l_name,
                                                   course_discussion.text,
                                                   course_discussion.posted_datetime,
                                                   course_discussion.is_reply,
                                                   course_discussion.parent_id
                                                  ')
                                         ->join('user', 'course_discussion.owner = user.id')
                                         ->where('course_discussion.course', $course_id)
                                         ->limit($num_recent_discussions)
                                         ->get('course_discussion');
    //
    foreach($query_recent_discussions->result_array() as $row) {
        //
        // Figure out of this comment is a parent or a reply. If it is a parent (meaning is_reply
        // is equal to 0), then treat it like one
        if($row['is_reply'] == '0') {
            //
            $recent_discussion_each = array();
            //
            $recent_discussion_each['discussion_id'] = $row['course_discussion_id'];
            $recent_discussion_each['discussion_owner_f_name'] = $row['f_name'];
            $recent_discussion_each['discussion_owner_l_name'] = $row['l_name'];
            $recent_discussion_each['discussion_body'] = $row['text'];
            $recent_discussion_each['discussion_posted_datetime'] = $row['posted_datetime'];
            $recent_discussion_each['discussion_replies_array'] = array();
            //
            array_push($recent_discussions_array, $recent_discussion_each);
        }
        //
        // Else, it must be a reply since is_reply is not a 0
        else {
            //
            // Look for the parent comment by going through the entire list of comments
            foreach($recent_discussions_array as $potential_parent) {
                //
                // Check to see if this comment's (now known as a reply's) id matches 
                // the id of the comment currently in the position in the list of comments
                if($row['parent_id'] == $potential_parent['discussion_id']) {
                    //
                    $reply_each = array();
                    //
                    $reply_each['reply_id'] = $row['course_discussion_id'];
                    $reply_each['reply_owner_f_name'] = $row['f_name'];
                    $reply_each['reply_owner_l_name'] = $row['l_name'];
                    $reply_each['reply_text'] = $row['text'];
                    $reply_each['reply_posted_datetime'] = $row['posted_datetime'];
                    $reply_each['reply_is_reply'] = $row['is_reply'];
                    $reply_each['reply_parent_id'] = $row['parent_id'];
                    //
                    array_push($potential_parent['discussion_replies_array'], $reply_each);
                }
            }
        }
    }
    //
    foreach($recent_discussions_array as $recent_discussion) {
        echo ($recent_discussion['discussion_id'].' has the following replies: ');
        foreach($recent_discussion['discussion_replies_array'] as $reply) {
            echo($reply['reply_id']);
        }
    }
    //
    return $recent_discussions_array;
    //
    // end
    //
}
4

1 に答える 1

2

foreachループ本体内で使用するアイテムのコピーを作成します。これが意味するのは、$potential_parent実際にはからの元の配列ではなく$recent_discussions_array、それらのコピーであるということです。

したがって、それらを変更すると、foreach($recent_discussions_array as $potential_parent)ループが終了するとすぐに、それらのコピーは消えます。

私が言っていることの簡単な例として、ここに「バズ」印刷がはっきりとないことに注意してください。

http://ideone.com/WlDru

次に、実際に元の配列にキーでアクセスした場合に何が起こるかを比較します。

http://ideone.com/etvr5

ベンがコメントで指摘しているように、あなたが本当に望んでいるのは、&演算子を使用することです。

http://ideone.com/2TphI

于 2012-06-26T03:42:15.327 に答える