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