• Как правильно хэндлить Exception?

    @colesnic89
    PHP developer
    if (!empty($temporary)) {
        try {
            $this->moveToDatabase($temporary);
        } catch (\Exception $e) {
            $this->logger->log("Y-m-d H:i:s | " . $e->getMessage());
            throw $e;
        }
    }
    Ответ написан
  • Как расшифровать в php строчку по указанным правилам?

    @Uinit
    Как-то так:
    <?php declare(strict_types=1);
    
    $input = '->11гe+20∆∆A+4µcњil->5•Ћ®†Ѓ p+5f-7Ќ¬f pro+10g+1悦ra->58->44m+1*m+2a喜er!';
    
    class Decoder
    {
        private $position   = 0;
        private $output     = '';
    
        private $state;
    
        private const STATE_FREE        = 'processFree';
        private const STATE_MINUS       = 'processMinus';
        private const STATE_READ_NUMBER = 'processReadNumber';
    
        private const METHOD_GO         = 'goStack';
        private const METHOD_SKIP_RIGHT = 'skipStackRight';
        private const METHOD_SKIP_LEFT  = 'skipStackLeft';
    
        private $stack;
        private $method;
    
        public function decode(string $input): string
        {
            $this->position = 0;
            $this->output   = '';
            $this->state    = self::STATE_FREE;
    
            $length = mb_strlen($input, 'UTF-8');
    
            while ($this->position < $length){
                $symbol = mb_substr($input, $this->position, 1, 'UTF-8');
                $this->{$this->state}($symbol);
            }
    
            return $this->output;
        }
    
        private function processFree(string $symbol): void
        {
            switch ($symbol){
                case '-':
                    $this->state = self::STATE_MINUS;
                    break;
                case '+':
                    $this->method = self::METHOD_SKIP_RIGHT;
                    $this->state = self::STATE_READ_NUMBER;
                    break;
                default:
                    $this->output .= $symbol;
                    break;
            }
    
            $this->position++;
        }
    
        private function processMinus(string $symbol): void
        {
            if($symbol === '>'){
                $this->method   = self::METHOD_GO;
                $this->state    = self::STATE_READ_NUMBER;
                $this->position++;
                return;
            }
    
            $this->method = self::METHOD_SKIP_LEFT;
            $this->state = self::STATE_READ_NUMBER;
        }
    
        private function processReadNumber(string $symbol): void
        {
            if($this->isNumber($symbol)){
                $this->stack .= $symbol;
                $this->position++;
                return;
            }
    
            if($this->stack === null){
                throw new \InvalidArgumentException('Method has\'t number argument at position: '.$this->position);
            }
    
            $this->{$this->method}((int)$this->stack);
            $this->stack    = null;
            $this->method   = null;
            $this->state    = self::STATE_FREE;
    
        }
    
        private function isNumber(string $symbol): bool
        {
            return !!preg_match('#[0-9]#',$symbol);
        }
    
        private function goStack(int $arg): void
        {
            $this->position = $arg;
        }
    
        private function skipStackRight(int $arg): void
        {
            $this->position += $arg;
        }
    
        private function skipStackLeft(int $arg): void
        {
            $this->position -= $arg;
        }
    }
    
    
    $out = (new Decoder())->decode($input);
    echo $out;

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

    @FanatPHP
    Пишешь в адресной стороке своего браузера: найти повторяющиеся значения в бд
    Если хочется получить ответ именно от пользователей тостера то добавляешь site:qna.habr.com
    Ответ написан
  • Как заменить числовые ключи массива на соответствующие значения?

    0xD34F
    @0xD34F
    array_map(function($n) {
      return array_combine([ 'Название', 'Цена', 'Количество' ], $n);
    }, $flowers)
    Ответ написан
  • Как прочитать docx на PHP?

    @BATPYIIIKOB
    PHP, JS
    file_get_contents прочитает только кракозябры
    docx - по сути это архив с xml и т.д...
    https://github.com/PHPOffice/PHPWord - библиотека
    либо пишите собственный парсер.
    Ответ написан
  • Почему возникает ошибка "Class not found"?

    @kikimarik
    Смотрите
    namespace App\Http\Controllers;
    Это объявляется пространство имен. А значит, что обращения к классам будут идти от него. Если вы хотите использовать класс из другого пространства имен, то у Вас 2 пути:

    1) Прописать после объявления пространства имен текущего класса использование того, что вам надо
    use Class\With\Namespace;
    2) При попытке обратиться к классу прописываете вызов вместе с пространством имен
    $obj = new \Class\With\Namespace;
    $static = \Class\With\Namespace::staticMethod();
    Ответ написан
  • Почему возникает ошибка "Class not found"?

    kspitfire
    @kspitfire
    Webdev: PHP (Symfony, Laravel), JS (Vue.js), Go.
    Потому что, по-хорошему, надо импортировать фасад DB сначала — в вашем пространстве имён не определено, что такое DB:

    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\DB;
    Ответ написан
  • Как найти часть строки после "@", и вместе с @ взять в тег?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    <?php
    
    function replaceLogic($match) {
        return "<tag>$match[0]</tag>";
    }
    
    $input = 'Вот арбуз - @ho_ho_ho какой-то текст @ho_ho_ho2';
    $output = preg_replace_callback('/@[0-9a-z_]+/u', 'replaceLogic', $input);


    Живой пример
    Ответ написан
  • Как вывести данные из json в php страницу?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    $json = '{"servers":{"www:19132":{"ping":0,"names":[""],"motd":"aMCraftf.pw lv3.0 bvk.com\/mcraft_pw","type":"SMP","game":"MINECRAFTPE","version":"v1.14.0","plugins":"PocketMine-MP 3.11.4: ItemCloud 1.3.1; MineReset 3.3.0; FormAPI 1.3.0; SkyBlock 3.0.0; MultiWorld 1.5.2; AllSigns 1.0.12; WelcomeMessage 1.0.0; BuilderTools 1.2.0-beta2; MapImageEngine 1.1.3; AutoMineReset 0.3.4; PurePerms 1.4.2; DevTools 1.13.5; CompassXYZ 1.0; ChatMuffler 1.0.2; EconomyPShop 2.0.3; Broadcaster 1.5; MOTDShuffle 1.1.7; essentialsTP 1.2.2; BadWordBlocker 1.2.8; SimpleAuth 2.1.3; KillHealth 1.0.0; LightningDeath 1.0.1; StarterKit 1.0.1; MysteryCrate 9.1.1; Parkour 1.5.7; Texter 3.4.4; AuthUI 1.0.0; Slapper 1.5.2; SexGuard 1.1.9; Jail 1.3.0; PiggyCustomEnchants 2.0.4; PureEntitiesX 0.6.3; ScoreHud 5.1.1; MSpawns 2.2; AdvancedJoin 1.1.0; EconomyAPI 5.7.2; PureChat 1.4.11; AdvancedKits 5.3.0; EconomySell 2.0.10; KillMoney 1.0.0-stable; CustomShopUI 4.0.5; PiggyCustomEnchantsShop 1.3.1; EconomyLand 2.1.2; EconomyJob 2.0.5; PlayerHead 1.3; MagicTelePortal 1.3.5; TopMoney 1.0.0; KisayolTP 2.5; FloatingText 1.0.0; SlapperRotation 1.2.1; ExampleUI 1; PCFly 3.0.0; TicTacToe 0.1.5; MiniBosses 2.0.2; 1vs1 1.0.1; VanishV2 1.4; FactionsPro 1.3.20; SkyWars 1.2.0; SkyWars-Reward 1.1.2","map":"Castle","online":"0","slots":"200","status":"online","address":"191.168.0.01:19132","percent":0}},"online":0,"slots":200,"percent":0,"timerec":"25 \u044f\u043d\u0432\u0430\u0440\u044f \u0432 13:53","record":942,"recordday":0,"timerecday":"01:22"}';
    json_decode($json, true)['online'];
    json_decode($json, true)['record'];

    Документация на json_decode.
    Ответ написан
  • Функция mail php. Почему не приходят письма или письма попадают в спам?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Причина попадания в спам связана с хостингом и почтовым сервером. Используйте PHPMailer, чтобы избегать этих проблем сейчас и в будущем
    Ответ написан
  • Регулярные выражения. Как посчитать количество значений разделенных символом?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    живой пример.
    Для разбития по разделителю достаточно функции explode, чтобы отфильтровать пустые элементы, которые возникают из-за последней запятой в строке, нужно пользоваться array_filter без колбека.
    Ответ написан
  • Как сжать данные при загрузке через AJAX?

    firedragon
    @firedragon
    Senior .NET developer
    Включите сжатие на сервере для ваших скриптов, gzip на тексте может дать разницу в 5-6 раз
    Ответ написан
  • Можно ли не прописывать переменные в функцию если их нет?

    ну так задай параметры по дефолту
    function delitem($iditem, $login, $kolvo, $linefile, $catalog, $effect34 = null, $effect33 = null)
    Ответ написан
  • Сложный и интересный проект для новичка?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    ## Анонимный чат с темами для обсуждения деликатных офисных проблем
    Иногда хочется обсудить что-то с коллегами в офисе, но не хочется смущать их или показывать лишнюю инициативу.
    Например кто-то не смывает в туалете или слишком громко орёт и сам того не замечает. Может быть кто-то слишком интенсивно пользуется парфюмом.
    - Анонимность
    - Постоянная ссылка на чат, тему или дерево чатов
    - ссылки в виде QR-кодов
    - голосовалка
    - закрепленные посты

    ## Сайт checklist
    Веб-сервис и мобильное приложение для краудсорсинга чеклистов для всего: зарегать ИП, получить визу, что делать при ДТП, как влезть в ипотеку, как вылезть из неё, чем заняться с ребенком на выходных (N-ле

    - Коллекция чек-листов снабженных тегами, доступная для краудсорсинга.
    - Краудфандинг составления и поддержки нового листа.
    - Фильтрация чек-листов.
    - Фильтрация пунктов.
    - Тегирование пунктов.
    - Графовые алгоритм обхода чек-листа.
    - Мастер обхода чек-листа.
    - Отчет по чек-листу.
    - Вложенные чеклисты, гиперссылки между разными листами.
    - Параметризация.
    - Экспертная система, логические связи (расширенный режим).

    Примеры:
    - Что делать при ДТП
    - Открыть ИП
    - Осмотр авто при покупке (подветки для разных конкретных моделей)
    - Первая помощь при...
    - Диагностика инсульта
    - Зомби-акопалипсис: как приготовиться
    - Атомный взрыв неподалёку - что делать
    - Планетарная катастрофа - как выживать
    - Поход выходного дня - что взять
    - Подготовка авто к поездке
    - Путешествие: Алжир (виза, прививки, документы, отели, транспорт)
    - Как влезть в ипотеку
    - Как вылезть из ипотеки
    - Как быстро заработать (во все тяжкие)
    - Покупка квартиры (на что обратить внимание)
    - Самостоятельное строительство дома (общий план)
    - Чем заняться с ребёнком N-лет
    - Как отметить новый год
    - Что интересного в районе <пос. Майский>
    - Номера телефонов и документы в автомобиле

    ## Эротический краудфандинг
    Интернет ресурс, где девушки могут делать крауд-фандинговые кампании

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

    ## Простой открытый сервис для обмена сообщениями
    - HTTP API, Web-sockets
    - p2p rtsp
    - опциональное end-to-end шифрование
    - хранение истории на клиентах
    - возможность использования нескольких серверов
    - возможность использования альтруистичных клиентов для проксирования трафика p2p
    - поиск узлов на основе блокчейн технологий и DHT таблиц

    ## Онлайн-журнал путешествия
    - публикация трека в реальном времени
    - комментарии путешественника и фолловеров
    - стримы (аудио, видео, фото)
    - отложенная загрузка
    - журнал(расходы, чек-поинты, расписания, цены, погода)
    - FAQ
    - голосовалка

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

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    $user = [
        'id' => 1,
        'name' => 'Ivan Ivanov',
        'role' => 'developer',
        'salary' => 100
    ];
    
    $apiTemplatesSet1 = [
        '/api/items/%id%/%name%',
        '/api/items/%id%/%role%',
        '/api/items/%id%/%salary%'
    ];
    
    class Invoker
    {
        private $data;
    
        public function __construct(array $data)
        {
            $this->data = $data;
        }
    
        public function __invoke(array $key): string
        {
            return $this->data[$key[1]];
        }
    }
    
    $function = new Invoker($user);
    
    $result = array_map(function ($key) use ($function)
    {
        return preg_replace_callback('#%(.*)%#isU', $function, $key);
    }
    , array_values($apiTemplatesSet1));
    
    echo '<pre>' . print_r($result, true);

    https://3v4l.org/DbIAi
    5e32d4911eae6354134814.png
    Ответ написан
  • Почему не работает кэширование запросов?

    maksim92
    @maksim92 Куратор тега Yii
    Нашел решение — пометь вопрос ответом!
    1.
    // Кэширование запросов для DAO
    // Возвращает ассоциативный массив с именами столбцов и значений
    $categories = Yii::$app->db->cache(function () {
      return Yii::$app->db->createCommand('SELECT * FROM `category`')->queryAll();
    });
     
     
    // Кэширование запросов для ActiveRecord (на 1 час)
    // Возвращает объект
    $categories = Category::getDb()->cache(function (){
        return Category::find()->all();
    }, 3600);


    2. Кэширование производится при необходимости, а не ради кэширования. У вас проблемы с нагрузкой? Зачем кэшировать?)
    Ответ написан
  • Как сравнить массив с базой данных?

    @FanatPHP
    Делай trim перед запросом.
    Но вообще конечно бедный заказчик...
    Ответ написан
  • Как понять што не так в куске кода php?

    DevMan
    @DevMan Куратор тега PHP
    много чего не так: только в первой строке минимум две ошибки, дальше ковырять неохота.
    читайте про экранирование строк.

    """ – ошибка, должно быть "\"" или '"'
    "\" – ошибка, должно быть "\\"
    и все такое
    Ответ написан
  • Комментарии в коде?

    sotvm
    @sotvm
    Умный поймёт , а дураку и так всё равно.
    Не учите меня программировать.
    Комментарии лишними не бывают.
    5e30e1be57646442252796.gif
    // Когда я начинал это писать, только Бог и я понимали, что я делаю
    // Сейчас остался только Бог


    // иногда мне кажется, что компилятор игнорирует все мои комментарии


    // пьян, исправить позже

    // Магия. Не трогать.

    /**
     * Всегда возвращает true.
     */
    public boolean isAvailable() {
        return false;
    }
    Ответ написан