Вопрос №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;
}
То что функция выполняется, еще не означает то что она соответствует спецификации. Покажите что вам выводят тесты, там содержится ответ на ваш вопрос.
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.(( Спасибо!
Давайте посмотрим на эту строчку очень внимательно и попробуем ее прочитать. Первое что бросается в глаза это ошибка самого 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
А вы прошли наш курс "начало работы"?
Что касается отладки. Дебагер это хорошо, но вам в любом случае нужно уметь отлаживать через отладочную печать. Ставите print_r($var); в нужных местах и следите за изменением данных.
Еще замечание по вашему коду. Мутировать (изменять) массив по которому вы итерируете это очень плохая практика.
Большое спасибо за помощь и советы!!! Отличный проект! Отлично записаны курсы: качество звука, подачи материала, тестовые задания - всё на высшем уровне! Никакой воды на час-два-три, всё чётко, понятно и по делу. Большое удовольствие заниматься по вашей программе. Оперативная реакция тренера на вопросы - также очень приятно! Буду рекомендовать друзьям. Спасибо! Успехов Вам и вашей команде в развитии проекта!
Вам спасибо! Главное чтобы у вас заработало ;)
Таки заработало!))
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;
}
Воспользовался советом не мутировать итерируемый массив, и добавил в код временную копию исходного массива. Спасибо!
после этого нужно индексы по-хорошему поправить с помощью array_values, т.к. будут "дыры"
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







