«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2016/09/10 11:45:57  №839461 1
Приветы. Прокомментируйте, пожалуйста, код по задачам ОПа.

Калькулятор: http://ideone.com/a3O2X9

Навигатор (поиск кратчайшего пути): http://ideone.com/VNWZl0 [Как сделать с рекурсией не догнал, поэтому решил алгоритмом Дейскры]

Числа прописью: http://ideone.com/Vap7Ez

Компания "Вектор" ооп: http://ideone.com/Vd0MKA [в комментах несколько вопросов, на которые хотелось бы получить ответ :)]
Ответы: >>840636 >>844746 >>848545
Аноним 2016/09/18 14:35:48  №843899 2
Как настроить Апач для работы со слимом? Если использовать встроенный сервер, то всё работает нормально, но с Апачем, к примеру, используя get, всё нормально выводится только на самой главной странице, а с "/hello/{name}" работать не хочет, просто пишет, что страница не найдена.
Ответы: >>843901 >>850875
Аноним 2016/09/19 11:30:52  №844390 3
Хм, возвращает почему-то текущую html-страницу с названием и расширением нужного файла: http://ideone.com/Eyqu6c

Значение $path="D:\xampp\htdocs\filehosting2\public\files\2016\09\18\tumblr_ny1r8pfaBf1ref7bto1_500.png"

В папке files в .htaccess прописал XSendFile On
Ответы: >>844408 >>848304 >>850875
Аноним 2016/09/19 12:42:07  №844408 4
14742781276890.png (, 646x491)
491x646
>>844390
Так же, не смотря на то, что я кодирую название файла и он выглядит так в оригинале "название файла.png":
<a href="/filehosting2/public/download/66/%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0.png">Скачать</a>

при скачивании он обрезается до пробела (см. картинку)
Почему?
Ответы: >>844411 >>848304 >>850875
Аноним 2016/09/19 23:13:50  №844746 5
>>839461
>Калькулятор: http://ideone.com/a3O2X9
>-2.43+3.62/2.1*9.02=5.1113333333333
Странно, гугл выдал 13.1187619048

Что-то у тебя всё не понятно с алгоритмом. Я бы сделал так:

Разбил строку на данные и операторы с помощью регулярных выражений
Определил приоритет выполнения действий
Выполнил действия

https://ideone.com/JibpcY
Возможны баги с отрицательным выражением без пробелов и отрицательным числом

Аноны, оцените моё решение тоже. Как вы думаете мне стоит тоже начинать помогать новичкам?
Я лично считаю, что у меня может быть не понятно почему я получаю новую строку и рекурсивно её считаю вместо того чтобы просто изменить имеющуюся и продолжать её вычислять. А дело в том, что в месте где мы считаем действия с 33 строки, при переназначении выражения на число, мы теряем ключи(номера позиции) данных и вместе с этим теряем возможность обращаться к предыдущему или следующему элементу от стоящего между ними элемента(оператора).

Я всегда замечал с собой то что я иногда переусложняю код, что говорит о моих пробелах в знаниях php. Я боюсь что мои подходы будут плохими примерами.
Ответы: >>844751 >>844828 >>850875
Старые ответы Аноним 2016/10/05 05:38:19  №850875 6
>>843899

.htaccess наверно нужен.

>>844390

Надо смотреть заголовки HTTP ответа в отладчике браузера.

>>844408

Я не могу на 100% быть уверен, но возможно обрезается из-за того, что расширение в URL стоит PNG, а Content-Type в HTTP ответе стоит text/html. Возможно из-за противроречия фаерфокс обрезщает имя файла. Или же из-за того, что ты использовал

attachment; filename=' . basename($path))

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

И кстати в комментариях к задаче вроде упомянуто, что использовать filename= не надо.

>>844746

Ты можешь помочь, отвечая на какие-то вопросы, которые ты точно знаешь, например про задачи которые ты уже решал, или платиновые вопросы про то, сколько времени надо изучать. Только отвечай без фанатизма, будь доброжелателен и отвечай если ты уверен в ответе.

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

Для начала, мы "парсим" (делаем лексический анализ, если говорить умным языком) выражение, преобразуя строку в массив токенов (лексем): "2 + 2 / 2" => ['2', '+', '2', '/', '2'].

Затем, используя алогритм сортировочной станции, мы преобразуем массив токенов в выражение в обратной польской нотации - RPN (это когда знак операции пишут не между операндами, а после): ['2', '+', '2', '/', '2'] => ['2', '2', '2', '/', '+'].

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

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

Ссылки:

- https://habrahabr.ru/post/100869/
- https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BE%D1%87%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D0%B0%D0%BD%D1%86%D0%B8%D0%B8
- https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C

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

- сначала выражение разбивается на токены
- затем мы проходим по массиву токенов и, учитывая приоритет операций, делаем синтаксический анализ. На выходе мы получим AST = дерево разбора (абстрактное синтаксическое дерево). Это такая конструкция, состоящая из узлов, которые соответствуют числам и операциям:

- http://aliev.me/runestone/Trees/ParseTree.html
- https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7

Простейший способ получить дерево разбора - это алгоитм рекурсивного спуска. Есть и более сложные алгоритмы.

Имея дерево, мы можем вычислять значение выражения или делать над ним любые преобразования.

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

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

Если тебе захочется больше почитать про алгоритмы, то могу посоветовать такие ссылки:

- http://aliev.me/runestone/
- SICP, перевод на русский: http://newstar.rinet.ru/~goga/sicp/
- гуглить "лексический и синтаксический анализ"
- книга "Ахо А., Сети Р., Ульман Д. Компиляторы. Принципы, технологии, инструменты." (довольно сложная)