За последние 24 часа нас посетили 20177 программистов и 1085 роботов. Сейчас ищут 720 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем drkrol, 29 мар 2020.

  1. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Здравствуйте.
    Суть:
    Как получить данные, что во второй записи был добавлено 2 массива и убран 1?
    То есть информирование и в случае добавления, и в случаи удаления.
    Мне нужно получить именно массивы, а не элементы (слова).
    PHP:
    1. $a1 = array(
    2.   ['витамин С', 'витамин Б', 'Сахар'],
    3.   ['цинк', 'витамин Б'], // удалён
    4.   ['медь', 'Сахар', 'войлок'],
    5.   ['Кальций', 'Магний', 'Железо'],
    6.   ['Кислота', 'Витамин К', 'Витамин Е']
    7. );
    8.  
    9. $a2 = array(
    10.   ['витамин С', 'витамин Б', 'Сахар'],
    11.   ['медь', 'Сахар', 'войлок'],
    12.   ['Кальций', 'Магний', 'Железо'],
    13.   ['Кислота', 'Витамин К', 'Витамин Е'],
    14.   ['Лимонад', 'витамин Б'], // добавлен
    15.   ['Заяц', 'витамин Б', 'Кролик'], // добавлен
    16. );
    Первая мысль, которая была у меня - это добавить в массив md5 каждую строку и сравнивать с помощью array_diff_assoc, но уже md5. Но я предполагаю, что это не совсем правильное решение, так как перевод каждой строки в md5 будет занимать время и память. Может быть есть какое-нибудь встроенное решение или более оптимизированное?

    На данный момент у меня вот так:
    Код (Text):
    1. $a1 = array(
    2. ['111', '111', '111'],
    3. ['222', '222'],
    4. ['333', '333', '333'],
    5. );
    6. $a2 = array(
    7. ['111', '111', '111'],
    8. ['333', '333', '333'],
    9. ['444', '444', '444'],
    10. );
    11. $new_a1 = array();
    12. $new_a2 = array();
    13. foreach ($a1 as $value) {
    14. $hash = md5(json_encode($value));
    15. $new_a1[$hash] = $value;
    16. }
    17. foreach ($a2 as $value) {
    18. $hash = md5(json_encode($value));
    19. $new_a2[$hash] = $value;
    20. }
    21. $added = array_diff_assoc($new_a2,$new_a1);// Добавлено
    22. $remove = array_diff_assoc($new_a1,$new_a2);// Удалено
    23. vardump($added);
    24. echo "<br>";
    25. vardump($remove)
    оно работает, только мне кажется, что это не совсем правильно
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень