Задать вопрос
  • Что неправильного в моем коде?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988

    сводить эти команды в турнируную таблицу с условиями (гость, хозяин), круг 1, круг 2 и еще 5-6 условий, которые влияют на список.


    Заглянул в код, думаю прочитаю, что там за 5-6 условий таких. И где ?
    Класс генерации у вас занимается чем угодно (контролер,модель,вьюшка), но не умеет "строить турнирнирную таблицу".
    Ну почитайте вы о предметной области до написания кода. Эти ваши 5-6 условий помогли бы Вам определить какой алгоритм нужен для построения. Что там команды должны отыграть сезон (каждый должен встретиться с каждым и дважды в роли хозяина и во второй раз как гость). Игры на выезде по хорошему должны стоять так чтобы команды успели доехать, отдохнуть, провести там тренировку.

    Или это турнир на вылет. Опять разные варианты. После 1го или 2х поражений.
    Там этих уже придуманных схем много и врядли Вам дали уж совсем что-то уникально придуманное.

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

    Второе. Не знаю в какую контору Вы собеседовались, но стоило поискать какие фреймворки они используют. Или это было прям заданием "писать на чистом PHP". тогда нужно было следовать советам из "правильный путь"
    Ответ написан
    Комментировать
  • Что неправильного в моем коде?

    Как минимум, Вы не вникли в задачу. Я вот в футболе практически не разбираюсь - получив такое задание, я пошёл бы в гугл узнавать, как проводятся матчи в турнирах, когда команда играет на своём поле, а когда - нет. Даже по своим скудным знаниям могу кое-что предположить:
    1) Первый круг: команды надо разбить на пары случайным образом. Это shuffle() + array_chunk() . У Вас этого нет.
    1.1) Учесть ситуацию, когда команд - нечётное количество. Этого тоже нет.
    2) в парах какую-то команду назначить хозяином. Соответственно, в выводе в колонке "Хозяева" должно быть не повторение "Хозяева", "Хозяева", "Хозяева", а имена команд
    3) дальше надо смотреть, на каких условиях проводится второй круг, кто в него попадает, на своём поле играют или на чужом..

    Получается, из этого:
    загружать через форму файл json со списком команд, а потом сводить эти команды в турнируную таблицу с условиями (гость, хозяин), круг 1, круг 2 и еще 5-6 условий, которые влияют на список
    Вы выполнили только "загружать через форму файл json", причём зачем-то этот файл сохраняете на диск, а потом немедленно читаете обратно.

    Сергей Вам справедливо указал на "разделение обязанностей", то бишь первую букву в SOLID - Single Responsibility Principle. Даже если оставить на месте выверт с сохранением на диск, получается:
    1. Repository - хранилище данных
    2. метод контроллера, отвечающий за приём данных именно в виде сабмита формы и сохранение их Repository
    3. Генератор текущего круга
    4. View, который отвечает за генерацию html-разметки круга,
    5. метод контроллера, который может извлечь данные из Repository, скормить их генератору, получить результат и скормить его во View.


    И не факт, что методы из 2 и 5 пункта принадлежат одному классу.
    Ответ написан
    Комментировать
  • Что неправильного в моем коде?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Вы получили простое задание, но это не значит, что код нужно написать абы как, лишь бы результат был =). Элементарные вещи стоило бы использовать,как то: автозагрузка классов, шаблонизация.

    0. Код на облачном диске. Почему не гитхаб? Это же удобнее (и плюс в карму=).
    1. Инклуд файлов, вместо автозагрузки классов. Написать автозагрузчик - дело пяти минут. Даже одна минута, если использовать composer.
    2. Разделение мух и котлет. Код отдельно, html-разметка отдельно. Простейший php-шаблонизатор - это тоже пять-десять минут.
    Вот так вообще нельзя писать: echo '<tr><th scope="col">Первый круг</th></tr>';
    3. Разделение обязанностей. У вас один класс и файлы загружает, и читает загруженные, и турнирную таблицу рассчитывает и рендерит ее.
    4. range(0, 19); Почему 20 элементов? Почему не 30? Откуда это число взялось? Его не должно быть в коде.
    5.
    $probablePairsArr[] = range(0, 19);
    $probablePairsArr = $probablePairsArr[0];

    Интересный финт. В чём его сакральный смысл - не ясно. Да и использование локальной переменной здесь не требуется. Можно сразу создавать массив в свойстве класса.

    Наверное всё. Больше там ничего нет.
    Ответ написан
    7 комментариев
  • Как упростить метод, выполняющий операции для всех других методов класса, если он получается слишком раздутым?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Сделать декомпозицию и разбить на несколько методов. Или даже на целый класс с группой различных методов с разными опциями.
    Ответ написан
    Комментировать
  • Как упростить метод, выполняющий операции для всех других методов класса, если он получается слишком раздутым?

    @rPman
    Вам зачем нужна прослойка? Что бы заменить некрасивый синтаксис curl_xxx на свой некрасивый?

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

    Обычно не доходят до того, чтобы создать под каждый тип запроса свой метод, но как минимум нужно создать метод request, который под капотом будет:
    * обрабатывать авторизацию
    * обрабатывать ошибки сети и отслеживать лимиты сервиса и отправлять повторные запросы
    * выжидать необходимые таймауты
    * обрабатывать пакетные запросы, к примеру если сервис требует постранично работать с данными
    * регистрировать и обрабатывать обратные вызовы callback, если такие есть (само собой это уже другой метод)

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

    vhood
    @vhood
    Не забывайте отмечать решения
    Здесь Вы принимаете type
    public function makeRequest(array $args, string $type) {
    Здесь выполняете логику в зависимости от typeif($type === "source1") {

    Для каждого type нужно создать класс, который будет выполнять логику, описанную в его блоке if.
    пример

    class SpecificTypeApiService implemets ApiServiceInterface
    {
        public function send()
       {
    //код ниже просто скопирован, стоит вынести что-то в параметры, что-то в конструктор и сделать код более элегантным
    //можно сделать абстрактный класс и делегировать ему общий для разных type (сервисов) функционал
        $proxiesArr = array('72.37.217.3:4145', '174.77.111.196:4145');
              
              $randProx = array_rand($proxiesArr, 1);
              
              $proxyIp = $proxiesArr[$randProx];
            
    //      $proxyIp = '174.77.111.196:4145';
            $url1 = $args[0] . $args[1];
                $headers = [
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.105 YaBrowser/21.3.3.230 Yowser/2.5 Safari/537.36'
                ];
    
                $curl = curl_init();
    
            curl_setopt($curl, CURLOPT_PROXY, $proxyIp);
            curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_VERBOSE, 1); 
            curl_setopt($curl, CURLOPT_POST, false);
            curl_setopt($curl, CURLOPT_URL, $url1);
    
            $result = curl_exec($curl);
    
            if(curl_exec($curl) === false)
            {
            echo 'Ошибка curl: ' . curl_error($curl);
            } else {
            echo 'Операция завершена без каких-либо ошибок';
            }
    
            return $result;
       }
    }


    После, с помощью DI и полиморфизма, отрефакторить существующий код следующим образом:

    Здесь Вы принимаете сервис вместо type
    public function makeRequest(array $args, ApiServiceInterface $apiService) {

    Здесь выполняете логику, но выполнение делегируете сервису$apiService->send();

    Стоит получше подумать над именами классов, переменных и функций.
    Ответ написан
    Комментировать
  • Что делать, если после включения ноута ASUS включается AsusTek BIOS ROM Easy Flash Utility и нет возможности попасти ни в BIOS, ни в Windows?

    @q2digger
    никого не трогаю, починяю примус
    ну судя по скрину он видит содержимое диска. положить файл биоса на диск ( для этого придется например вытащить диск из ноута и подключить к другому компу). Дальше попробовать прошить этот биос.
    Ответ написан
    6 комментариев
  • Как ответить webhook Telegram 'ожидайте' при отправке сообщения в методе /sendMessage?

    @Nc_Soft
    Если нет надобности городить очереди, то можно посмотреть в сторону fastcgi_finish_request
    Ответ написан
    4 комментария
  • Как ответить webhook Telegram 'ожидайте' при отправке сообщения в методе /sendMessage?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В течение 60 секунд после запроса на webhook вы должны отправить ответ с кодом 200, иначе телеграм повторит запрос.
    Соответственно, если вашему боту нужно более 60 секунд, то лучшим вариантом будет помещение запроса в очередь (например, RabbitMQ) и ответ "Запрос принят, идёт обработка" с кодом 200 Ok. Затем отдельным консольным скриптом обработка запроса из очереди и отправка результата пользователю.
    Ответ написан
    4 комментария
  • Как обойти капчу при при парсинге на PHP?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Конструкция парсера незамысловата

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

    Подскажите, пожалуйста, что можно сделать, чтобы спарсить информацию?

    Подключить сервис расшифровки капчи. С таким "незамысловатым" скриптом Вам придется достаточно часто пополнять счет этих сервисов :)
    На прокси можете не тратиться, ибо Вас будут ловить раньше :)
    Ответ написан
  • Почему в Telegram не формируется сниппет микроразметки Open Graph?

    SHKD
    @SHKD
    Возможно из-за соединения по протоколу http, а не https
    Ответ написан
    2 комментария
  • Ссылка на главную страницу сайта не создает сниппета в месенджерах и соцках?

    rozhnev
    @rozhnev
    Fullstack programmer, DBA, медленно, дорого
    Вы должны добавить og: метатаги. Вот пример моего сайта
    <meta property="og:site_name" content="SQLIZE.online">
        <meta property="og:type" content="website">
        <meta property="og:title" content="*************"/>
        <meta property="og:description" content="Share SQL shapshot" />
        <meta property="og:url" content="https://SQLIZE.online/favicons/sqlize/android-chrome-192x192.png" />
        <meta property="og:image:secure_url"  itemprop="image" content="https://SQLIZE.online/favicons/sqlize/android-chrome-192x192.png" />
        <meta property="og:image" itemprop="image" content="https://SQLIZE.online/favicons/sqlize/android-chrome-192x192.png" />
        <meta property="og:image:width" content="566" />
        <meta property="og:image:height" content="300" />
        <meta property="og:image:type" content="image/png" />
        <meta property="og:updated_time" content="1679498154" />
    Ответ написан
  • PHP: как в односвязном списке удалить из середины элемент по его номеру?

    iMedved2009
    @iMedved2009
    Не люблю людей
    <?php
    class Node
    {
        public $data;
        public $next;
    
        function __construct($data, $next = null)
        {
            $this->data = $data;
            $this->next = $next;
        }
    }
    
    class LinkedList{
    
        public $head = null;
    
        public function push(Node $node){
            if($this->head == null){
                $this->head = $node;
                return $this;
            }
    
            $current = $this->head;
            while($current->next != null) {
                $current = $current->next;
            }
    
            $current->next = $node;
            return $this;
        }
    
        public function cut(int $index){
            if($index == 0){
                $this->head = $this->head->next;
                return $this;
            }
    
            $i = 0;
            $previous = null;
            $current = $this->head;
            do {
                if($i == $index){
                    $previous->next = $current->next;
                    return $this;
                }
                $previous = $current;
                $i++;
            }while(($current = $current->next) != null);
    
            throw new Exception('Надо эксепшен что бы out of bounds');
        }
    
        public function printList()
        {
            if(!$this->head){
                echo 'empty list'.PHP_EOL;
                return $this;
            }
            $current = $this->head;
    
            echo $current->data.' -> ';
            while (($current = $current->next)) {
                echo $current->data;
    
                if($current->next) {
                    echo ' -> ';
                }
            }
    
            echo PHP_EOL;
    
            return $this;
        }
    
    }
    
    $linkedList = new LinkedList();
    
    $linkedList
        ->push(new Node('Ari'))
        ->push(new Node('Malcolm'))
        ->push(new Node('Pete'))
        ->push(new Node('Ricky'))
        ->push(new Node('Sean'));
    $linkedList
        ->printList()
        ->cut(2)
        ->printList()
        ->cut(1)
        ->printList()
        ->cut(10);
    Ответ написан
    2 комментария
  • Как сделать прогресс бар скачивания одного файла?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    нужно создать потоковый контекст и использовать stream-notification-callback (см. пример).

    Функция будет вызываться в процессе загрузки / выгрузки файла, сообщая о количестве переданных байтов. Это то, что нужно для отрисовки прогресс-бара.
    Ответ написан
    2 комментария
  • Как настроить nginx, чтобы на index.php перенаправлялись запросы не только {domain}/dfdfdf/dfdf, но и {domain}/DB.php?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    В try_files уберите $uri, что-бы NGINX не обращал внимания на физически существующие файлы DB.php и т.д., а сразу открывал /index.php, что вам и нужно...
    Ответ написан
    2 комментария
  • Как в почте outlook добавить в шаблоне письма автоподстановку имени получателя из адресной строки?

    suffix_ixbt
    @suffix_ixbt
    https://www.babai.ru/
    kutools-for-outlook как я помню умеет это делать.

    Он платный, но там больше месяца триала - можно понять подойдёт или нет.
    Ответ написан
    Комментировать
  • PHP: Как с XPath получить родителя, нескольких детей из html и сохранить их порядок в DOM дереве?

    alekciy
    @alekciy
    Вёбных дел мастер
    Одним XPath запросом ни как. Придется написать пару запросов: 1) получаем //div[contains(@class,"versions")] коллекцию узлов div которые делаем узлом контекста для 2) запроса //a[contains(@class,"versions-item")].

    Код примерно такой будет:
    $elements = $xpath->query('//div[contains(@class,"versions")]');
    foreach ($elements as $contextNode) {
        $versionsItemNode = $xpath->query('//a[contains(@class,"versions-item")]', $contextNode);
    }
    Ответ написан
    Комментировать