Объединение двух циклов foreach

Немного предыстории моей функции:

Мы создали приложение, которое позволяет вам что-то создавать и делиться, последний шаг — поделиться этим с другими пользователями.

У меня есть представление, которое выводит всех пользователей и флажок рядом с каждым именем. Используя AJAX, если вы установите или снимите флажок, он вставляет в таблицу базы данных идентификатор пользователя и идентификатор общего элемента.

Таким образом, мне нужно соединить две таблицы, чтобы увидеть, кто поделился с ними элементом. Одна таблица содержит элемент, а другая таблица содержит тех, с кем им поделились.

На данный момент у меня есть цикл foreach, который извлекает все общие идентификаторы пользователей:

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

То есть, если общий идентификатор пользователя равен идентификатору пользователя, примените к входу «проверено». Это отлично работает, но только для ОДНОГО пользователя, а не для всех.

Все делится и работает правильно, однако будет установлен только ОДИН флажок, вместо того, чтобы проверять всех пользователей, если они были разделены.

Я считаю, что мне нужно каким-то образом объединить эти два для каждого цикла, это явно только втягивание последнего человека, которым поделились, и проверка его поля.

Я пытался объединить эти две петли около дня, может ли кто-нибудь протянуть руку?

Спасибо!

ИЗМЕНИТЬ

Вот как переменные создаются внутри моего контроллера:

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
)

общий_пользователь:

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 as $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 используется дважды! Это перезаписывает список пользователей (левая переменная) из вашего контроллера текущим пользователем в этом списке (правая переменная после «как»). Это нормально внутри этого цикла, потому что 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 из-за опечатки, вы также выполнили два цикла один за другим.

Но вам действительно не нужен второй, внутренний цикл. Вопрос, который у вас есть на данный момент: содержит ли массив пользователей общий идентификатор пользователя? Для этого есть функция 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