我正在努力使用foreach
功能。从我的数据库中,我检索了一个数组,其中包含用户信息和他们所做的评论。我的目标是遍历数组并显示每个用户和他发布的评论。我遇到的问题是用户的两面性。我想知道如何编写foreach
以便它总是选择一个用户,然后循环遍历他的所有评论,然后与下一个用户一起完成。我希望这有任何意义。请看下面的代码,因为它可能会让您更好地了解我想要实现的目标。
数组示例
| user_id | u_name | u_email | u_access | comment_id | car_id | car_comment | car_rating |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 6 | Jon | j@g.com | 3 | 15 | 3 | best car | 5 |
| 6 | Jon | j@g.com | 3 | 19 | 5 | hate it | 1 |
| 7 | Ben | b@g.com | 1 | 23 | 3 | awesome | 5 |
| 7 | Ben | b@g.com | 1 | 39 | 9 | ok | 3 |
控制器
$data['data'] = $this->User-m->get_users(); //returns $this->db->get();
$this->load->view('admin_v_b', $data);
查看
这是我的观点的当前状态。正如您所看到的那样,显然会导致用户显示的次数与他发布的评论数量相同。我已经添加了关于何时应该通过循环生成每个部分的注释。
<?php foreach ($data->result() as $row): ?>
//this div is opened only on the 1st occurrence of the user's name
<div class="user">
//these two fields are also generated only on the 1st occurrence of the name
name: <?php echo $row->name ?>
email: <?php echo $row->email ?>
//this div and its contents is generated as many times as many comments the user has
<div class="users_comments">
comment: <?php echo $row->comment ?>
rating: <?php echo $row->rating ?>
</div>
//the div is closed after generating all the comments
</div>
<?php endforeach; ?>
谢谢大家的阅读。我感谢您的帮助。如果您需要任何其他信息,请问我。此外,我没有包含get_users()
函数,因为我假设您不需要查看实际查询,因为它就是全部。
顺便说一句:我已尝试在$last_user=""
函数之前声明foreach
,然后在循环经过时调整它,但我无法获得DIV
生成权。我愿意接受建议。 :)新年快乐!
答案 0 :(得分:1)
首先,我将该逻辑从控制器和视图中分离出来。然后我会使用单独的foreach
作为评论。
<强>模型强>
<?php
function someModelMethod ($data) {
$users = array();
foreach ($data->result() as $row) {
if ( ! array_key_exists($row->id, $users)) {
$users[$row->id] = array(
'id' => $row->id,
'name' => $row->name,
'email' => $row->email,
'access' => $row->access,
'comments' => array(),
);
}
$users[$row->id]['comments'][] = array(
'comment' => $row->comment,
'rating' => $row->rating,
);
}
return $users;
}
?>
<强>控制器强>
<?php
$data = $this->User-m->get_users();
$users = someModelMethod($data);
$this->load->view('admin_v_b', array('users' => $users));
?>
查看强>
<?php foreach ($users as $user): ?>
<div class="user">
name: <?php echo $user['name'] ?>
email: <?php echo $user['email'] ?>
<div class="users_comments">
<?php foreach ($user['comments'] as $comment): ?>
comment: <?php echo $comment['comment'] ?>
rating: <?php echo $comment['rating'] ?>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
答案 1 :(得分:0)
您可以保留一组ID,然后将代码包装在if语句
中if (in_array($user[user_id], $seen)) {
....
$seen[] = $user[user_id];
}
如果您想要由用户对评论进行分组,请事先为评论和小组制作一个数组
$comments = [];
foreach ($data as $comment) {
$comments[$comment['user_id']][] = $comment;
}
然后在模板中
foreach ($comments as $set) {
//user details
foreach ($set as $comment) {
//comment text
}
}
答案 2 :(得分:0)
我收到一封电子邮件,这是一个独特的东西,彼此是独立的人
有了这个假设你可以试试这个:
<div class="user">
<?php
$pre_userEmail = null;
foreach($data as $user){
if( $pre_userEmail != $user['email'] ){
echo $user['name'];
echo $user['email'];
}
if( $pre_userEmail == null ) // first init
$pre_userEmail = $user['email'];
echo "<div class='users_comment'>";
echo $user['comment'];
echo $user['raiting']
echo "</div>";
$pre_userEmail = $user[email];
}
?>
</div>
添加强>
是的,我有两种情况可以检查$ user内容,但它们确实存在差异。第二个我写了评论。它只在循环中运行,这是第一个init开始我的工作。第一个条件是让彼此分开的人。
让我们尝试跟踪我的代码。
$ pre_userEmail为空,因此在打印他的评论和评分后,打印人员信息会在数组列表中的第一个人发生。在循环结束时,我将$ pre_userEmail内容更改为我撰写评论的人。
在第二个版本中$ pre_userEmail与$ user ['email']相等,所以他没有再次打印他的信息而第二个条件没有运行,因为它有内容。所以它工作正常