Foreach迭代只返回上一个循环的最后一个值

时间:2017-08-06 18:59:37

标签: php iteration

我尝试抓取并计算每个帖子的所有回复,例如,特定帖子的所有回复都在2列下标记为level,但我的foreach循环只抓取了最后一次迭代的值。例如,假设我想要post_id 91的所有评论回复,其评论为92 95,而post_id又有回复93他们的94 {1}} 96 post_id。我的foreach循环只返回最后一个回复post_id 96,但我希望我的foreach循环保存所有帖子评论回复帖子ids,例如,它应该返回所有帖子ID 93 {{ 1}} 94。我想知道在代码中需要更改什么来实现这一点请帮助。感谢。

MySQL表格结构

96

MySQL表数据

CREATE TABLE posts(
post_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INT UNSIGNED NOT NULL DEFAULT 0,
member_id INT UNSIGNED NOT NULL,
profile_id INT UNSIGNED NOT NULL,
level INT UNSIGNED NOT NULL DEFAULT 0,
post LONGTEXT DEFAULT NULL,
date_created DATETIME NOT NULL,
date_updated DATETIME DEFAULT NULL,
update_count INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (post_id)
);

PHP

post_id     parent_id   member_id   profile_id  level   post                    date_created            date_updated    update_count
96          95          1           1           2       reply 1 for comment 2   2017-08-06 02:26:09     NULL            0
95          91          1           1           1       comment 2               2017-08-06 02:25:43     NULL            0
94          92          1           1           2       reply 2                 2017-08-06 02:25:09     NULL            0
93          92          1           1           2       reply 1                 2017-08-06 02:25:00     NULL            0
92          91          1           1           1       comment 1               2017-08-06 02:24:47     NULL            0
91          0           1           1           0       post 1                  2017-08-06 02:24:31     NULL            0

2 个答案:

答案 0 :(得分:1)

问题

foreach循环中,您在$parent_id grab_all_post_comment_replies_parent_ids($post_id)时循环播放。但是,您忘记的是,在每个循环结束时,再次检查foreach循环中的条件。

因此,每次foreeach循环结束时,您再次调用该函数,它将当前数组替换为新数组,因此我们从头开始搜索新数组,从而你只得到了第一个结果。

我在这里做的是在开始时运行一次函数,然后将其存储到变量中。现在它将遍历数组中的每个值而没有问题。

其次,不需要检查总和及其总和的位。 foreach循环将始终结束,您可以返回值。目前,你只是检查0 == total,它不会是,然后返回而不给你的循环一个继续运行的机会。

只需将其移除,然后在最后返回。

解决方案

function all_post_comment_replies($post_id){
    $parent_ids = grab_all_post_comment_replies_parent_ids($post_id);
    $total = count($parent_ids); 
    $all_ids = array();
    if(is_array($parent_ids)){
        foreach($parent_ids as $parent_id){
            //filter string to contain only numbers just in case
            $parent_id = filter_numbers($parent_id);
            //escape special characters in the string for use in the MySQL statement
            $parent_id = mysqli_real_escape_string(database(), $parent_id);

            $query = "SELECT *
                      FROM `posts`
                      WHERE `parent_id` = '$parent_id'
                      AND `level` = '2'";
            //short hand if statement ? if-true : if-false to determine the number of results returned by the query                                          
            $count = ($query = mysqli_query(database(), $query)) ? mysqli_num_rows($query) : 0; 

            if($count === 0){
                //query returned 0 meaning no results so return false as the value for the function
                return false;
            } else {
                while($row = mysqli_fetch_array($query)){ 
                    $ids[] = $row['post_id'];
                }

                $all_ids = $ids;
            }

        }
        return $all_ids;
    } else {
        return false;
    }
}

答案 1 :(得分:0)

在函数all_post_comment_replies()中存在以下错误:

if($sum = $total){ // assigment, not comparison
                return $all_ids;
            } else {
                return false;
            }

在if句子中,$ total变量被赋值为$ sum 没有比较表达式并且总是为真($ sum总是> 0),当表达式等于零时,它只是假的。
我认为它只迭代一次。 修复:

if($sum == $total){ // see ==
                return $all_ids;
            } else {
                return false;
            }