Я пытаюсь сравнить два массива. Использование array_intersect не представляет проблем. При использовании array_diff и массивов с ~ 5000 значениями он работает. Когда я получаю до ~ 10000 значений, скрипт умирает, когда я получаю array_diff. Включение error_reporting ничего не привело.
Я попытался создать свою собственную функцию array_diff:
function manual_array_diff($arraya, $arrayb) { foreach ($arraya as $keya => $valuea) { if (in_array($valuea, $arrayb)) { unset($arraya[$keya]); } } return $arraya; }
source: Как работает array_diff?
Я ожидал бы, что он будет менее эффективным, чем официальный массив_дифф, но он может обрабатывать массивы размером ~ 10 000. К сожалению, оба array_diffs терпят неудачу, когда я добираюсь до ~ 15 000.
Я пробовал один и тот же код на другой машине, и он работает нормально, поэтому это не проблема с кодом или PHP. На этом конкретном сервере должен быть установлен некоторый предел. Любая идея, как я могу обойти этот предел или изменить его или просто узнать, что это такое?
Встретив ту же самую проблему, я действительно надеялся на ответ здесь.
Итак, я должен был найти свой собственный путь вокруг него и придумал следующий уродливый kludge, который работает для меня с массивами около 50 000 элементов. Это основано на вашем наблюдении, что array_intersect работает, но array_diff этого не делает.
Рано или поздно это также переполнит ограничения ресурсов, и в этом случае необходимо будет обрезать массивы и обработать меньшие биты. Мы перейдем через этот мост, когда мы придем к нему.
function new_array_diff($arraya, $arrayb) { $intersection = array_intersect($arraya, $arrayb); foreach ($arraya as $keya => $valuea) { if (!isset($intersection[$keya])) { $diff[$keya] = $valuea; } } return $diff; }
В моем php.ini:
max_execution_time = 60 ; Maximum execution time of each script, in seconds memory_limit = 32M ; Maximum amount of memory a script may consume
Могут ли отличия в этих настройках или, альтернативно, в производительности машины вызвать проблемы? Вы проверяли журналы ошибок веб-сервера (если вы запускаете это через один)?
Вы упомянули, что это работает в браузере. Попробуйте запустить скрипт через командную строку и посмотреть, отличается ли результат.