你能帮我找到一种如何循环数组的方法吗?

时间:2014-01-01 11:00:24

标签: php codeigniter loops 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 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生成权。我愿意接受建议。 :)新年快乐!

3 个答案:

答案 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']相等,所以他没有再次打印他的信息而第二个条件没有运行,因为它有内容。所以它工作正常