«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/09/25 00:34:30  №1269806 1
ЧИСЛА ПРОПИСЬЮ
https://pastebin.com/bZ8iHwsK

Горжусь тем, что впендюрил рекурсию (никогда не понимал, что это за херь вообще, а после того, как нафармил 4кю на кодеварсах более-менее вкурил, и поди ж ты, уже в задачках использую как щеголь!)

Не горжусь уебищными тернарниками для решения вопросов пола. Надо было на стадии, когда с числами работал внутри рексурсии, как автор советовал, решать, т.к. потом после обработки массива с числительными у меня уже не числа, а строки, пришлось матчить регекспом.
Ответы: >>1270394
Аноним 2018/09/26 01:36:21  №1270394 2
>>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 23:05:43  №1270770 3
Ответы: >>1270820 >>1271603
Аноним 2018/09/27 05:50:02  №1270820 4
>>1270770
Ебать ты англичанин.
Аноним 2018/09/28 18:06:43  №1271603 5
>>1270770
ОООпчик, ты меня проглядел?((( Смотрю, уже ниже спустился по ответам.
Ответы: >>1271942
Аноним 2018/09/29 14:30:18  №1271942 6
>>1271603
Дичайший быдлокод (в плане самого алгоритма), ещё и с английскими комментариями. Фу, бля.
Ответы: >>1272029
Аноним 2018/09/29 17:02:56  №1272029 7
>>1271942
Ну я и есть нубас. В прошлый раз Оп мне на ошибки указал, я их исправляю потихонечку. Сейчас еще укажет надеюсь, я снова переделаю. Так, глядишь, и научусь чему.
Ответы: >>1272066
Аноним 2018/09/29 17:55:13  №1272066 8
>>1272029
Всё правильно, так и надо. Только не создавай затруднения уже на начальном этапе. Смотри, как этот код примерно должен выглядеть: https://ideone.com/DyCEJU
Ответы: >>1272082 >>1272245 >>1272343
Аноним 2018/09/29 19:09:34  №1272082 9
>>1272066
Ох, мне аж чуть плохо не стало, подумал 1С.
Аноним 2018/09/30 07:02:10  №1272245 10
>>1272066
Надо на работе как-нибудь захерачить сразу в продакшен такое. Начальника с инфарктом скорая увезет, наверно...
Аноним 2018/09/30 10:55:39  №1272343 11
Ответы: >>1272361
Аноним 2018/09/30 11:18:06  №1272361 12
Ответы: >>1272475
Аноним 2018/09/30 16:18:33  №1272475 13
Capture.JPG (103, 1366x768)
768x1366
>>1272361
Че такой дерзкий? Выпускной сертификат от ОП-а показал быстро
Ответы: >>1272484
Аноним 2018/09/30 16:42:26  №1272484 14
>>1272475
> Выпускной сертификат от ОП-а показал быстро
Твоя опа-хреньворкщица сама сертификат не хочет показать? Или там только справка бакалавра?