Цикл foreach с левым соединением над массивом с вложенным массивом

У меня есть две таблицы: одна для пользователей и одна для их отзывов. На одной странице мне нужно показать эскизы каждого пользователя и отзывы, которые соответствуют этому пользователю. Проблема в том, что 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>

0

Решение

Изменить while цикл к следующему:

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

Это даст вам хороший многомерный массив с именем пользователя в качестве первого ключа и всеми отзывами пользователей, упорядоченными по звездному рейтингу. Вероятно, вам следует использовать уникальный ключ, а не имя пользователя, поскольку могут быть дубликаты, поэтому лучше использовать адрес электронной почты или уникальный идентификатор строки.

Тогда вы можете (ОЧЕНЬ простой пример):

$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 = "";

}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]