• Как отсортировать массив в порядке, определенном пользователем?

    gscraft
    @gscraft
    Программист, философ
    $source = [...];
    $pattern = [321, 8734, 210, 2131];
    usort($source, function ($a, $b) use ($pattern) {
      $x = array_search($a['id'], $pattern); // Вам нужно искать свое значение, разумеется
      $y = array_search($b['id'], $pattern);
      if ($x == $y) return 0;
      return ($x < $y) ? -1 : 1; // если индекс первого элемента больше, он "меньше"
    });

    — суть в том, чтобы определять вес элементов при сортировке по их позиции в массиве-паттерне.
    Ответ написан
  • Какую библиотеку C++ использовать для связи php и C++ сокетами?

    gscraft
    @gscraft
    Программист, философ
    Странный вопрос. Используйте, что отвечает условиям и понравится. Стоит отметить, что библиотеки Qt повлекут за собой Qt SDK в широкой степени, хотя Qt и хорошая платформа для консольных приложений (в комплект идет куча сервисов, библиотек, многопоточность с сигналами и слотами, плюс, синтаксический сахар, кроссплатформенность и отличное API), но все же.

    Могу добавить пару вариантов: boost, требующий некоторого дзена, широко популярную libcurl и Poco
    Ответ написан
    1 комментарий
  • Как в интерсепторе ангулара получить куки ответа?

    gscraft
    @gscraft
    Программист, философ
    Angular не работает с Cookie, придется либо работать с Cookie напрямую, либо подключать стороннее решение, например.
    Ответ написан
    Комментировать
  • Как правильнее запросить/ограничить несколько отношений в Peewee?

    gscraft
    @gscraft Автор вопроса
    Программист, философ
    Собственно, других вариантов нет, есть лишь один более-менее эффективный способ ограничить выборку, чтобы не жертвовать выборкой id IN и не нагромождать колонки, реализовать метод, для получения колонок, например:
    class BaseModel(Model):
        class Meta:
            database = database
    
        @classmethod
        def fields(cls):
            fields = list()
            for field in cls._meta.sorted_fields:
                if not isinstance(field, ForeignKeyField):
                    fields.append(field)
            return fields

    И впоследствии выбирать так (из примера выше):
    select = Delivery.select(Delivery.sender, *Delivery.fields()).limit(3)

    Впрочем, это не отменит погружения, если sender имеет несколько зависимостей, они все будут запрошенными. Плюс, если запрос подразумевает условие по связанной модели, придется делать JOIN и Delivery.sender будет "дублироваться" и другие мелкие неудобства.

    Жаль, Peewee одна из самых элегантных библиотек в своем роде и позволяет очень быстро прототипировать приложение. Но решения по загрузке связей у разработчиков странные и удивительно, что не работает lazy_load (а в обратном случае, как выбирать записи с погружением и без JOIN?).
    Ответ написан
    Комментировать
  • Найти конечный элемент что то типа замыкания php?

    gscraft
    @gscraft
    Программист, философ
    Вы пытаетесь вывести в ссылке материализованный путь? Да, при смене одного из звеньев в цепочке родитель-потомок придется менять весь путь. Да, Вам нужно перебрать всех родителей от потомка, чтобы построить этот путь и если Вы не храните иерархию именно в виде пути. А что за конечный элемент Вы пытаетесь разыскать и с какой целью? Если ссылка вида: /родитель1/родитель2/потомок, то Вам нужен только потомок, а запрос от него всех родителей нужен только для формирования ссылки. Но вообще, не лучшая идея, в этом нет особого смысла, если это не строгое желание заказчика и сокращение ссылки при этом не ведет в соответствующий раздел (но лучше обойтись именно хлебными крошками на странице, ведущими по прямой ссылке в категорию).
    Ответ написан
    Комментировать
  • Как сделать сортировку в html с использованием php?

    gscraft
    @gscraft
    Программист, философ
    Вячеслав Коростин, сделайте список ссылками или среагируйте на нажатие с JS и сделайте программный переход по ссылке:
    <!-- вместо -->
    <input type="radio" name="sortType" value="sort-az" checked="checked" id="sort-az"><label for="sort-az">Название: А — Я</label>
    <!-- например: -->
    <a href="/showAll?order=asc&sort=name">Название: А — Я</a>

    Или (чисто для примера, можно решить эффективнее):
    document.getElementById('sort-az').onchange = function (event) {
        if (event.target.checked)
            document.location.href =  '/showAll?order=asc&sort=name';
    };
    Ответ написан
    Комментировать
  • В чем проблема PDO?

    gscraft
    @gscraft
    Программист, философ
    Вы пытаетесь в сессию сохранить все данные класса User, вот и ругается, что сериализуете объект PDO. Во-первых, довольно странное подключение, у вас и $connect, и $global_connection одно и тоже, и глобальное подключение передаете в класс. Есть смысл переосмыслить все это. Во-вторых, реализуйте, например, метод User::getData, который вернет непосредственно данные пользователя: $_SESSION['logged'] = $user->getData()
    Ответ написан
    Комментировать
  • Как по имени пользователя получить данные из базы и подсчитать их?

    gscraft
    @gscraft
    Программист, философ
    Ну, вывести результат придется самостоятельно. А вариантов запросов множество. Через JOIN, через вложенные запросы, через группировку по значению, но в любом случае с агрегацией. Далее примеры решения, без знания структуры Ваших данных и без оптимизаций. В первом случае Вы получите по 2 (и более) строки на каждого пользователя (например, user_id=1, status='ok', name= 'John galt', status_count=2 и user_id=1, status='trash', name= 'John galt', status_count=67):
    SELECT *, COUNT(status) as status_count FROM table_name WHERE name = :name GROUP BY user_id, status;

    В этом случае получите 1 строку на каждого пользователя, но запрос, возможно, тяжелее (user_id=1, name= 'John galt', status_ok_count=2, status_trash_count=95)
    SELECT COUNT(ok.status) as status_ok_count, COUNT(trash.status) as status_trash_count, table_name.user_id, table_name.name
    FROM table_name WHERE name=?
       INNER JOIN table_name as ok ON ok.user_id = table_name.user_id
       INNER JOIN table_name as trash ON trash.user_id = table_name.user_id
    WHERE table_name.name = :name AND ok.status = 'ok' AND trash.status='trash'
    GROUP BY table_name.user_id;

    PS Есть смысл делать выборку не по имени, а по идентификатору, если надо получить данные на пользователя (а не найти именно по имени), запросы по первичному ключу всегда существенно быстрее.
    Ответ написан
    6 комментариев
  • Как сделать подсчёт совпадающих слов php?

    gscraft
    @gscraft
    Программист, философ
    Вхождения подстроки:
    $names = explode(', ', mb_strtolower('Катя, Марина, Миша')); // обратите внимание на разделитель
    $text = mb_strtolower('Сегодня Катя пошла гулять. Миша и Марина пришли на площадку немного позже, Катя увидев их зразу же подбежала к ним');
    $count = 0;
    foreach ($names as $name) $count += mb_substr_count($text, $name);
    echo $count, PHP_EOL;

    Вхождения слов, с учетом разделителей:
    $names = implode('|', explode(', ', 'Катя, Марина, Миша'));
    $text = 'Сегодня Катя пошла гулять. Миша и Марина пришли на площадку немного позже, Катя увидев их зразу же подбежала к ним';
    $count = preg_match_all("/(^|\W+)($names)(\W+|$)/ui", $text);
    echo $count, PHP_EOL;
    Ответ написан
    6 комментариев
  • Как сделать поиск в строке со стоп словом?

    gscraft
    @gscraft
    Программист, философ
    Я несколько минут не могу прочитать код, что происходит? Что это за конструкции, что пытаетесь сделать с переменной $stop_words после false и погружая в нее текст "&& strpos($description, для бровей)=== false "? Вы текст ошибки пробовали в Yandex Translate закинуть? Банально, ошибки синтаксиса. Навскидку, Вам достаточно:
    foreach ($stops as $stop) { // $stop должно быть строкой, разумеется
      if ( mb_strpos($description, 'тени') !== false && mb_strpos($description, $stop) === false ) {
         echo 'Mission complete: ', $description, PHP_EOL;
      }
    }
    Ответ написан
    3 комментария
  • Как реализовать консольный файловый менеджер на Python?

    gscraft
    @gscraft
    Программист, философ
    Хех, Вы просите буквально набросать Вам стек и частью архитектуру приложения, но при этом слабо понимаете предмет, судя по желанию использовать вывод в файл (не прибегая к очевидному использованию встроенных функций языка). Так вот, какие библиотеки использовать? Достаточно стандартной библиотеки языка:
    https://docs.python.org/3/library/filesys.html
    https://docs.python.org/3/library/curses.html

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

    gscraft
    @gscraft
    Программист, философ
    Вопрос старый как мир. Я бы сказал так, без острой необходимости не усложняйте себе работу — пока время дороже, чем расходы приложения. И занимайтесь переносом в бинарные библиотеки лишь тогда, когда твердо будете понимать такую необходимость.

    И наоборот, если ищете ответ в Google, значит не осознаете проблемы. Но общего ответа и не найдете, ведь это аналитическая задача для каждого конкретного случая. Тогда как чаще всего просадки в работе алгоритмов решаются оптимизацией. Так, был случай работы с огромными XML документами, сначала мелькнула мысль о переносе на C++ или поиске бинарной-XML библиотеки, однако профайлер показал, что узким местом являются 2 списка, никак не библиотека XML на чистом Python. Списки пришлось разбить, убрать поиск по ним и т.д., и сэкономил 80% времени в работе алгоритма.
    Ответ написан
    2 комментария
  • Что за проблема с кодировкой?

    gscraft
    @gscraft
    Программист, философ
    А зачем Вы открываете такой URL? В этом есть необходимость? Символы похожи на эстонский алфавит. Если у Вас прямая необходимость работать именно с эстонским алфавитом, то, конечно, так и прописывайте в регулярном выражении. Должно сработать и [a-ü]+, [A-Ü]+ при модификаторе //u, если же это строки, хранимые в базе данных, то просто пользуйтесь юникодом и ищите наряду с обычными (зависит от базы данных, конечно). Но, лучше использовать латинские символы в ссылках.
    Ответ написан
  • Обращение к файлу часть пути которого в переменной?

    gscraft
    @gscraft
    Программист, философ
    from pathlib import Path
    
    root = Path.cwd() # например, рабочий каталог скрипта (не стоит использовать __file__)
    abc = "pyti"
    needle = root / abc / 'concrete_file_name'


    UPD by Dr. Bacon os.getcwd() => Path.cwd()
    Ответ написан
    4 комментария
  • Надо ли понимать что находиться внутри фреймворков?

    gscraft
    @gscraft
    Программист, философ
    Такое желание возникает пока не знаете инструменты фреймворка достаточно хорошо. Со временем оно пройдет. А изнутри знать ненужно, нужно знать «снаружи», за исключением ситуаций, когда приходится делать свою реализацию тех или иных функций движка. Да, рядом правильно пишут, нужно понимать и общие принципы, подходы и паттерны, которые фреймворк реализует. Наоборот, исходя от общего будут понятнее те частные способы, которые реализует конкретный API. Это простое столкновение индукции и дедукции в мышлении.
    Ответ написан
    Комментировать
  • Как записать скопированный текст в переменную?

    gscraft
    @gscraft
    Программист, философ
    Если не захотите использовать API операционной системы, проще проверять содержимое буфера обмена по таймеру: https://pypi.org/project/pyperclip/

    Если готовы погрузиться, можно воспользоваться https://github.com/mhammond/pywin32 и копать в эту сторону: https://docs.microsoft.com/ru-ru/windows/win32/api... подписать свое окно (увы, и оно Вам понадобится) на событие https://docs.microsoft.com/en-us/windows/win32/dat...

    Возможно, найдется готовая библиотека.
    Ответ написан
  • Узнать количество массивов и подмассивов JSON в Python?

    gscraft
    @gscraft
    Программист, философ
    Эм, а почему просто не перебрать в цикле?
    # data[0]['positions'][0]["statusCode"]
    for item in data:
      positions = data.get('positions')
      if isinstanceof(positions, list): # например, проверьте, если значение может быть пустым
        for position in positions:
          status_code = position.get('statusCode') # стоит всегда называть_переменные_змейкой
          if status_code == 'abc': pass # делайте, что Вам нужно
    Ответ написан
    Комментировать
  • Как вставить php в js?

    gscraft
    @gscraft
    Программист, философ
    Браузер не может видеть PHP-код. В общем случае механизм работает так: браузер отправляет запрос серверу, сервер передает PHP на обработку интерпретатору языка (могут быть и иные ситуации, языки, платформы и способы общения сервера с обработчиком), интерпретатор в свою очередь возвращает в поток вывода сервера результат в том или ином формате (HTML, text, JSON, двоичные файлы, не важно), результат отправляется в двух "порциях": заголовки и тело. JavaScript выполняется непосредственно в браузере, и может обращаться к серверу, например, вызывая PHP-сценарии. Браузер ничего не знает о PHP коде, JavaScript ничего не знает о PHP коде, и наоборот, сервер ничего не знает о работе страницы в браузере. Обмен идет запросами браузера к серверу.

    Таким образом, Вам нужно убрать PHP код из JavaScript тела, вывести этот код в отдельный сценарий, и обратиться к нему с помощью Ajax. У вас уже есть обращение к серверу с fetch('send.php') вот тут Вы передаете на сервер данные формы. Код, который Вы хотите выполнить в index.php, Вам нужно выполнять в send.php , этот код должен вернуть JSON, который получится в этот блок: .then(result => {

    Как вернуть JSON из send.php — отдельная задача, у вас же PHP код возвращает переадресацию, и будет ли она принята и выполнена Вашим движком запросов к серверу — библиотекой fetch. Возможно, Вам нужно вручную выполнить переадресацию, получив заголовок в response.headers.get('Location') или найдя другое решение;
    Ответ написан
    Комментировать
  • Как настроить отправку через phpmailer?

    gscraft
    @gscraft
    Программист, философ
    Илья Филонов, давайте разберемся.

    # Тут Вы говорите Apache, следующее (RewriteRule) правило при условии, если адрес не равен /maintenance.html :
    RewriteCond %{REQUEST_URI} !/maintenance.html$
    # Тут говорите, следующее правило при условии, если адрес не равен 171.33.255.61:
    RewriteCond %{REMOTE_ADDR} !^171.33.255.61
    # Тут обязываете Apache ВСЁ, что не подпадает под правила выше, переадресовать на /maintenance.html
    RewriteRule $ /maintenance.html [R=302,L]


    Apache-настройка переадресации в общем случае так и работает: условия, условия, правило; условия, еще условия, правило. После выполнения всех условий и правил Apache действует установленным образом для переадресации директории.

    Вам нужно перенаправить все, кроме mail.php на заглушку, так?

    1 вариант, это с помощью фронт-контроллера PHP, адресуя все на скрипт index.php стандартным для движка способом, в начале которого определять наличие $_POST / mail, и все, что кроме, отдавать на mainstance.html: header('Content-Type: text/html'); die(file_get_contents(__DIR__ . '/mainstance.html')); При этом, в htaccess у вас остаются стандартные правила (WP так и так адресует на index.php).

    2 вариант, это оставить Вашу версию .htaccess, но добавить правило RewriteCond %{REMOTE_URI} !/mail.php$ (или RewriteCond %{REQUEST_FILENAME} !mail.php, тут уж пробуйте сами в Вашем контексте)

    3 вариант, найти плагин для WordPress для заглушки mainstance, поверьте, такие решения там есть, как есть плагины для оправки формы контактов.
    Ответ написан
    5 комментариев
  • Как получить id из ключа массива?

    gscraft
    @gscraft
    Программист, философ
    Вопрос наверное в том, как получить ключ? Т.к. в Вашем случае получить идентификатор из подобной строки можно любым удобным способом:
    $id = null;
    reset($array); // надежнее обнаружить нужный ключ перебором и последующей проверкой
    $key = key($array);
    $match = null;
    if ( preg_match('/^id:(\d+)/', $key, $match) ) $id = (int) $match[1];
    Ответ написан
    1 комментарий