2013-05-01 127 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' : '' ; ?>