@del993788

Как найти отличия между многомерными массивами?

Я вчера задавал вопрос: Как можно найти отличия между двумя данными? ,но там был массив обычный. А как быть, когда массив имеет такой вид?
$a1 = array(
  ['витамин С', 'витамин Б', 'Сахар'], 
  ['цинк', 'витамин Б'], // удалён
  ['медь', 'Сахар', 'войлок'],
  ['Кальций', 'Магний', 'Железо'],
  ['Кислота', 'Витамин К', 'Витамин Е']
);

$a2 = array(
  ['витамин С', 'витамин Б', 'Сахар'], 
  ['медь', 'Сахар', 'войлок'],
  ['Кальций', 'Магний', 'Железо'],
  ['Кислота', 'Витамин К', 'Витамин Е'],
  ['Лимонад', 'витамин Б'], // добавлен
  ['Заяц', 'витамин Б', 'Кролик'], // добавлен
);


Суть:
Как получить данные, что во второй записи был добавлено 2 массива и убран 1?
То есть информирование и в случае добавления, и в случаи удаления.
Мне нужно получить именно массивы, а не элементы (слова).

Первая мысль, которая была у меня - это добавить в массив md5 каждого и сравнивать с помощью array_diff_assoc, но уже md5. Но я предполагаю, что это не совсем правильное решение, так как перевод каждой строки в md5 будет занимать время и память. Может быть есть какое-нибудь встроенное решение или более оптимизированное?
  • Вопрос задан
  • 912 просмотров
Пригласить эксперта
Ответы на вопрос 3
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Надо сформировать "деревья" с уникальными узлами.
Для каждого дерева: root - это уникальная строка из всего массива.
"Листья" дерева - это ссылки на "корни" объектов подобных "деревьев".
"Узлы" дерева - это номера строк из массива.

И затем, проводить с ними логические операции.
Ответ написан
@Ressiver
Сперва по первому массиву идём и проверяем каждый элемент (подмассив) на наличие во втором массиве. Потом так же по второму массиву.
foreach ( ... ){
If (in_array())
}
Ответ написан
@Shinen
Я не знаю на сколько сильно это ударит по производительности, но можно каждый массив перегнать в json и потом сравнивать строки. Если массивы не шибко большие, то наверно особо сильно тормозить не будет. Можно чексум этих строк сравнивать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы