Я создаю форму для следующих действий:
- Распечатка таблицы пользователей и разрешений, извлекаемых из MySQL. Каждое разрешение, которое есть у пользователя, является отмеченным флажком, а каждое из них, которое им не хватает, является отмеченным флажком.
- Разрешить администратору устанавливать и снимать флажки для предоставления или удаления разрешений.
- Когда форма отправлена, покажите страницу подтверждения ТОЛЬКО пользователями, чьи разрешения будут изменены, выделив конкретные изменения.
- Когда изменения будут подтверждены, измените базу данных соответствующим образом.
Для этого я создаю два массива пользовательских разрешений: один в соответствии с тем, что показывает база данных, и один в соответствии с тем, что показывает форма.
Если у пользователя нет разрешения в MySQL, оно будет отображаться как 0. Если у него нет разрешения при отправке формы, его просто не будет.
Вот два простых примера массивов:
Массив базы данных
[User1] => Array ([public] => 1
[private] => 1
[secret] => 1
)
[User2] => Array ([public] => 1
[private] => 0
[secret] => 0
)
Массив отправки формы (отзыв «секретного» из User1 и передача его User2)
[User1] => Array ([public] => 1
[private] => 1
)
[User2] => Array ([public] => 1
[secret] => 1
)
Вопрос
Как мне элегантно объединить эти два массива , чтобы создать массив "изменений", такой что:
- Пользователи с одинаковыми разрешениями в обоих случаях не указываются
- Остальные пользователи имеют все разрешения - общедоступные, частные и секретные - равные 0 или 1.
- Каждое разрешение равно 0, если оно отсутствовало в массиве отправки формы, и 1, если оно было в массиве отправки формы
Например, объединение вышеперечисленного даст:
[User1] => Array ([public] => 1
[private] => 1
[secret] => 0
)
[User2] => Array ([public] => 1
[private] => 0
[secret] => 1
)
Попытки пока
- В качестве первого шага я попытался использовать array_merge () с указанным на втором месте массивом форм, полагая, что он перезапишет массив базы данных там, где они различаются. Вместо этого были удалены элементы, которые отличались.
- Я попытался настроить оператор foreach () для сравнения двух массивов, но это становится сложным, и я думаю, что должен быть более простой способ
* * ОБНОВЛЕНИЕ тысячи сорок-девять
Уф! Новый ответ снова привлек мое внимание к этому старому вопросу. У меня все получилось, но позже я удалил этот сумасшедший код - он был слишком сложным, чтобы вернуться и работать с ним. Вместо этого я написал PHP-сценарий для изменения одного разрешения за раз, затем написал AJAX-интерфейс для отправки изменений по нему. Гораздо более простой код, и изменения происходят мгновенно для пользователя. Эффект выделения позволяет мгновенно получить на странице информацию о том, что изменилось.