• Как получить координаты нужного километра на трассе или по километрам?

    Moskus
    @Moskus
    Для самостоятельного вычисления вам понадобится любая ГИС, куда вы сможете загрузить геометрию дороги, вынутую из osm через overpass turbo, а потом, начиная с известной точки километрового столба, разделить геометрию на отрезки заданной длины (километр), присвоив им соответствующие имена.
    Ответ написан
    1 комментарий
  • Как програмно узнать, на какую букву слова падает ударение?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    1. Целесообразно ли на PHP - да.
    2. Нет слова - разбивка на "дерево" триграмм.
    3. Ударения - только комплексный анализ: через словарь с базой ударений в разных словоформах (число, падеж, род и т.д.) и через обученную нейронку на "цепочках" слов (смысловая контекстная валидация).
    Ответ написан
    Комментировать
  • Серверная часть для чата?

    @SEOVirus
    Пока что склонен к Node.js из-за поддержки веб-сокетов, но как тогда быть с БД?

    А в чём проблема использования Node.js с БД? Да хотя бы PostgreSQL используйте.
    Ответ написан
    1 комментарий
  • Серверная часть для чата?

    alexfilus
    @alexfilus
    Senior backend developer
    Посмотрите в сторону hasura.io
    Очень простая в освоении, но мощная штука. Требует PostgreSQL. У них на ютуб канале есть урок по созданию чата. Там всё очень просто.
    Ответ написан
    4 комментария
  • Как защитить сайт от взлома по GET запросу?

    $var_name = htmlspecialchars(trim(strip_tags(stripslashes($_POST['var_name']))));
    $var_name = htmlspecialchars(trim(strip_tags(stripslashes($_GET['var_name']))));
    Ответ написан
    Комментировать
  • Вывод вложенного массива из многомерного массива?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    В самом низу написал — зачем такой код писать не нужно...

    Готовый код под вашу задачу:
    <?php
    
    $input = '{"success":true,"data":[{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Jeonbuk Hyundai Motors","Suwon Samsung Bluewings"],"commence_time":1588932000,"home_team":"Jeonbuk Hyundai Motors","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[1.75,3.85,3.7]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[1.74,3.8,3.65]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[1.87,3.96,3.5]}},{"site_key":"betfair","site_nice":"Betfair","last_update":1588281947,"odds":{"h2h":[1.68,1.28,1.25],"h2h_lay":[85.0,85.0,85.0]}},{"site_key":"paddypower","site_nice":"Paddy Power","last_update":1588281989,"odds":{"h2h":[1.67,4.2,3.6]}}],"sites_count":5},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Sangju Sangmu FC","Ulsan Hyundai FC"],"commence_time":1589000400,"home_team":"Ulsan Hyundai FC","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[3.85,1.88,3.3]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[3.8,1.85,3.25]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[3.76,1.92,3.5]}}],"sites_count":3},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Daegu FC","Incheon United"],"commence_time":1589009400,"home_team":"Incheon United","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[2.23,2.95,3.2]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[2.2,2.9,3.2]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[2.28,2.98,3.3]}}],"sites_count":3},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Sangju Sangmu FC","Seongnam FC"],"commence_time":1589018400,"home_team":"Sangju Sangmu FC","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[2.38,2.75,3.2]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[2.35,2.7,3.15]}}],"sites_count":2},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["FC Seoul","Gangwon FC"],"commence_time":1589095800,"home_team":"Gangwon FC","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[2.38,2.75,3.2]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[2.35,2.7,3.15]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[2.42,2.84,3.2]}}],"sites_count":3}]}';
    $data = json_decode($input, true);
    
    function grabBookerData(array $data, string $bookerName): array {
        return array_map(function(array $item) use ($bookerName) {
            // Собираем результирующий объект события
            $event             = new \stdClass();
            $event->sport_nice = $item['sport_nice'] ?? null;
            $event->teams      = $item['teams'] ?? [];
        
            // Из данных по разным букмекерам оставляем h2h, который нам нужен
            $bookersData = array_column($item['sites'], null, 'site_key');
            $event->h2h  = $bookersData[$bookerName]['odds']['h2h'] ?? [];
            
            return $event;
        }, $data['data'] ?? []);
    }
    
    var_dump(grabBookerData($data, 'unibet')); // итоговый набор данных

    sandbox.onlinephpfunctions.com/code/6cb94c1070692d...

    Зачем не нужно писать такой код:
    Такого плана данные лучше пропускать через сериалайзер, а потом просто фильтрануть в результирующих объектах (или просто достать) нужные данные.
    Плюс использования сериалайзеров — не нужно писать код выше, а нужно только писать свои объекты в уже нужном для вас формате. И потом данные маппить на эти объекты через сериалайзеры, тем самым не заплетаться в исходных данных.

    Сериалайзеры на PHP:
    Fractal (рекомендую)
    Symfony Serializer
    Zend Serializer
    JMS Serializer — его многие ругают за неторопливость и монструозность, но он довольно функциональный и забирает на себя кучу телодвижений, я бы делал с ним. Он становится небольшой проблемой, когда десятки и тысячи операций идут за некоторое непозволительное число серверов/времени.
    Ответ написан
    5 комментариев
  • Насколько хорош w3schools.com для старта в изучении php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Гайд по РНР w3shools считается позором РНР сообщества. Его называют не иначе как w3fools.

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

    Надо взять нормальну книгу, выше уже рекомендовавшуюся Котерова и Симдянова.

    Хочу сразу предостеречь от видеокурсов на ютубе. Снимают их люди, не сильно ушедшие от вас в плане опыта, привлечённые обманчивой простотой языка РНР. Всех их роднит одно свойство - они отлично рассказывают что делать, когда всё работает. Но ни один не объясняет, что делать, когда ничего не работает и как сделать, чтобы всегда работало. У всех авторов с ютубочки (как и с w3fools) кругозор с гулькин нос. Они поголовно не понимают, что нацарапанный ими код работает только в тепличных условиях, но тут же ломается в реальном окружении, ведет к ошибкам и уязвимостям.

    про geeekbrains ничего не могу сказать, а htmlacademy.ru пока не стоит своих денег.
    Хотя их подход достаточно интересный - учться с наставником, но учебник очень неровный - местами ничего, а местами написан левой пяткой, компиляция из тех же w3fools и устаревших учебников.

    После освоения теории надо переходить к практике. Написать что-то своё. Гостевую книгу, маленькую соцсеть. сервис-файлохранилище, страничку игрового клана.

    Поле этого надо правдамии неправдами искать работу джуна в офисе. Любая учёба которая подразумевает варку в собственном соку приводит к деградации.

    Собствено говоря, в реальности существует два языка РНР - нормальный современный язык программирования и РНР говнокодеров с w3shools. Последний очень живуч, благодаря миллионам сайтов и видео, которые продвигают его. И нормальному РНР практически нерально научиться где-то кроме нормального офиса.
    Ответ написан
    Комментировать
  • Насколько хорош w3schools.com для старта в изучении php?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    w3schools.com и geekbrains точно не те сервисы, на которые стоит полагаться. Ловушка кроется в несистемном подходе, неприученности работы с документацией и оторванности от реального использования языка. Из курсов хороши hexlet.io и некоторые авторские, но они все платные

    На тостере есть много ответов, как стартовать в изучении php, нужно начинать с зарекомендовавших себя книг, как PHP7 Котерова, Симдянова, потом можно Мэтта Зандрстру . Еще есть книга от Лоры Томсон и Люка Веллинга
    Ответ написан
    6 комментариев
  • Кто должен знать о ссылке в MVC?

    pOmelchenko
    @pOmelchenko
    php-developer
    В веб приложениях нет mvc. Есть запрос и ответ. Как выше уже сказали есть роуты которые и решают вашу проблему

    https://laravel.com/docs/7.x/urls#urls-for-named-routes

    echo route('user.show', ['user' => 1]);
    
    // http://example.com/user/1
    Ответ написан
    Комментировать
  • Как сделать систему переписки сообщений?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Как сделать систему переписки?
    сесть и сделать. Написать код(клиента и сервера), создать бд/таблички, настроить сокеты... Много чего сделать чтоб создать...

    Ну как в ВК, или Telegram.
    Вообще 2 разные системы, первая сайт-соцсеть, вторая приложение.

    Как сделать её быстрой?
    Оптимизировать код, оптимизировать запросы, купить сервер по мощнее, раздать всем быстрый интернет...

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

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

    Редактирование и удаление сообщений.
    Да. В смысле делай. Все так же, код редактирования, код удаления...
    Ответ написан
    5 комментариев
  • Как хранить дочерние классы в бд?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    А в бд мне нужно просто создать 4 таблицы для каждого вида? Или есть другой способ?
    Описание слишком примитивное. От нюансов зависит. Если свойства не постоянные(или имеется вероятность изменения количества свойств) то будет таблица сущностей с общими свойствами, переменные свойства выносятся в отдельную таблицу, а наличие свойства у конкретного экземпляра в другую таблицу. В итоге джоином 3 таблиц получают кастомный набор свойств у любого экземпляра.
    Если это принципиально разные классы объектов (например товары и публикации - обе сущности имеют заголовок, описание, дату создания... но есть еще куча разных свойств. и это реально разные по логике сущности) то наследуются от базового объекта, и далее каждый имеет свою таблицу и свои классы.
    Ответ написан
    2 комментария
  • Как реализовать нестрогий поиск на php?

    deepblack
    @deepblack
    $search_text = 'лист';
    
    array_filter($array, function($el) use ($search_text) {
            return ( strpos($el['text'], $search_text) !== false );
        });


    https://github.com/loilo/Fuse
    spoiler
    <?php
    require_once 'vendor/autoload.php';
    
    $fuse = new \Fuse\Fuse([
      [
        "title" => "Old Man's War",
        "author" => "John Scalzi"
      ],
      [
        "title" => "The Lock Artist",
        "author" => "Steve Hamilton"
      ],
      [
        "title" => "HTML5",
        "author" => "Remy Sharp"
      ],
      [
        "title" => "Right Ho Jeeves",
        "author" => "P.D Woodhouse"
      ],
    ], [
      "keys" => [ "title", "author" ],
    ]);
    
    $fuse->search('hamil');
    
    /*
    Array
    (
      [0] => Array
        (
          [title] => The Lock Artist
          [author] => Steve Hamilton
        )
      [1] => Array
        (
          [title] => HTML5
          [author] => Remy Sharp
        )
    )
    */
    Ответ написан
    Комментировать
  • Как сделать вебхук с Qiwi в telegram оповещение об пополнении?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Такие вопросы уже обсуждались на тостере, нужно написать телеграм-бота, который взаимодействует с киви по апи и кидает оповещения в телегу
    Как правильно переделать оплату QIWI в Telegram боте?
    дока по апи киви
    дока по созданию и работе с телеграм ботами
    Ответ написан
    Комментировать
  • Как логически организовать защиту от удаления чужих записей?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Есть такая штука - авторизация, и есть такое понятие как овнершип (владение) и ACL/RBAC. Во всех скриптах проверяется кто владелец файла, или кто может его изменять/удалять. Если у пользователя есть права на изменение/удаление объекта - скрипт отрабатывает, если нет - выдает ексепшн или иначе оповещает о неудачном завершении.
    Ответ написан
    2 комментария
  • Как правильно сделать несколько параллельных циклических процесса на PHP?

    R0dger
    @R0dger
    Laravel/Yii/2 AngularJs PHP RESTful API
    Очереди не подходят? Есть событие, вы его в очередь, дальше из очереди достали и выполнили, или я что-то пропустил?
    Ответ написан
    4 комментария
  • Dependency Injection Container, попробовал на практике - не понял смысла?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Контейнер
    Главная задача контейнера — переиспользовать сервисы более одного раза, например некий провайдер более чем в 1 месте или некий Sender в 20 местах по всему приложению. И упростить к ним доступ.

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

    Взаимодействие относительно простых объектов/сущностей в рамках одного слоя лучше делать вашим способом — оно логичное и понятное и вообще контейнер будет только мешать, даже больше — не к месту в этой задаче. Это вам в ответе на том форуме и отметили.

    Современные контейнеры предоставляют на самом деле еще ооочень много фишек: автовайринг, когда вам и конфиг писать не нужно, просто в конструкторе написали класс, а контейнер если нашел такой класс, то сам и сконфигурирует (и также учтет его параметры конструктора), то есть разработчику остается работа только с уникальными и не стандартными ситуациями.
    Или дает упрощенные фабрики/билдеры/декораторы.

    Dependency Injection
    И в будущем удобно будет тестировать ?

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

    Главное не объединяйте эти два понятия. Сам паттерн — просто частный случай инверсии зависимости, класс получил зависимость через конструктор/сеттер, и все, он не знает деталей, потому и тестить проще — просто подменил на пустышку.
    А контейнер — средство для работы со сложным приложением, которое внедряет как раз таки, то есть выполняет работу внедрения. Центральное в нем — слово контейнер.

    Несколько точек входа
    По поводу ваших точек входа: несколько точек входи = несколько иницализаций.
    Как-бы они разные по своей сути приложения уже по определению получаются.
    Но вы можете упростить, и вынести инициализацию контейнера в абстракцию — в некий класс App/Kernel и там это делать, а в точке входа инициализировать не контейнер раз за разом, а именно конкретное приложение.
    Ответ написан
    7 комментариев
  • Как узнать что это фото уже ранее было загружено?

    DevMan
    @DevMan
    если дубликат - это 100% совпадение, просто сохранять его хэш и проверять при загрузке.
    если допускается частичное совпадение, то все становится сложнее.
    Ответ написан
    Комментировать
  • Как сформировать xml для запроса к wsdl на php?

    AlekseyNikulin
    @AlekseyNikulin
    недочеловек
    IgorNoskov, Roman Biz верно тебе указал ссылку.

    Вот пример
    // Работать с SOAP очень просто.
    $client = new SoapClient('https://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL');
    
    // можем посмотреть список доступных методов
    print_r($client->__getFunctions());
    
    // теперь можно вызвать метод с нужным параметром. Вернет объект.
    $result = $client->GetCursOnDateXML(['On_date' => '2019-08-09']);
    
    // Так как разработчики в cbr не компетентны и не умеют работать полноценно с SOAP, то они прибегают
    // к механике:- "Главное нам хорошо, а все остальные пусть крутятся"
    // Ответ возвращается ввиде XML, а не структурой, поэтому нужно этот ответ преобразовать в массив.
    
    print_r(simplexml_load_string($result->GetCursOnDateXMLResult->any));
    Ответ написан
    1 комментарий