Для начала четыре миллиона говорит о том, что задача не разбита на куски. Это очень большой массив, и его надо делать в режиме "возьми 10тыщ, сделай, возьми еще 10тыщ, сделай". Редко, но бывается когда все 4 млн важны, но как правило можно по тому что сделал создавать "подсчитанный массив", где есть те данные, что ты обработал и которые влияют на ещё необработанное.
Второе. array_search() точно делать не надо. Существенно дешевле просто обойти циклом, т.к. в этом случае все значения будут по ссылке и не будут сильно засирать память. array_search() так или иначе в каждом шаге обходит почти весь массив пока найдет что сказали. Проще делать
foreach ($arr1 as $k => $v) {
if (isset($arr2[ $i ]) || array_key_exists($i, $arr2)) {
//...
}
}
Третье для работы не с двухуровневым массивом, а с трех и более уровневым - надо делать на ссылках. У меня пару функций есть для этого, посмотрите реализации, если вам удастся их понять.
https://github.com/6562680/support/blob/main/src/X...
Для многоуровневых вы будете использовать walkeach(), get() и has()
Для двухуровневого вам это всё не нужно, вы используете foreach в foreach.
Четвертое. Задача бывает "выдать что они разные" а бывает "посчитать различия". Для первой foreach -> foreach сам бог велел. И как только нашли что разное - сразу break или break(2); и дальше не делаем. Для второй задачи сложнее, надо строить третий массив, а значит обходить всё и всегда.
Пятое. Часто задача может быть упрощена до "сравнить списки". В этом случае
// берем пачку, от которой скрипт не повиснет на час...
while (array_splice($arr1, 0, 10000) as $arrA) {
$list = array_column($arrA, 'column'); // и вот у нас одноуровневый список колонки, который нужно сравнивать с таким же одноуровневым из другого массива, что много проще делать.
}
Чаще всего именно таким способом решается сравнение больших массивов. Сначала вместо цифрового ключа делаем ключ с нашими данными, прогоняем оба массива создав два новых, где ключи - то что мы ищем, а потом сверяем разницу ключей, получаем отличие их друг от друга, или если хоть одного ключа нет - то вывод что массивы разные.