รวมสอง foreach ลูป

พื้นหลังเล็กน้อยเกี่ยวกับคุณสมบัติของฉัน:

เราได้สร้างแอปพลิเคชันที่ช่วยให้คุณสามารถสร้างและแชร์บางสิ่งได้ ขั้นตอนสุดท้ายคือการแชร์กับผู้ใช้รายอื่น

ฉันมีมุมมองที่พิมพ์ผู้ใช้ทั้งหมดและช่องทำเครื่องหมายถัดจากชื่อแต่ละชื่อ การใช้ AJAX หากคุณทำเครื่องหมายหรือยกเลิกการทำเครื่องหมายในช่อง ระบบจะแทรก ID ผู้ใช้และ ID ของรายการที่แชร์ลงในตารางฐานข้อมูล

ดังนั้น ฉันจึงต้องเข้าร่วมสองตารางเพื่อดูว่าใครแชร์รายการนั้นกับพวกเขา ตารางหนึ่งจะเก็บรายการไว้ ส่วนอีกตารางจะเก็บผู้ที่ถูกแชร์ด้วย

ในขณะนี้ ฉันมี foreach loop ที่ดึง 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] => [email protected]
    [active] => 1
    [group_id] => 3
    [group] => users
)

และ: $shared_user_emails[set_default($shared_user->user_id)] พิมพ์ "3"


person user1696090    schedule 01.05.2013    source แหล่งที่มา
comment
เนื้อหาของ $shared_user, $shared_user_emails[set_default($shared_user->user_id)] และ $user คืออะไร set_defaultทำอะไร?   -  person Rolando Isidoro    schedule 02.05.2013
comment
เพิ่มสิ่งที่คุณต้องการด้านบน ไม่แน่ใจว่า set_default ทำอะไรได้บ้าง แต่นั่นไม่ควรนำมาใช้เมื่อแก้ไขปัญหานี้   -  person user1696090    schedule 02.05.2013
comment
นั่นไม่มีประโยชน์มากนักเนื่องจากไม่แสดงเนื้อหาของตัวแปร วางผลลัพธ์ print_r() สำหรับแต่ละรายการ   -  person Rolando Isidoro    schedule 02.05.2013
comment
เรียบร้อยแล้ว แจ้งให้เราทราบหากคุณต้องการอื่นๆ...   -  person user1696090    schedule 02.05.2013
comment
$shared_user ในฐานะ $shared_user นี่คือเหตุผลว่าทำไมฉันถึงคิดแค่ผู้ใช้คนแรกเท่านั้น   -  person Drahcir    schedule 02.05.2013
comment
ใช่ ฉันเห็นปัญหา มันแค่เปรียบเทียบ 1 แทนที่จะทำกับผู้ใช้ทั้งหมด ฉันคิดว่าฉันจำเป็นต้องใช้อาร์เรย์หรืออะไรสักอย่าง คิดไม่ออก ›‹   -  person user1696090    schedule 02.05.2013
comment
ฉันหมายความว่าไม่ควร foreach $shared_users เป็น $shared_user ใช่ไหม พิมพ์ผิดที่เป็นไปได้?   -  person Drahcir    schedule 02.05.2013


คำตอบ (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 loop ดูเหมือนว่าจะเป็นข้อผิดพลาดอยู่เสมอ แม้ว่าอาจจะไม่ใช่ข้อผิดพลาดก็ตาม เนื่องจากคุณบ่นเกี่ยวกับสิ่งที่ใช้งานไม่ได้ สิ่งนี้จึงเป็นข้อผิดพลาด และมันเริ่มต้นในคอนโทรลเลอร์ของคุณ ไม่มีเหตุผลใดที่จะไม่ตั้งชื่อรายการ "ผู้ใช้" และผู้ใช้รายเดียวเป็น "ผู้ใช้"

ดังนั้นคุณจึงต้องการวนซ้ำผู้ใช้ที่แชร์ทั้งหมด สำหรับแต่ละสิ่งที่คุณต้องการส่งออก:

<?= $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 loop แรกไม่ถูกต้องเนื่องจากพิมพ์ผิดแล้ว คุณยังทำสองลูปต่อกันอีกด้วย

แต่คุณไม่ต้องการวงที่สองวงในจริงๆ คำถามที่คุณมี ณ จุดนี้: อาร์เรย์ผู้ใช้มีรหัสผู้ใช้ที่ใช้ร่วมกันหรือไม่ มีฟังก์ชัน PHP สำหรับสิ่งนี้: in_array() ทำให้ชัดเจนยิ่งขึ้นว่าคุณต้องการอะไร

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