使用嵌套数组在数组上左连接foreach循环

时间:2014-09-16 10:43:12

标签: php foreach left-join

我有两个表用于用户,一个用于他们的评论。在一个页面上,我需要显示每个用户的缩略图以及与该用户匹配的评论。问题是LEFT JOIN会在每次审核时创建一行。因此,如果用户有两个评论,则他们会在缩略图列表中显示两次。我需要循环内的循环吗?我能想到的一切看起来都很笨重。感谢。

    // Get Data
$qry  = "SELECT * FROM `users` LEFT JOIN `reviews` ON users.userId = reviews.user_id WHERE installation_id = $installation_id";
$res = mysqli_query($mysqli, $qry) or die('-1'.mysqli_error($mysqli));

//$uqry = "SELECT membership FROM users WHERE userId = $uid";
//$current_user = mysqli_query($mysqli, $uqry) or die('-1'.mysqli_error($mysqli));

$getUser = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT membership FROM users WHERE userId = $uid"));
$currentUserLevel = $getUser['membership'];



?>
<div class="container">
    <div class="content">
        <?php if ($msgBox) { echo $msgBox; } ?>
        <div class="row">       

        <?php $lists = array(); 
            while($list = mysqli_fetch_assoc($res)) {
                  $lists[] = $list;
                }

                foreach($lists as $list) { 
                        $name = stripslashes($list['usersName']); 
                        $bio  = stripslashes($list['usersBio']); 
                        $review  = stripslashes($list['comments']);
                        $stars  = stripslashes($list['stars']); ?>


                    <div class="col-md-4">
                        <div id = "user-square">  
                                <div class="avatar">
                                    <img src="<?php echo $avatarDir.$list['usersAvatar']; ?>" class="publicAvatar" />
                                </div>
                                Name:<?php echo $name; ?> <br /> 
                                Bio:<?php echo $bio;  ?> <br />     
                                Review:<?php echo $review;  ?> <br />   
                                Stars: <?php echo $stars;  ?> <br />                    

                                <?php 
                                    if ($currentUserLevel == 'pro') {
                                    echo 'CONTACT SCOUT';
                                }
                                    else {
                                    echo 'Sorry you must upgrade to a Pro membership to contact this Scout';    
                                }   
                                ?>
                        </div>      
                    </div>
            <?php   }
                ?>
            </div>
        </div>      

    </div>
</div>

1 个答案:

答案 0 :(得分:0)

while循环更改为以下内容:

while($list = mysqli_fetch_assoc($res)) {
      $lists[$list['usersName']][$list['usersBio']][$list['stars']][] = $list['comments'];
}

这将为您提供一个很好的多维数组,其中用户名作为第一个键,所有用户评论按星级排序。您可能应该使用唯一键而不是用户名,因为可能存在重复项,因此电子邮件或唯一行ID会更好。

然后你可以(非常基本的例子):

$reviews = "";
foreach($lists as $username => $array) {
    foreach($array as $bio => $array2) {

        $name = stripslashes($username); 
        $bio  = stripslashes($bio); 

        foreach($array2 as $stars => $comments_array) {

            $stars  = stripslashes($stars);

            foreach($comments_array as $comments) {

                $reviews .= $stars . " - " . stripslashes($comments) . "<br />";

            }

        }

        // Your HTML here using $name, $bio, and $reviews(which will be star rating followed review for that user each on a new line)
        echo '
            <table width="400">
                <tr>
                    <td>' . $name . '</td><td>' . $bio . '</td><td>' . $reviews . '</td>
                </tr>
            </table>
        ';


    }

    $reviews = "";

}