Основы 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; }

Артем Нуралиев

Хотелось бы уточнить про дебаггинг и отладочную печать. print_r($var) нужно ставить в NetBeans или же здесь в онлайне? Для меня не было бы лишним видеть пошаговое исполнение кода, т. к. не всегда могу понять, какие ошибки мне показываются. Синтаксические вроде исправляю, а вот что означает Undefined offset: 3 не понял бы.

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

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

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; }

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

Kirill Mokevnin

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

Kirill Mokevnin

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

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

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

/usr/src/app/SolutionTest.php

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.(( Спасибо!

Kirill Mokevnin

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

Zahar Steblovskiy

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

Kirill Mokevnin

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

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

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

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

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