【问题标题】:Could you help me find a way how to loop through an array?你能帮我找到一种方法来遍历一个数组吗?
【发布时间】:2014-01-19 00:22:02
【问题描述】:

我正在努力使用foreach 函数。从我的数据库中,我检索了一个数组,其中包含有关用户和他们制作的 cmets 的信息。我的目标是遍历数组并显示每个用户和他发布的 cmets。我遇到的问题是用户的两面性。我想知道如何编写foreach 以便它始终选择一个用户一次,然后循环遍历他的所有 cmets,然后对下一个用户执行此操作。我希望这有任何意义。请查看下面的代码,因为它可能会让您更好地了解我想要实现的目标。

数组示例

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

查看

这是我目前的观点。正如您所看到的,这显然会导致用户显示的次数是他发布的 cmets 的次数。我已经添加了 cmets,以了解每个部分何时应该由循环生成。

<?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() 函数,因为我假设您不需要查看实际查询,因为这就是全部。

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

【问题讨论】:

  • 为什么不调整 get_users() 函数以便将数据发送到准备解析的视图?您尝试在视图中做的事情(操作数组)必须在模型中完成。牢记 MVC 概念。
  • 因此将多维数组发送到所有内容都已排序的视图要容易得多。数据=[user1=[],user2[],..]
  • 好的,但是我要加入两个表 userscar_comments,我真的想不出我应该如何将数据解析到视图中,以便它说数组用户和数组 user_cmets并且因为它循环通过用户并循环通过 cmets。我将如何做到这一点,以便当用户没有发表评论时,我仍然会在数组中得到空数组,等等。我能想到的唯一选择是调用另一个函数,比如用脚本调用 get_users_comments(user_id) 并生成结果在该用户的 cmets div 中,但这似乎更加复杂。
  • 好的。那么请给我一些指示。如果我有表users 与列ID, name, email 和表car_comments 与列id, user_id, car_id, comment 我如何创建一个看起来像[[users #1 info[all his comments]]..[users #99 info[all his comments]]] 的数组?

标签: php codeigniter loops foreach


【解决方案1】:

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

【讨论】:

  • 我爱你。非常感谢你。我已经在尝试将它全部写在纸上,看看它是如何通过数组等的。但是这个解决方案很棒。我正要尝试将关闭的 div 包装成 if first run = true 之类的东西,什么也不做,然后把它放在打开的 div 的顶部,然后如果当前用户 id 与最后一个用户 id 不同,我会生成它。但这更好,更清洁。谢谢。
【解决方案2】:

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

if (in_array($user[user_id], $seen)) {
  ....
  $seen[] = $user[user_id];
}

如果您想按用户对 cme​​ts 进行分组,只需为 cmets 创建一个数组并预先分组,例如

$comments = [];

foreach ($data as $comment) {
  $comments[$comment['user_id']][] = $comment;
}

然后在模板中

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

【讨论】:

  • 是的,这几乎就是我对 $last_user 所做的,但正如我所说,我不知道如何形成 if 语句以在主 div 中为该用户生成 .user_comments DIV .. :/
  • 好的,我已经尝试实施其他解决方案,但我不断收到很多“未定义索引”错误。确定不用-&gt;result()这个函数?
【解决方案3】:

我收到了一封电子邮件,这是一种独特的东西,可以将人们彼此分开

有了这个假设,你可以试试这个:

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

【讨论】:

  • 这看起来不对。为什么在同一条件下将$pre_userEmail 设置为$user['email'] 两次?或者$user['email']$user[email] 有区别吗?此外,如果您首先检查的是null,不应该将它重置回null 某处吗?因为现在它再也不会达到 null 状态了,对吧?
  • 是的,我有两种情况可以检查 $user 内容,但它们确实不同。我为它写了评论的第二个。它只循环运行一次,这是第一个 init 开始我的工作。第一个条件是分开的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2017-09-20
  • 2020-08-28
  • 2017-06-09
相关资源
最近更新 更多