Laravel array_diff () как журнал изменений - PullRequest
0 голосов
/ 07 ноября 2018

В моей базе данных есть две строки json, которые содержат данные, которые я пытаюсь сравнить друг с другом, чтобы показать в журнале операций, чтобы увидеть, что пользователь изменил в записи: old_properties и properties.

Это мой текущий контроллер:

$properties = json_decode($log->properties, true);
$old_properties = json_decode($log->old_properties, true);
$changes = array_diff($properties, $old_properties);

Это мой клинок:

@foreach ($changes as $key => $value)
    {{$key}}: {{$value}}<br>
@endforeach

Так, например, если мои данные:

old_properties:  'name' => 'Matthew', 'state' => 'Oregon'
properties:      'name' => 'Samuel', 'state' => 'Oregon'

все, что я вижу из своих $ изменений: name: Samuel

Я пытаюсь отобразить следующее: name: Matthew -> Samuel или каким-либо другим способом показать, что было старым свойством и на что оно было изменено в той же строке.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Do Set Расчет может решить эту проблему:

<code>function printKeptAndUpdated ($setMapKeptAndUpdated, $setA, $setB) {
    $changes = [];
    foreach ($setMapKeptAndUpdated as $key => $value) {
        $changes[] = $key . ": " . $setA[$key]  . " -> " . $setB[$key];
    }
    echo("<pre>");
    print_r($changes);
    echo("
"); } $ old_properties = [ "ape" => "black", "кошка" => "белая", "собака" => "черный", "лиса" => "красный", ]; $ properties = [ "медведь" => "коричневый", "кошка" => "белая", "собака" => "желтый", "орел" => "серый", "лиса" => "белый", "жираф" => "желтый", ]; // Определить 2 набора массива, setA - старые данные набора, setB - новые данные набора. // setA и setB должны быть только одномерным массивом // какие элементы всегда являются парой ключ => значение. $ setA = $ old_properties; $ setB = $ properties; $ setMap = []; // Установить карту будет делать Установить расчет в будущем, // и подразумеваем эти 4 возможности: удалены, добавлены, сохранены (обновлены или нетронуты), // но показаны только 3 из них: удалено, добавлено, сохранено. // 4 возможности после расчета Set. $ setMapDeleted = []; $ setMapAdded = []; $ setMapKeptAndUpdated = []; $ setMapKeptAndUntouched = []; // Сначала помещаем $ setA в $ setMap. foreach ($ setA как $ key => $ value) { $ setMap [$ key] = "a"; } // Затем помещаем $ setB в $ setMap. foreach ($ setB как $ key => $ value) { if (array_key_exists ($ key, $ setMap)) { $ setMap [$ key] = "ab"; } еще { $ setMap [$ key] = "b"; } } // Итак, теперь структура $ setMap выглядит следующим образом // (только пример, не такой как текущие данные): // $ setMap = [ // "ape" => "b", // "bear" => "ab", // "кошка" => "а", // "собака" => "а", // "eagle" => "b", //]; // где "a" = setA - setB, "b" = setB - setA, "ab" = setA ∩ setB (пересечение) // Теперь завершаем вычисление Set, а также отделяем Set "keep" для установки "updated" и Set "нетронутыми". foreach ($ setMap as $ key => $ value) { if ($ value === "a") { $ setMapDeleted [$ key] = $ setA [$ key]; } elseif ($ value === "b") { $ setMapAdded [$ key] = $ setB [$ key]; } elseif ($ value === "ab") { if ($ setB [$ key] === $ setA [$ key]) { $ setMapKeptAndUntouched [$ key] = $ setB [$ key]; } еще { $ setMapKeptAndUpdated [$ key] = $ setB [$ key]; } } } printKeptAndUpdated ($ setMapKeptAndUpdated, $ setA, $ setB); // Распечатать результат, который вы хотите.
0 голосов
/ 07 ноября 2018

Похоже, вы могли бы сделать что-то вроде:

@foreach ($changes as $key => $value)
    {{$key}}: {{$old_properties[$key]}} -> {{$value}}<br>
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...