[英]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.