Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

Как правильно реализовать тестовое задание на должность PHP developer?

HR менеджер дал тестовое задание. Я выполнил. В ответ он сказал, что
я получил только краткий фидбек - не понравилось качество и стиль реализации.
Хочу вашего совета, что я не так написал. Вот задание:
Тестовое задание #1:
Версии ПО: PHP 5.3-5.6
Необходимо реализовать функцию, которая произведет чтение данных файла и вернет обработанные данные в указанном виде.
Функция должна: - Считать данные с файла - Разбить данные по строкам в массив - Отфильтровать массив таким образом, чтобы в нем остались лишь строки содержащие только числа - Суммировать числа в каждой строке - Отсортировать полученные суммы в порядке убывания - Вернуть результат
Пример кода:
# Путь к файлу данных $file = __DIR__ . '/datalist.txt'; # Передаем данные в функцию и получаем результат $result = getResult( $file ); # Отображаем результат echo '

'; 
     var_export( $result );
function getResult ( $file ) { # @TODO Реализовать... }
Пример результата работы функции: array ( 82 => 16396, 19 => 16169, 71 => 15864, 73 => 15224, 81 => 14244 ...
Кусок файла datalist.txt:
55 NTfy 591 405 kLj 48 644 768 164 ubd 837 oTft GPQV 163 ja 445 961 431 574 168 375 380 427 670 610 284 765 48 687 660 377 333 914 70 146 328 301 925 266 620 237 137 584 427 308 939 660 917 59 864 j hHo 279 tqpg 617 870 CoNJ 173 czgW 301 299 134 820 625 U 369 165 hutPN jiq 31 575 46 NS 397 378 954 764
Как я это реализовал:
# Путь к файлу данных $file = __DIR__ . '/datalist.txt'; # Передаем данные в функцию и получаем результат $result = getResult($file); # Отображаем результат echo '
';
var_export($result);
function getResult($file) { #Считать данные с файла. #Разбить данные по строкам в массив $line = file($file); $i = 0; foreach ($line as $value) { $ArrayLine = explode(' ', $value); foreach ($ArrayLine as $Record) { $result[$i] = 0; #Отфильтровать массив таким образом, чтобы в нем остались лишь строки содержащие только числа $CheckString = preg_replace('~[^A-Za-z]+~', '', $Record); if (strlen($CheckString) > 0) { unset($result[$i]); break; }; $res = (int) $Record; #Суммировать числа в каждой строке $result[$i] += $res; } $i++; } #Отсортировать полученные суммы в порядке убывания arsort($result); return $result; }


Ответ

Код
/** * Функция производит чтение данных из файла и возвращает обработанные данные согласно алгоритму * - Считать данные с файла * - Разбить данные по строкам в массив * - Отфильтровать массив таким образом, чтобы в нем остались лишь строки содержащие только числа * - Суммировать числа в каждой строке * - Отсортировать полученные суммы в порядке убывания * - Вернуть результат * * @param string $file * @return array */ function getResult($file) { $numbers = [];
$handle = @fopen($file, 'r'); if ($handle) { // Читаем файл построчно while (($buffer = fgets($handle, 4096)) !== false) { // Удаляет пробелы (или другие символы) из начала и конца строки $buffer = trim($buffer);
if (preg_match('/^[\d ]+$/', $buffer)) { // Разбиваем строку на числа, складываем получившийся массив чисел и записываем в массив $numbers[] = array_sum(explode(' ', $buffer)); } } }
// Сортируем массив по возрастанию (без сохранения отношений с ключами) rsort($numbers);
return $numbers; }
$result = getResult(__DIR__ . '/datalist.txt');
print_r($result);
Комментарии к коду:
По входному файлу, в примере, делаю следующий вывод. Функция разработана с учетом того, что числа только положительные и целые, и внутри слов нету чисел, например, oT89ft. И число не может идти рядом со словом, например, 200NTfy (то есть будет ли он считаться числом после удаление «нечисел»). Хоть в алгоритме указан шаг Разбить данные по строкам в массив, он пропускается, чтобы не «забивать» память (не происходило переполнение памяти). Потом что строк в файле может быть очень много. Чтение происходит построчно и в массив сразу вычисляется и записывается сумма. Длина строки при чтении ограничена length - 1 байт Не стал «доходить по паранойи»: сортирую массив встроенной в PHP функцией и не стал делать какой-нибудь composer-пакет с тестами. Комментарии на русском... Желательно на англ. писать, если компании не против, где работать будете — потом пригодится :)
Дополнительная информация
При написании (форматировании кода) я стараюсь следовать PHP Standards Recommendations, в частности:
PSR-1: Basic Coding Standard PSR-2: Coding Style Guide
Изучите информацию на сайте — пригодится.
И всегда обращайтесь и изучайте информацию по PHP на официальном сайте. Документация на русск. или англ. языках.
И не бойтесь ошибаться! Задавать любые вопросы на Stack Overflow!

Комментариев нет:

Отправить комментарий