结合两个“foreach”循环

时间:2013-05-01 20:46:22

标签: php codeigniter foreach

我的功能背景:

我们构建了一个允许您创建和共享内容的应用程序,最后一步是与其他用户共享。

我有一个打印出所有用户的视图和每个名称旁边的复选框。使用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”

1 个答案:

答案 0 :(得分:1)

你最有可能在你的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在内部创建了一个数组的副本以避免混淆,但是在循环结束后,你以后无法访问该列表,因为列表中的最后一个用户覆盖了列表。 / p>

不要在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' : '' ; ?>