#php #arrays
Вопрос:
В форме редактирования у меня есть возможность добавлять задания и указывать причины для задания (не обязательно). Первое, что я делаю, — это извлекаю текущее состояние до изменения, чтобы получить такой массив из моего запроса:
Array (
[1] => Array (
[0] => 3
[1] => 4
)
[3] => Array (
[0] => 11
)
)
Где числовое значение ключа представляет идентификатор задания, а его значение в массиве-идентификатор любых причин.
Итак, в примере работа с id = 1 имеет причины с идентификаторами 3 и 4, работа с id = 3 имеет причину с идентификатором 11 и так далее
Из формы я получаю массив с идентификаторами заданий, размещенных следующим образом
Array (
[0] => 1
[1] => 3
)
И для каждого задания массив, содержащий его причины, такие как
ids_reasons_1 = Array (
[0] => 3
[1] => 4
)
ids_reasons_3 = Array ( [0] => 11 )
Теперь я должен обнаружить любые изменения: если я добавил задание, если я удалил задание и если я добавил или удалил некоторые причины из ранее существовавших заданий
Первый подход , который я попытался использовать array_key_exists
,-это определить, была ли работа ранее существующей или она новая
if(array_key_exists(job_id, array_value_from_database):
Если он возвращает значение true, это задание, которое уже существует, в противном случае это новое задание, но я не знаю, как определить, было ли удалено существующее задание
Очевидно, что в рамках гипотетического foreach
я также должен проверить, изменились ли причины каждого опубликованного задания по сравнению с теми, которые были ранее сохранены в базе данных
Не могли бы вы показать мне, как внести какие-либо изменения в то, что было сохранено ранее, как в отношении работы, так и по ее причинам
Необходимо отслеживать, кто и что делает во время таких изменений
Комментарии:
1. «…но я не знаю, как определить, удалено ли существующее задание» — чтобы определить это, вам нужно проверить, отсутствуют ли какие-либо идентификаторы из базы данных в вашем новом массиве идентификаторов заданий. Как для этого, так и для того, чтобы проверить, были ли добавлены/удалены какие-либо причины, я рекомендую изучить
array_diff
.2. array_diff Я могу использовать его по причинам, которые представляют собой два простых массива, и я должен делать это в обоих направлениях, в противном случае у меня есть только один тип информации, но для заданий, которые являются ключом массива, взятым из запроса, как я могу определить, что было удалено ?
3. Вы можете извлечь ключи с
array_keys
помощью . Затем вы можете сравнить разницу между ключами массива базы данных и значениями нового массива заданий, как и в любых других двух массивах.4. Хорошая идея, теперь я приступлю к работе и посмотрю, выйду ли я, спасибо, на случай, если я вернусь, чтобы спросить 😉
5. @Роберт, скажи, что ты обнаружил, и что теперь дальше?
Ответ №1:
Мой основной подход
// Retrieve the previous values from the db (see example array in the first post)
$array_query = $this->get_work_mot_prec($this->input->post('id'));
// Retrieve only the keys representing the job id from the array retrieved from the query
$work_key = array_keys($array_query);
// I get the added jobs
$diff_work_add = array_diff($this->input->post('ids_work'), $work_key);
// I get the removed jobs
$diff_work_del = array_diff($work_key, $this->input->post('ids_work'));
var_dump($diff_work_add);
var_dump($diff_work_del);
Таким образом, у меня есть два массива, которые содержат добавленные задания и удаленные задания, и я могу сохранять события журнала при изменении заданий
Теперь по причинам, если задание было добавлено как новое, мне не нужно сохранять журнал, связанный с причинами, потому что все это новое, и задание забирает с собой все, поэтому я должен обнаруживать изменения только для уже существующих заданий
// Cycle the job ids sent by the form
foreach($this->input->post('ids_work') as $work):
// If it's a new job don't check
if( ! array_key_exists($work, $diff_work_add)):
echo '<br><br>Motivation for work added: '.$work.'<br>';
// I collect any additional reasons
$diff_mot_add = array_diff($this->input->post('ids_mot_'.$work), ( (isset($arr_work_mot_prec[$work])) ? $arr_work_mot_prec[$work] : [] ) );
var_dump($diff_mot_add);
echo '<br><br>Motivation for work deleted: '.$work.'<br>';
// I collect any removed reasons
$diff_mot_del = array_diff( ( (isset($arr_work_mot_prec[$work])) ? $arr_work_mot_prec[$work] : [] ), $this->input->post('ids_mot_'.$work));
var_dump($diff_mot_del);
endif;
endforeach;
На данный момент у меня есть массив добавленных заданий, массив удаленных заданий и для каждого уже существующего задания массив по добавленным причинам и один для удаленных
В настоящее время это мое базовое решение для моих нужд