массив php проверьте, что добавлено, что удалено, что изменено

#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;
 

На данный момент у меня есть массив добавленных заданий, массив удаленных заданий и для каждого уже существующего задания массив по добавленным причинам и один для удаленных

В настоящее время это мое базовое решение для моих нужд