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);
// Распечатать результат, который вы хотите.