Задать вопрос
  • Как закэшировать выполненную часть php кода?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Цикл не закэшируешь, конечно, а результат можно, нарпимер используя serialize(), если там действительно объект.
    Ответ написан
    3 комментария
  • Запуск скрипта при загрузке, не чаще 1 раза в сутки?

    @nApoBo3
    Самый простой метод, и самый предсказуемый, делать onboot и проверять внутри скрипта.
    Остальные варианты потенциально обладают не интуитивным поведением.
    Ответ написан
    2 комментария
  • Где найти правила хабра?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    1. Крутим страницу в самый низ.
    2. Тыцаем «О сервисе».
    3. В правой колонке видим пункт «Правила».
    4. Удивляемся, почему ТАК ГЛУБОКО ЗАПРЯТАЛИ ВЫ ТАМ ЧО ВАЩЕ С УМА СОШЛИ!
    Ответ написан
    1 комментарий
  • Почему может возникать ошибка Undefined offset: 5?

    Читаем CSV-файл встроенной функцией:
    if ($fh = fopen('/public/vag102020.csv', 'r')) {
        while (($csvStr = fgetcsv($fh, 1024, ';')) !== false) {
            $csvArr[] = $csvStr;
        }
    }


    А по поводу ошибки — да, скорее всего поле пусто. Решается просто:
    $weight = $line[5] ?? 0;
    Остальные поля желательно обрабатывать так же.
    Ответ написан
    1 комментарий
  • Как из массива объектов удалить дублирующиеся объекты?

    @alexalexes
    Можно удалить id из элемента массива (точнее из копии элемента), оставшиеся свойства засериализовать, от сериализации найти md5 хэш - это и будет ориентир для уникальности элемента.
    $out_array = [];
    foreach($donates as $donate)
    {
       $donate_copy =  $donate; // копируем элемент массива
       unset( $donate_copy->id); // удаляем уникальное свойство из элемента
       $key = md5(serialize($donate_copy)); // получаем уникальный ключ по содержанию остальных свойств
       $out_array[$key] =  $donate; // добавляем исходный элемент в новый массив по уникальному ключу
    }
    Ответ написан
    2 комментария
  • Почему изменения в php.ini не меняет значение в phpinfo?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    потому что перезапускаешь ты веб-сервер а надо - РНР
    Ответ написан
    1 комментарий
  • Как исправить сокращение даты?

    DevMan
    @DevMan
    $date = 'Oct 08, 2020';
    $date = DateTime::createFromFormat('M d, Y', $date);
    echo $date->format('F d, Y');
    Ответ написан
    Комментировать
  • Как начать изучать новое?

    DreamShaded
    @DreamShaded
    Front-end developer
    Ну, для начала, надо научиться решать базовые вещи. В случае вёрстки - тупо уметь верстать всё, на что взгляд попадёт, в разумных пределах. Я учебные макеты не доводил до конца, если понимал, что всё дальше делается по аналогии) Разбирал именно сложные моменты, например, адаптивность со сменами положений фона, ретину, анимации.

    В случае с жс и другими яп для начала надо на кодварсе многое нарешать. Чтобы быть уверенным джуном, хотя бы 5 лвл задачи нужно садиться и решать. Именно решать, находить своим умом, не подглядывая в ответы. Такой подход очень хорошо "точит" мозги. Ну и регулярность. После - реализовать какой-то полноценный проект, используя знания и документации. Если цель прокачать мозги - тогда без фреймворков, разбираясь с дом-манипуляциями и тп. Долго, но качественно)
    Если цель - устройство на работу фронтом или разработка своего проекта - то надо разбираться с воркфлоу, там, реакты - вью - ангуляры - свелте, библиотеки, таск-раннеры, бандлеры, шаблонизаторы, и прочая, прочая. Тут тоже показатель - завершённость проекта. Если на вёрстку можно класть, щас вёрсткой не удивить, то тут вот надо прям рабочий проект создать.

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

    Ещё момент про "две книги". Изучение материала с разных сторон - это бест практис вообще, так рекомендуют вообще всё разбирать. Естественно, должно быть об одном и том же) Подробнее можно прочесть тут.

    Удачи :)
    Ответ написан
    Комментировать
  • Обновление железа компьютера. Что поменять?

    Zoominger
    @Zoominger Куратор тега Компьютеры
    System Integrator
    Етить.
    Я бы менял целиком, чесслово.
    Ответ написан
    Комментировать
  • Есть старый процессор, какую подобрать мать, чтобы использовать процессор по максимуму?

    @gusteraom87
    1. Athlon 64x2 6000+ (AM2)
    Под этот процессор можно брать любую материнку на сокете AM2 или AM2+. И тот и тот сокет поддерживает только память DDR2. Чипсет – главное не Nvidia, умирали очень часто. Биос возможно придется обновлять, в зависимости от конкретной модели процессора.

    Athlon 64x2 6000+ горячий процессор. Особенно если с частотой 3Ghz (у него TDP 125W и в комплекте шел кулер с тепловыми трубками, как на opteron). Если с частотой 3,1 Ghz - то похолоднее, достаточно будет стандартного кулера, если без разгона. Лучше уточните модель перед покупкой охлаждения и материнки.

    2. Core2 duo e7500 (LGA775)
    Достаточно свежий процессор, поэтому на самых древних материнках работать не будет. Нужно смотреть не только сокет, но и чипсет (должен быть G31 или P31 минимум. Иногда работает на 945-м и 965-м чипсете после заливки свежего биоса).
    Преимущество LGA775 – бывают материнки под память DDR3 (но чаще все-таки DDR2).
    Core2 duo e7500 – относительно холодный, боксового алюминиевого кулера хватает с головой.

    Заниматься разгоном на таком железе лично я не вижу смысла. Это старшие модели, оба процессора уже имеют внушительные для своего поколения 3Ghz. Обычно хорошо гонятся младшие модели. Если пытаться разгонять выше 3Ghz – на приличное охлаждение уйдет больше денег, чем на все остальное железо. Правда у Core2 duo e7500 запас по разгону еще должен быть, они легко брали 4-4,5.
    Ответ написан
    4 комментария
  • Как мне исправить ошибку PHP0413?

    dyuriev
    @dyuriev
    A posteriori
    установите/активируйте модуль php-fileinfo и перезапустите установку композера

    ps: на последнем скрине, кстати, это и написано
    Ответ написан
    Комментировать
  • Как привязать домен к динамическому ip?

    Sanes
    @Sanes
    Через сервисы, вроде DynDNS и No-IP.
    Главное не путайте динамический с белым IP.
    Ответ написан
    5 комментариев
  • Где можно получить повышение квалификации backend разработчику?

    @vitaly_il1
    DevOps Consulting
    В целом согласен с Alex McArrow. А точнее - я не верю в какое-то "хорошо прокачиваться у более сильных" - подумайте о слабых местах, конкретных проблемах в вашем проекте и ищите, как их улучшить и оптимизировать.
    И не вестись на "использовать кубернетес", "выкинь PHP, перепиши на Go", "делай так, потому что я сказал".
    Ответ написан
    Комментировать
  • Как сделать систему регистрации на php?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Регистрация это по сути тупо создание записи в базе по определённым тобой правилам через форму на сайте, таким как:
    - заполнение обязательных полей
    - валидация данных в полях
    - проверка на уникальность
    И так далее.
    Ответ написан
    Комментировать
  • Как найти все комбинации определенных слагаемых числа?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Различных комбинаций очень много. Так что, раз уж вы их все обходите, то полный перебор будет работать не сильно медленнее. Его потом можно соптимизировать.

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

    Функция перебирает 2 варианта. Пусть отсавшаяся сумма s, а разрешенное максимальное число имеет номер i (они хранятся в каком-нибуть отсортированном a[]).

    1) Берем текущее максимальное слагаемое. Естественно, если оно помещается в остаток s >= a[i]. Кладем его к текущим слагаемым в массив и рекурсивно вызываемся от уменьшенного остатка, не меняя максимальное число - (s-a[i], i). Важно - если слагаемые хранятся в глобальной переменной, то надо после рекурсивного вызова "вернуть как было" - удалить только что добавленное слагаемое из массива.

    2) Пропускаем текущее максимальное число. Значит, больше его брать вообще нельзя. Вызываемся от (s, i-1). Естественно, этот вариант есть только если i>0.

    Если мы получили, что оставшаяся сумма s равна нулю, то мы подобрали разбиение, надо вывести текущие слагаемые.

    Ах да, чтобы этот метод хорошо работал имеет смысл слагаемые отсортировать по возрастанию. Чтобы сначала брались самые большие.

    Если среди возможных слагаемых нет 1, то этот полный перебор может заходить в тупики. На пример, доступны слагаемые 6 и 11, надо набрать 29. Алгоритм может пропустить 11 и попытаться набрать 29 одними шестерками, но этого никогда не получится. Эти лишние тупиковые ветки можно обрезать и ускорить таким образом решение в некоторых случаях.

    Для этого смотрите задачу о рюкзаке. Почти как в ней сделаейте динамическое программирование, которое будет считать, сколько способов собрать заданную сумму k мешьшими слагаемыми. После этого в рекурсивной функции вы можете сразу же возвращаться, если ДП говорит, что вариантов набрать s первыми i слагаемыми - 0.

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

    EDIT: Только заметил, что вам порядок важен и 1,2,3 считается отдельно от 3,1,2

    Изменения просты - рекурсивная функция теперь принимает только один параметр - сколько осталость добрать. Вместо двух вариантов она перебирает N вариантов - какое именно число из разрешенных взять.

    Оптимизация такая же. реализуете ДП, которое считает, сколько способов собрать заданное число и, если способов нет, возвращаемся из функции.
    Ответ написан
    Комментировать
  • Как записать данные в файл?

    iResource
    @iResource
    Разработчик IR XML2Ozon
    После объявления $file не хватает точки с запятой.
    Да и в параметрах fopen кавычки вокруг $file лишние.
    Ответ написан
    Комментировать
  • Попинайте 2. Удалось ли исправить устаревший код, который забраковал работодатель?

    @Flying
    Согласен с FanatPHP по поводу того что изменения, по сравнению с предыдущим вариантом, просто колоссальные, поздравляю!

    Однако сразу видны те направления движения которые стоит рассматривать в первую очередь:

    1. Вам стоит лучше изучить возможности языка. PHP развивается очень динамично и в 7-й версии было добавлено огромное количество вкусных возможностей, про них стоит знать и ими стоит пользоваться
    2. Необходимо лучше изучить имеющуюся на данный момент экосистему готовых пакетов, это позволит вам использовать готовые, проверенные решения вместо изобретения своих велосипедов. Подключение Twig - первый шаг, но далеко не последний
    3. Вам обязательно стоит посвятить время изучению кода популярных проектов. Это многое может рассказать вам о подходах к решениям, паттернах и т.п. Конечно, параллельно нужно будет выяснять значения массы используемых терминов чтобы лучше понимать происходящее, это тоже пойдёт вам на пользу.
    4. Смотрите как развиваются другие технологии, которые вы используете, таблицами сейчас не верстают :)
    5. Рекомендую рассмотреть вариант использования для написания кода нормальной IDE, к примеру PHPStorm, это существенно улучшит вашу производительность и убережёт от массы ошибок


    Теперь более предметно:

    Оформление кода:

    Вы утверждаете что код соответствует PSR-2 (кстати, актуальный - PSR-12), однако есть мелкие огрехи (раздел 2.2).

    Оформление composer.json:

    Лучше указывать требования к платформе, в вашем случае - как минимум версию PHP т.к. platform requirements проверяются Composer'ом при установке.

    Поскольку ваш проект - не библиотека, то composer.lock тоже должен быть частью репозитория.

    Про настройки autoload'а вам уже сказали, обращу только внимание на то что сейчас структура репозитория отражает PSR-0, а не актуальный PSR-4, при использовании PSR-4 ваш код проекта лежал бы в src.

    Организация репозитория

    Код проекта должен лежать за пределами web root, поэтому вам явно не хватает папки public с единственным index.php

    Конфигурация

    Конфигурирование через константы - весьма устаревший подход. К примеру представьте что вы разворачиваете этот код на production сервере и вам нужно сменить данные для подключения к базе данных не создавая локальных изменений в рабочей копии. Сейчас у вас это не получится. Выход: читаем про
    12 factor app и, в частности, раздел config, а затем подключаем в проект, к примеру, vlucas/phpdotenv или symfony/dotenv

    Сервисы

    Использование bootstrap.php - хорошо, но для организации работы с сервисами сейчас как правило используются dependency injection контейнеры, даже PSR-11 для них есть. В текущем виде ваш подход слабо расширяем, а передача сервисов через глобальные переменные - так себе идея по многим причинам.

    Понятно что вворачивать DI container для примера на три файлика - overkill, но с самим подходом вам следует ознакомиться. Из реализаций самая популярная сейчас - symfony/dependency-injection, но есть и альтернативы.

    Автолоадер

    Про autoload.php вам уже сказали, вместо него стоит корректно конфигурировать автозагрузку в composer.json и полагаться на то что Composer вам сгенерирует. Он ведь умеет всё это и оптимизировать при необходимости.

    Внешние пакеты

    Для новых проектов рекомендуется выбирать актуальные и поддерживаемые версии пакетов. Хотя Twig 1.x ещё поддерживается, тем не менее актуальная версия - 3.x.

    Обработка ошибок

    Попробовать сделать это самостоятельно, безусловно, полезно чтобы лучше разобраться как это работает, но для реальной работы лучше полагаться на проверенные решения, к примеру filp/whoops или symfony/error-handler

    Типы данных

    Важно помнить что PHP с версии 7.0 поддерживает указание скалярных типов для аргументов и
    возвращаемых значений, с 7.1 - nullable типы и class constant visibility, а с 7.4 - типизированные свойства. Всё это гораздо надёжнее чем описание типов через аннотации и этим стоит пользоваться.

    Также повсеместно в коде используется нестрогое сравнение, тогда как очень желательно всегда использовать строгое (документация).

    Data Objects

    Сейчас Place и PlaceFilter по сути являются data объектами т.е. они не содержат самостоятельной логики, а просто переносят некие данные. При этом оба этих класса имеют пустые конструкторы (которые, кстати, лучше убирать), а загрузка данных организована через setter методы. Это позволяет изменить данные в них в произвольные моменты времени что вряд ли является желаемым поведением. Вместо этого подобные объекты лучше организовывать в виде immutable объектов (статья с примерами) чтобы не позволять ненужного нарушения целостности данных. Альтернативно, к примеру, для PlaceFilter может лучше подходить использование паттерна
    Builder
    , хотя в википедии не самый лучший пример.

    Именование

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

    Оптимизации

    Понятно что это мелочи, но явно видно что компиляцию запросов (1, 2) можно кэшировать вместо того чтобы перекомпилировать каждый раз.

    References

    PDOStatement::bindParam() принимает аргумент $variable как reference, а в коде в этот аргумент передаётся выражение что недопустимо.

    Английский язык

    Я специально почти везде по тексту давал ссылки на информацию на английском языке т.к. он - основной язык в нашей индустрии и его важно знать и использовать.
    Ответ написан
    3 комментария
  • Как сделать иерархическую структуру таблицы?

    @bkosun
    Для хранения древовидных (иерархических) данных в реляционных БД обычно используют такие структуры:
    • Materialized Path
    • Nested Set
    • Adjacency List
    Ответ написан
    Комментировать
  • Как сохранить файл в терменале ubuntu?

    @pfg21
    ex-турист
    стоит посоветовать установить консольный файл менеджер midnight commander
    sudo apt install mc
    в комплекте будет текстовый редактор mcedit
    Ответ написан
    Комментировать