结合两个“foreach”"循环


Combining two "foreach" loops

关于我的特性的一些背景:

我们已经建立了一个应用程序,允许你创建和共享一些东西,最后一步是与其他用户共享。

我有一个视图,输出所有用户和每个名称旁边的复选框。使用AJAX,如果您选中或取消选中某个框,它将在数据库表中插入用户id和共享项的id。

因此,我需要连接两个表来查看谁与他们共享了项目。一个表保存条目,另一个表保存与之共享的对象。

现在,我有一个foreach循环,它取出所有已共享的用户ID:

<?php foreach($shared_user as $shared_user):?>
        <?= $shared_user_emails[set_default($shared_user->user_id)]; ?><br />
        <?php endforeach; ?>

然后,一个foreach循环,取出所有用户和他们的复选框:

<?php foreach($users1 as $user):?>
<?php $checked = ($user->id == $shared_user_emails[set_default($shared_user->user_id)])? 'checked' : '' ;   ?>
<label class="checkbox"><input type="checkbox" class="template_permissions" data-id="<?= $user->id?>"   <?= $checked ?> /><?= $user->email ?></label>

你会看到在上面的每一个foreach中,我做了:

$user->id == $shared_user_emails[set_default($shared_user->user_id)])? 'checked' : '' ;   

也就是说,如果共享用户ID等于用户ID,则对输入应用"checked"。这工作得很好,但只适用于一个用户,而不是遍历所有用户。

一切都是共享和正常工作,但是只有一个复选框将被选中,而不是所有的用户被选中,如果他们已经共享。

我认为我需要以某种方式将这两个循环结合起来,它显然只拉入最后一个被共享的人并勾选他们的复选框。

我试着把这两个循环结合起来已经有一天了,有人能帮帮忙吗?

谢谢!

编辑

下面是如何从我的控制器中创建变量:

load_model('user_model', 'users');
    $users = $this->users->users_by_company($company_id);

    load_model('template_user_model', 'template_users');
    $shared_users = $this->template_users->get_many_by('template_id', $template_id);
    $this->data['shared_user'] = $shared_users;
    $this->data['shared_user_emails'] = $this->user_model->dropdown('id');

不能100%确定set_default做什么,但这应该不是一个问题,当试图解决这个…

编辑

这是包含在print_r变量中的内容:

使用:

<p>shared_user_emails:</p>
        <?php print_r($shared_user_emails); ?>
        <p>shared_user:</p>
        <?php print_r($shared_user); ?>
        <p>User:</p>
        <?php print_r($user); ?>
生产:

shared_user_emails:

Array (
    [2] => 2
    [3] => 3
    [17] => 17
    [19] => 19
)

shared_user:

stdClass Object (
    [template_id] => 58
    [user_id] => 3
)
用户:

stdClass Object (
    [id] => 19
    [name] => Steve
    [title] =>
    [phone] =>
    [ext] =>
    [email] => mike+whatev@fake.com
    [active] => 1
    [group_id] => 3
    [group] => users
)

和:$shared_user_emails[set_default($shared_user->user_id)]打印出"3"

你很可能在你的文章中打错了。

在你的控制器中你这样做:

$shared_users = $this->template_users->get_many_by('template_id', $template_id);
$this->data['shared_user'] = $shared_users;

请注意,变量$shared_users没有在此名称下分配给模板数据,但最后一个s丢失了。

在你的模板中:

<?php foreach($shared_user as $shared_user):?>

变量$shared_user使用了两次!这将用列表中的当前用户("as"后面的右侧变量)覆盖控制器中的用户列表(左侧变量)。在这个循环中,这是可以的,因为foreach在内部创建了数组的副本,以避免这里的混乱,但是在循环结束后,你不能访问列表,因为列表中的最后一个用户覆盖了列表。

不要在foreach循环中两次使用同一个变量。它总是看起来像一个错误,即使它可能不是一个错误。因为你在抱怨东西不工作,这是一个错误,它从你的控制器开始。没有理由不将列表命名为"users",将单个用户命名为"user"。

你想遍历所有共享用户。对于其中的每一个,您都希望输出:

<?= $shared_user_emails[set_default($shared_user->user_id)]; ?><br />
<label class="checkbox"><input type="checkbox" class="template_permissions" data-id="<?= $user->id?>"   <?= $checked ?> /><?= $user->email ?></label>

理论上这将导致类似这样的HTML:

3<br />
<label class="checkbox"><input type="checkbox" class="template_permissions" data-id="19" checked />mike+whatev@fake.com</label>

但只有当这个"mike"在共享用户列表中,否则该复选框将不被选中。

我认为你只需要将第一个循环扩展到第二个循环之外。目前它们没有重叠,所以除了由于打印错误而错误地使用第一个foreach循环外,您还一个接一个地执行了两个循环。

但是你真的不需要第二个内循环。此时您的问题是:users数组是否包含共享用户id?有一个PHP函数:in_array()。这使你想要的更清楚。

<?php $checked = (in_array($shared_user_emails[set_default($shared_user->user_id)], $user->id))? 'checked' : '' ; ?>