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

drkrol

Постоялец
Регистрация
6 Мар 2016
Сообщения
112
Реакции
11
Здравствуйте.
Суть:
Как получить данные, что во второй записи был добавлено 2 массива и убран 1?
То есть информирование и в случае добавления, и в случаи удаления.
Мне нужно получить именно массивы, а не элементы (слова).
PHP:
$a1 = array(
  ['витамин С', 'витамин Б', 'Сахар'],
  ['цинк', 'витамин Б'], // удалён
  ['медь', 'Сахар', 'войлок'],
  ['Кальций', 'Магний', 'Железо'],
  ['Кислота', 'Витамин К', 'Витамин Е']
);

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


Первая мысль, которая была у меня - это добавить в массив md5 каждую строку и сравнивать с помощью array_diff_assoc, но уже md5. Но я предполагаю, что это не совсем правильное решение, так как перевод каждой строки в md5 будет занимать время и память. Может быть есть какое-нибудь встроенное решение или более оптимизированное?

На данный момент у меня вот так:
PHP:
$a1 = array(
  ['111', '111', '111'],
  ['222', '222'],
  ['333', '333', '333'],
);
$a2 = array(
  ['111', '111', '111'],
  ['333', '333', '333'],
  ['444', '444', '444'],
);
$new_a1 = array();
$new_a2 = array();
foreach ($a1 as $value) {
  $hash = md5(json_encode($value));
  $new_a1[$hash] = $value;
}
foreach ($a2 as $value) {
  $hash = md5(json_encode($value));
  $new_a2[$hash] = $value;
}
$added = array_diff_assoc($new_a2,$new_a1);// Добавлено
$remove = array_diff_assoc($new_a1,$new_a2);// Удалено
vardump($added);
echo "<br>";
vardump($remove)
оно работает, только мне кажется, что это не совсем правильно
 
Здравствуйте.
Суть:
Как получить данные, что во второй записи был добавлено 2 массива и убран 1?
То есть информирование и в случае добавления, и в случаи удаления.
Мне нужно получить именно массивы, а не элементы (слова).
PHP:
$a1 = array(
  ['витамин С', 'витамин Б', 'Сахар'],
  ['цинк', 'витамин Б'], // удалён
  ['медь', 'Сахар', 'войлок'],
  ['Кальций', 'Магний', 'Железо'],
  ['Кислота', 'Витамин К', 'Витамин Е']
);

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


Первая мысль, которая была у меня - это добавить в массив md5 каждую строку и сравнивать с помощью array_diff_assoc, но уже md5. Но я предполагаю, что это не совсем правильное решение, так как перевод каждой строки в md5 будет занимать время и память. Может быть есть какое-нибудь встроенное решение или более оптимизированное?

На данный момент у меня вот так:
PHP:
$a1 = array(
  ['111', '111', '111'],
  ['222', '222'],
  ['333', '333', '333'],
);
$a2 = array(
  ['111', '111', '111'],
  ['333', '333', '333'],
  ['444', '444', '444'],
);
$new_a1 = array();
$new_a2 = array();
foreach ($a1 as $value) {
  $hash = md5(json_encode($value));
  $new_a1[$hash] = $value;
}
foreach ($a2 as $value) {
  $hash = md5(json_encode($value));
  $new_a2[$hash] = $value;
}
$added = array_diff_assoc($new_a2,$new_a1);// Добавлено
$remove = array_diff_assoc($new_a1,$new_a2);// Удалено
vardump($added);
echo "<br>";
vardump($remove)
оно работает, только мне кажется, что это не совсем правильно
Если оно работает и ты не упираешься в производительность, зачем менять?
 
А почему не использовать Для просмотра ссылки Войди или Зарегистрируйся ?
Функция array_diff() возвращает массив, состоящий из значений массива массив_1, которые отсутствуют в любом другом массиве, перечисленном в последующих аргументах.
 
не, вы немного не поняли. Мне нужно вернуть массив (строку) массивов, а не массив элементов. У меня многомерный массив.

$addedToA1 = array_diff(array_column($a1, 0), array_column($a2, 0));
$addedToA2 = array_diff(array_column($a2, 0), array_column($a1, 0));

Если у вас первый элемент подмассива четко идентифицирует запись. Если нет, то вместо array_column можно использовать array_reduce. Он как раз приведет подмассив к строке.

Также можно использовать array_map с json_encode для приведения к строке. все будет быстрее чем md5
 
Назад
Сверху