Php 你能帮我找到一种方法来循环数组吗?

Php 你能帮我找到一种方法来循环数组吗?,php,codeigniter,loops,foreach,Php,Codeigniter,Loops,Foreach,我正在努力使用foreach函数。从我的数据库中,我检索到一个数组,该数组保存有关用户及其评论的信息。我的目标是在数组中循环并显示每个用户及其发表的评论。我遇到的问题是用户的口是心非。我想知道如何编写foreach的foreach,这样它总是选择一个用户一次,然后遍历他的所有评论,然后对下一个用户执行此操作。我希望这有意义。请看一下下面的代码,因为它可能会让您更好地了解我试图实现的目标 阵列示例 | user_id | u_name | u_email | u_access | comment_

我正在努力使用
foreach
函数。从我的数据库中,我检索到一个数组,该数组保存有关用户及其评论的信息。我的目标是在数组中循环并显示每个用户及其发表的评论。我遇到的问题是用户的口是心非。我想知道如何编写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

$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; ?>
这是我目前的看法。正如您所看到的,这显然会导致用户显示的评论数量与他发布的评论数量一样多。我已经添加了关于何时由循环生成每个部分的注释

<?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; ?>

//此div仅在用户名第一次出现时打开
//这两个字段也仅在名称第一次出现时生成
姓名:
电邮:
//此div及其内容的生成次数与用户的评论次数相同
评论:
评级:
//生成所有注释后,div关闭
谢谢大家的阅读。我感谢你的帮助。如果你需要更多的信息,尽管问我。另外,我没有包括
get_users()
函数,因为我假设您不需要查看实际的查询,因为这就是全部内容


顺便说一句:我曾尝试在
foreach
函数之前声明
$last\u user=“
,然后在循环过程中对其进行调整,但我无法正确生成
DIV
。我愿意接受建议。:)新年快乐

您可以保留一个id数组,然后将代码包装在if语句中

if (in_array($user[user_id], $seen)) {
  ....
  $seen[] = $user[user_id];
}
如果您想由用户对评论进行分组,只需为评论创建一个数组,并预先为exmaple进行分组

$comments = [];

foreach ($data as $comment) {
  $comments[$comment['user_id']][] = $comment;
}
然后在模板中

foreach ($comments as $set) {
  //user details
  foreach ($set as $comment) {
    //comment text
  }
}

我收到了一封电子邮件,这是一件独特的事情,它将人们彼此分开

基于此假设,您可以尝试以下方法:

<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为空,因此打印个人信息,然后在数组列表中的第一个人出现init,然后打印他的评论和费率。在循环结束时,我将$pre_userEmail内容更改为我写评论的人


在第二个itration中,$pre_userEmail与$user['email']相等,因此他没有再次打印他的信息,第二个条件没有运行,因为它有内容。所以它工作正常

首先,我要将该逻辑从控制器和视图中分离出来。然后,我将使用一个单独的
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;
}

?>

控制器

$data['data'] = $this->User-m->get_users(); //returns $this->db->get();
$this->load->view('admin_v_b', $data);
<?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; ?>

姓名:
电邮:
评论:
评级:

是的,这与我对
$last\u user
所做的差不多,但正如我所说的,我不知道如何形成if语句来生成
。user\u comments
DIV位于该用户的主DIV内/好的,我已经尝试实现了另一个解决方案,但是我一直得到很多“undefinex索引”错误。是否确定不需要使用函数
->result()
?为什么不调整get_users()函数,以便将数据发送到准备进行分析的视图?在视图中尝试执行的操作(操纵数组)必须在模型中执行。记住MVC的概念,这样就更容易将多维数组发送到所有已排序的视图。data=[user1=[]、user2[]、…]好的,但是我加入了两个表
users
car_comments
,我真的想不出应该如何将数据解析到视图中,这样它就有say array users和array user_注释,并且在用户之间循环,在注释之间循环。我该如何做才能使当用户没有发表评论时,我仍然在数组中得到空数组,等等。我能想到的唯一选项是调用另一个函数,比如说
get\u users\u comments(user\u id)
,并在该用户的comments div中生成结果,但这似乎更复杂。好的。那么请给我指路。如果我有表格
users
和表格
car\u comments
两列
ID、user\u ID、car\u ID、comment
我如何创建一个类似于
[[用户1信息[他的所有评论]]…[用户99信息[他的所有评论]]的数组
?这看起来不对。为什么在同一条件下将
$pre_userEmail
设置为
$user['email']
两次?或者,
$user['email']
$user[email]
之间有区别吗?另外,如果您第一次检查的是
null
,是否应该在某个地方将其重置回
null
?因为现在它再也不会达到空状态了,对吗?是的,我有两种情况检查$user内容,但它们确实不同。第二个是我写的评论。它在循环中只运行了一次,这是第一个init开始我的工作。第一个条件是人与人之间要分开。我爱你,伙计。非常感谢你。我已经试着把它全部写在纸上,看看它是如何通过数组的,等等。但是这个解决方案很棒。我正要尝试将结束div包装成类似