«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/09/23 08:19:03  №1268697 1
maxresd.jpg (156, 1280x720)
720x1280
Сделал граммар нази и опечаточники. Итак.
1) Граммар нази. Тут у меня есть ощущение, что я как-то не аутентично использую функции для работы с регулярками + там же надо делать исправление больших букв и я его добавил отдельным правилом т.е. не оче умно. Но т.к. я уже долго в этом вожусь - оставил как есть.
Задача: https://ideone.com/OW5uJV
2) Опечаточники. Тут ты, ОП, в спойлере у задачки оставил примеры текстов - которые добавляют дополнительные условия, т.е. в слове может быть несколько опечаток, или англ.символы могут идти подряд, что заставляет переписывать регулярки и код. Кароче пока тоже оставил как есть.
Задача: https://ideone.com/KmRlPx
P.S. В общем мне нужен пример решения, хочется двигаться дальше. ОП'чик скинь мне на мыло vovchenkoal@yandex.ru или телегу @y0urbe3tfr1end

Ответы: >>1268731 >>1269790
Аноним 2018/09/23 09:18:59  №1268731 2
>>1268697
Эти задачи решались 1000 раз, попробуй загуглить примеры по названиям функций/комментариям/ключевым словам. В гугле не забудь добавить приставку site:ideone.com, если ничего не нашлось пробуй без неё.
Ответы: >>1269790
Аноним 2018/09/24 22:25:06  №1269790 3
ОП не пропал, просто сейчас мало времени и много работы. Думаю, это временно (как и большинство вещей в жизни).

>>1268731

Искать лучше в архиве тредов: phpclub.tech

>>1268697
>>1268987

> 1) Граммар нази.
Лучше было бы не переделывать регулярки программно, а сразу написать их в нужном виде. Это облегчит восприятие кода и не надо будет его разбирать, чтобы понять, как они трансформируются.

Читать выражения вроде $rule[2] не очень удобно, потому массив можно разобрать на переменные вручную или конструкцией list:

list($regexp, $replace, $comment) = $rule;

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

А так, сделано хорошо.

> 2) Опечаточники.

Конечно, в слове может быть несколько замененных букв, почему нет?

Код можно было упростить, если разбить текст на слова, определить язык слова (по первой букве например или как-то еще) и искать в нем все буквы другого алфавита. Заодно можно было бы найти слова с несколькими опечатками.

Готового примера решения нет, другие решения можно поискать на phpclub.tech, там есть поиск.

>>1268596

Это из тестового задания? Теоретически, много. Почитай урок про структуру URL: https://github.com/codedokode/pasta/blob/master/network/urls.md

Знак вопроса впоне может встретиться в query string и в якоре неограниченное число раз. Однако, в некоторых случаях длина URL может быть ограничена браузером или веб-сервер может отказаться принимать слишком длинный URL. Например, апач в конфигурации по умолчанию, если не путаю, имеет лимит в районе 2000 байт.
Ответы: >>1269803
Аноним 2018/09/24 23:17:19  №1269803 4
В старом треде проверил посты с 20 сент. по сегодня: >>1269790 - зайдите и посмотрите, наверняка ваша задачка проверена.

Кстати, любопытная ссылка: правила выбора формы слова в зависимости от числа (1 человек, 2 человека, 5 человек) в разных языках: http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html

Анон с TDG, интересная штука, попоробую посмотреть позже.
Аноним 2018/09/25 00:43:47  №1269808 5
>>1269803

>Плюс, ты делаешь ошибку, $i[0] возвращает первый байт строки, а не первый символ, и многие символы в utf-8 занимают больше одного байта, так что ты можешь получить огрызок вместо символа. Лучше использовать mb_substr().

Да, я пропалил этот момент на примере с кавычкой, почему и сделал каличный подгон ^"?\w вместо просто ^\w, более тщательно можно было бы ^(\W+)?\w чтобы не только кавычки учесть.

А как через сабстр? Все равно же нужно знать порядковый номер, а он у первой буквы может быть рандомным, если там десяток точек или кавычек предшествует?
Ответы: >>1270394
Аноним 2018/09/25 00:48:17  №1269809 6
>>1269803
>Ну или сделать регулярку, ищущую слова из букв разных алфавитов.

Ты имеешь в виду ограничиться флагом /u или делать полноценные [aá] и т.д.?
Ответы: >>1270394
Аноним 2018/09/25 00:51:19  №1269810 7
>>1269803
https://ideone.com/Grtrs6
В который раз переделал задачу с текстовыми/числовыми вопросами. Проверьте, плз.

У меня возникли глупенькие вопросы.

1. Тайп-хинты на вход и выход, нужно стараться использовать везде где есть функции?

2. Как перехватить с помощью try-catch, ошибку возникшую из-за неправильно переданного типа? Заменить тайп-хинт на проверку внутри функции, которая будет выбрасывать исключение?

3. Решаю сейчас ООП-будильник, потом нужно будет решать Вектор или эти задачки взаимозаменяемые?
Ответы: >>1269863 >>1270393
Аноним 2018/09/25 07:30:17  №1269861 8
>>1269793
>>1269803
>Идея хранить содержимое теста в виде JSON мне не очень нравится, так как не будут работать внешние ключи (например, на выбранный вариант ответа) и не контролируется структура содержимого - а это значит, там быстро начнут накапливаться ошибки
Сами вопросы хранить в отдельной таблице( один(Тест) ко многому) и варианты ответа то же в отдельной таблице(один(Вопрос) ко многому)
Так что ли?
Ответы: >>1269864 >>1270393
Аноним 2018/09/25 07:35:02  №1269863 9
>>1269810
>1. Тайп-хинты на вход и выход, нужно стараться использовать везде где есть функции?
Да.
>2. Как перехватить с помощью try-catch, ошибку возникшую из-за неправильно переданного типа? Заменить тайп-хинт на проверку внутри функции, которая будет выбрасывать исключение?
>проверку внутри функции
Довен, тайпхинты как раз существуют, чтобы эти проверки РУКАМИ не делать?
Сделаешь , ты условие if(!is_bool){ throw new \RuntimeException("Не верный тип");, и чем это будет отличаться от ошибок которые выдает тебе интрепретатор?
Если типы не совпадают, то их нужно как-то приводить к нужному типу перед передачей в функцию.
Еще тайпхинты дают ахуенную подсказку при работе с IDE.


Аноним 2018/09/25 07:38:34  №1269864 10
>>1269861
Можешь и в одной, если количество вариантов ответов везде одинаково. Id вопроса, вопрос, правильный ответ, неправильный ответ №1, неправильный ответ №2, неправильный ответ №3. А при выводе ответы перемешивать.
Аноним 2018/09/26 01:35:54  №1270393 11
>>1269926

Хороший повод получше освоить CSS. Формы можно делать так:

<div class="f-row">
<div class="f-label">...</div>
<div class="f-widget">...</div>
</div>

Выровнять f-label/f-widget горизонтально можно с помощью display: inline-block, float, display: table, flexbox, и наверно как-то еще. Не забудь предусмотреть область для показа ошибок.

>>1269861

Да, логично сделать таблицу для вопросов и для вариантов ответов (для тех вопросов, где они есть). Вопросы бывают разных типов с разными полями - и есть несколько паттернов наследования таблиц для их реализации.

>>1269810

> https://ideone.com/Grtrs6

В общем, хорошо. Хотя, мне кажется, лучше бы если за определение числа баллов отвечал бы объект-вопрос. Он ведь знает правильный и почти правильный ответ, число баллов, наверняка может и сам посчитать сколько баллов полагается за ответ. Плюс, можно было бы сделать разные алгоритмы определения числа баллов для разных вопросов. Но твой вариант тоже годится.

> 1. Тайп-хинты на вход и выход, нужно стараться использовать везде где есть функции?
Да, чем больше тайп-хинтов, тем лучше. Они документируют код, он становится понятнее, и позволяют раньше обнаруживать ошибки в программе.

> 2. Как перехватить с помощью try-catch, ошибку возникшую из-за неправильно переданного типа?

Вообще, при неправильном типе поведение зависит от версии PHP. Дело в том, что в PHP, кроме исключений, есть еще "ошибки": notice, warning, fatal error, которые не являются исключениями и не ловятся try/catch (но ловятся при желании специальным обработчиком ошибок). Они по умолчанию пишутся в лог, могут выводиться на экран, и могут завершать или не завершать скрипт (в зависимости от уровня ошибки). Информацию можно поискать тут: http://php.net/manual/ru/book.errorfunc.php

Немного про них написано тут: http://anton.shevchuk.name/php/php-for-beginners-error-handling/

Некоторые фреймворки просто преобразовывают их в исключения, как описано тут: http://php.net/manual/ru/class.errorexception.php

В PHP7 часть фатальных ошибок была заменена на выброс исключения.

Соответственно, поймать такую ошибку сложно, если учесть, что она фатальная и завершает скрипт. Надо ставить обработчик ошибок, а в нем анализировать сообщение об ошибке (либо ловить исключение и анализировать его текст). Проще использовать предложенный тобой вариант (убрать тайп-хинт). Хотя я не представляю, когда нужно их перехватывать.

> 3. Решаю сейчас ООП-будильник, потом нужно будет решать Вектор или эти задачки взаимозаменяемые?

Решай в любом порядке, но лучше решить обе. Вектор посложнее.
Ответы: >>1270422
Аноним 2018/09/26 01:36:21  №1270394 12
>>1269809

Я имею в виду, искать слова, где есть буквы и латинницы, и кириллицы одновременно. Флаг u нужен в любом случае, он лишь говорит о работе с кодировкой utf-8 и нужен по сути всегда.

>>1269808

Я имел в виду вместо $i[0] использовать mb_substr($i, 0, 1) - это корректный код, так как он берет первый символ, а не первый байт. $i[0] это некорректно и описанную тобой проблему (символы в начале строки) никак не решает.

Что касается символов в начале строки - можно разбивать текст так, чтобы предложения всегда начинались с буквы. Или использовать preg_replace_callback с регуляркой, которая ищет именно первую букву предложения, а не первый символ.

>>1269806

> define('AMOUNT','(' . $number . ')');

Это плохая идея. Константу можно определить только один раз и при втором вызове функции произойдет ошибка. Также, в PHP7 используется слово const для определения константы. Тем более у тебя это не константа вообще - так как ее значение не постоянно, а зависит от переданного числа. Константы это неизменные значения. А в твоем случае нужна обычная переменная.

В общем:

- константы не создаются в функциях. Это ненормально, что функция меняет какие-то глобальные значения и не позволяет вызвать себя второй раз.
- константы это неизменные значения, а не то что у тебя

> if ($opNumber/100>=0) {
В чем смысл этого условия? Оно равносильно $opNumber >= 0.

> $firstDigit=floor($opNumber/100); $opNumber-=$firstDigit100; $firstDigit=$spelling[$firstDigit100];
Не пиши несколько команд в 1 строку, тяжело читать.

> $firstDigit=$spelling[$firstDigit*100];
Не надо использовать одну переменную для 2 разных типов значений (для числа и для строки) - это лишь усиливает путаницу.

> $x=($firstDigit&&$firstDigit!='ноль'?"$firstDigit ":'') . ($secondDigit&&$secondDigit!='ноль'?"$secondDigit ":'') . ($lastDigit&&$lastDigit!='ноль'?"$lastDigit":'');

Это нечитаемо. Тут надо использовать if/else. Также, не стоит делать сравнение со строкой. Надо было куда-то сохранить первую цифру и проверять именно ее, а не результат преобразования ее в строку. Это костыль, он сломается, если например мы поменяем написание слов или напишем их на другом языке.

> function numberToText($number,$arr=[]) {
Непонятно, зачем передавать сюда $arr. И название выбрано плохое - arr ничего не значит.

Рекурсия по моему только осложняет понимание кода. У тебя и так большая, сложная функция, и ты еще сильнее усложняешь ее. Более того, в ней тут нет никакой необходиомсти и без нее код будет только проще и читабельнее.

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

Надо учиться разбивать задачу на подзадачи. Делать код максимально простым и понятным.

Ты же не очень к этому стремишься и сделал одну огромную функцию numberToText. Надо разбить ее на составляющие. Не надо писать стену кода.

> $preString=preg_replace('/два тысячи/u','две тысячи',$preString);
Это кривые костыли, затрудняющие понимание кода. Ну представь, человек начнет разбирать твой код, увидит, что он генерирует строку "два тысячи", подумает, что в нем ошибка. И только потом, может, увидит, что в конце эта ошибка костылем испрвляется. Но почему нельзя сделать, чтобы там сразу бралось правильное слово? Зачем усложнять все и запутывать читателя? Так не годится.

> $preString="" . ($arr[2]?
preg_match('/(два|три|четыре)$/u',$arr[2])?"{$arr[2]} миллиона":(preg_match('/(один)$/u',$arr[2])?"{$arr[2]} миллион":"{$arr[2]} миллионов")

Это невозможно читать. Слишком запутанно. Необходимо переписать.

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

Если ты не знаешь, как разбить код на части, могу предложить один вариант (другие варианты тоже допустимы):

- делаем функцию выбора формы слова (тысяча, тысяч) в зависимости от числа
- делаем функцию, которая преобразует число от 0 до 999 в строку
- делаем функцию, которая разбивает большое число на части и записывает его, вызывая функции выше

У каждой функции должна быть своя задача, и логичный, простой набор аргументов и возвращаемых значений.
Ответы: >>1270770
Аноним 2018/09/26 04:55:27  №1270422 13
>>1270391
>как это аккуратно сделать
Яваскриптом.
>>1270393
>Не забудь предусмотреть область для показа ошибок
Ошибки во всплывающем окошке выводятся.
Аноним 2018/09/26 23:05:43  №1270770 14
Ответы: >>1270820 >>1271603
Аноним 2018/09/27 05:50:02  №1270820 15
>>1270770
Ебать ты англичанин.
Аноним 2018/09/28 18:06:43  №1271603 16
>>1270770
ОООпчик, ты меня проглядел?((( Смотрю, уже ниже спустился по ответам.
Ответы: >>1271942
Аноним 2018/09/29 14:30:18  №1271942 17
>>1271603
Дичайший быдлокод (в плане самого алгоритма), ещё и с английскими комментариями. Фу, бля.
Ответы: >>1272029
Аноним 2018/09/29 17:02:56  №1272029 18
>>1271942
Ну я и есть нубас. В прошлый раз Оп мне на ошибки указал, я их исправляю потихонечку. Сейчас еще укажет надеюсь, я снова переделаю. Так, глядишь, и научусь чему.
Ответы: >>1272066
Аноним 2018/09/29 17:55:13  №1272066 19
>>1272029
Всё правильно, так и надо. Только не создавай затруднения уже на начальном этапе. Смотри, как этот код примерно должен выглядеть: https://ideone.com/DyCEJU
Ответы: >>1272082 >>1272245 >>1272343
Аноним 2018/09/29 19:09:34  №1272082 20
>>1272066
Ох, мне аж чуть плохо не стало, подумал 1С.
Аноним 2018/09/30 07:02:10  №1272245 21
>>1272066
Надо на работе как-нибудь захерачить сразу в продакшен такое. Начальника с инфарктом скорая увезет, наверно...
Аноним 2018/09/30 10:55:39  №1272343 22
Ответы: >>1272361
Аноним 2018/09/30 11:18:06  №1272361 23
Ответы: >>1272475
Аноним 2018/09/30 16:18:33  №1272475 24
Capture.JPG (103, 1366x768)
768x1366
>>1272361
Че такой дерзкий? Выпускной сертификат от ОП-а показал быстро
Ответы: >>1272484
Аноним 2018/09/30 16:42:26  №1272484 25
>>1272475
> Выпускной сертификат от ОП-а показал быстро
Твоя опа-хреньворкщица сама сертификат не хочет показать? Или там только справка бакалавра?