Вопрос №2935 от пользователя Виталий Сенокосов в уроке «Массив», курс «Основы PHP»

Виталий Сенокосов

Добрый день. Друзья, почему этот код не проходит последний тест? В NetBeans всё прекрасно отрабатывает без замечаний.

function uniq($arr)
{
    for($i = 0; $i < sizeof($arr) - 1; $i++)
    {
        for($j = $i + 1; $j < sizeof($arr); $j++)
        {
            if($arr[$i] == $arr[$j])
            {
                unset($arr[$j]);
            }
        }
    }
    return $arr;
}
9 0

Kirill Mokevnin

То что функция выполняется, еще не означает то что она соответствует спецификации. Покажите что вам выводят тесты, там содержится ответ на ваш вопрос.

0

Виталий Сенокосов

make: Entering directory `/usr/src/app' PHPUnit 5.1.4 by Sebastian Bergmann and contributors.

....E 5 / 5 (100%)

Time: 34 ms, Memory: 3.25Mb

There was 1 error:

1) App\SolutionTest::testUniq with data set #4 (array(10, 1, 2, 3, -10), array(10, 1, 2, 10, 3, 2, -10)) Undefined offset: 3

/usr/src/app/Solution.php:12 /usr/src/app/SolutionTest.php:16

FAILURES! Tests: 5, Assertions: 4, Errors: 1. make: *** [test] Error 2 make: Leaving directory `/usr/src/app'

Run failed! Check and fix errors above!

Я интуитивно догадываюсь, что просто он не может найти удалённое на предыдущих итерациях цикла значение по индексу 3, но просто NetBeans даже Notice не вывел, а дал на выход правильный массив.

ЗЫ: И еще огромная просьба. Так как я в php полный новичок, пожалуйста, для таких же как я дайте ссылку на урок/курс/инструкцию, как настроить рабочее место (среду разработки) на php для atom, а то на сайте при решении заданий трудно дебажить без возможности пошагового выполнения и отслеживания переменных и т.д. Пошагово: как устанавливать, как подключать пакеты, какие пакеты, расширения и т.д. под Windows. Полдня промучался - и так толком не настроил. Приходится пока использовать NetBeans.(( Спасибо!

0

Kirill Mokevnin

Давайте посмотрим на эту строчку очень внимательно и попробуем ее прочитать. Первое что бросается в глаза это ошибка самого php Undefined offset: 3. Это означает что при определенных ситуациях ваша функция начинает вести себя не правильно и обращается к третьему элементу массива, а его нет.

Вот из этого сообщения App\SolutionTest::testUniq with data set #4 (array(10, 1, 2, 3, -10), array(10, 1, 2, 10, 3, 2, -10)) можно сделать вывод что для вашей функции применяется вот этот набор данных (array(10, 1, 2, 3, -10), array(10, 1, 2, 10, 3, 2, -10)). Глядя на структуру этих данных можно заметить что левый массив является как раз результатом применения функции uniq к правому массиву.

Собирая все вместе:

Вашей функции на вход передали array(10, 1, 2, 10, 3, 2, -10), при этом ожидалось что она вернет array(10, 1, 2, 3, -10). Но вместо этого внутри вашей функции произошла ошибка Undefined offset: 3.

p.s. Вам тесты еще строчки подсказывают куда смотреть /usr/src/app/Solution.php:12 /usr/src/app/SolutionTest.php:16

0

Kirill Mokevnin

А вы прошли наш курс "начало работы"?

Что касается отладки. Дебагер это хорошо, но вам в любом случае нужно уметь отлаживать через отладочную печать. Ставите print_r($var); в нужных местах и следите за изменением данных.

0

Kirill Mokevnin

Еще замечание по вашему коду. Мутировать (изменять) массив по которому вы итерируете это очень плохая практика.

0

Виталий Сенокосов

Большое спасибо за помощь и советы!!! Отличный проект! Отлично записаны курсы: качество звука, подачи материала, тестовые задания - всё на высшем уровне! Никакой воды на час-два-три, всё чётко, понятно и по делу. Большое удовольствие заниматься по вашей программе. Оперативная реакция тренера на вопросы - также очень приятно! Буду рекомендовать друзьям. Спасибо! Успехов Вам и вашей команде в развитии проекта!

1

Kirill Mokevnin

Вам спасибо! Главное чтобы у вас заработало ;)

0

Виталий Сенокосов

Таки заработало!))

function uniq($arr)
{
    $tmp = $arr;
    for($i = 0; $i < sizeof($arr) - 1; $i++)
    {
        for($j = $i + 1; $j < sizeof($arr); $j++)
        {
            if($arr[$i] == $arr[$j])
            {
                unset($tmp[$j]);
            }
        }
    }
    return $tmp;
}

Воспользовался советом не мутировать итерируемый массив, и добавил в код временную копию исходного массива. Спасибо!

0

Zahar Steblovskiy

после этого нужно индексы по-хорошему поправить с помощью array_values, т.к. будут "дыры"

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
7 июля 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
7 июля 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
7 июля 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
7 июля 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
7 июля 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
7 июля 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
7 июля 5 месяцев