Скорее всего причина в пропусках другая, в любм случае exec вызывается несколько раз и должен выполнить команду столько раз сколько запустился. Добавьте логирование, чтоб найти где он валится.
Павел, end-1 такого нет. Но если вам нужно их получать последовательно то можно воспользоваться функцией array_pop(), она получает последний элемент массива и удаляет его оттуда. Т.е. после получения последнего элемента массива предпоследний становится последним.
Рональд Макдональд, "быстрый алгоритм поиска минимума и максимума" это название? Ничего кроме этого я не вижу. Не вижу смысла утруждаться написанием собственного алгоритма если сортировка реализована уже на низком уровне, которой хватает в 99.99% задач. Вполне может быстрее отработать мой второй вариант, так как нужно не всё сортировать, а искать минимумы/максимумы на массиве чисел и по ключам уже получать элементы.
Второй вариант: получить список ключей array_keys(), найти в них минимальный min() и максимальный элемент max(), и с ними уже получить доступ в исходном массиве по ключу.
Наверное, потому, что в коде вы не просите перегенерить a и b новыми рэндомными числами перед отрисовкой квадрата, он и рисует 5 квадратов на одном и том же месте.