繁体   English   中英

结合两个“ 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,则将“选中”应用于输入。 这很好用,但仅适用于一个用户,而不是循环浏览所有用户。

一切都在共享并且正常工作,但是将仅选中一个复选框,而不是检查所有用户是否已共享。

我相信我需要为每个循环将这两种方式结合起来,这显然只是拉进了最后一个被共享的人并选中他们的方框。

我已经尝试将这两个循环组合使用大约一天,有人可以伸出援手吗?

谢谢!

编辑

这是从控制器内部创建变量的方式:

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”

您很可能在foreach中输入了错误。

在您的控制器中,您可以执行以下操作:

$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>

但是仅当此“麦克”位于共享用户列表中时,否则不会选中该复选框。

我认为您只需要将第一个循环扩展到第二个循环之外即可。 当前它们不重叠,因此除了由于错字错误地使用第一个foreach循环外,您还一个接一个地执行了两个循环。

但是您确实不需要第二个内部循环。 此时的问题是:users数组是否包含共享的用户ID? 为此有一个PHP函数: in_array() 这样可以使您更加清楚自己想要什么。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM