2013-05-01 119 views
0

一些背景知识对我的特点:结合两个“的foreach”循环

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

我有一个视图,打印出每个名字旁边的所有用户和复选框。使用AJAX,如果选中或取消选中一个框,它会将用户标识和共享项目的标识插入到数据库表中。

因此,我需要加入两张表以查看谁与他们共享了该项目。一个表格包含该项目,另一个表格包含与其共享的人员。

目前,我有一个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' : '' ; 

也就是说,如果共享用户标识等于用户标识,则将“已检查”应用于输入。这个工作很好,但只适合一个用户,而不是循环遍历它们。

所有东西都在共享和正常工作,但是只有一个复选框会被选中,而不是所有的用户被共享。

我相信我需要以某种方式结合这两种每个循环,它显然只在最后一个人,其被分享,并检查他们的盒子拉动。

我已经尝试过将这两个环路合并一天了,任何人都可以伸出援助之手吗?

谢谢!

编辑

这里是如何的变量从我的控制器内创建:set_default确实

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%肯定的,但试图解决时,这不应是一个问题这个...

编辑

这是包含在使用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] => [email protected] 
    [active] => 1 
    [group_id] => 3 
    [group] => users 
) 

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

+0

'$ shared_user','$ shared_user_emails [set_default($ shared_user-> user_id)]'和'$ user'是什么内容? 'set_default'做什么? – 2013-05-01 21:04:15

+0

在上面添加了你需要的东西,并不完全确定set_default的作用,但是在解决这个问题时不应该发挥作用 – user1696090 2013-05-01 21:07:20

+0

这不是很有用,因为它没有显示变量的内容。为每个人粘贴'print_r()'结果。 – 2013-05-01 21:08:42

回答

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

不要在foreach循环中两次使用相同的变量。它总是看起来像是一个错误,尽管它可能不是一个。既然你抱怨东西不工作,这是一个错误,它从你的控制器开始。没有理由不将名单命名为“用户”,单个用户“用户”。

所以你想循环所有共享用户。对于这些想要的输出:

<?= $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 />[email protected]</label> 

但是,只有当这种“迈克”是共享用户的名单上,否则复选框将不会被选中。

我认为你只需要扩展第一个循环。目前它们不会重叠,所以除了错误地使用由于错字造成的第一个foreach循环外,您还一个接一个地执行了两个循环。

但你真的不需要第二个内部循环。您现在的问题是:users数组是否包含共享用户标识?这里有一个PHP函数:in_array()。这使得它更清楚你想要什么。

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