• Как сделать подстановку в json файл?

    @alexalexes
    Вычитать файл csv в ассоциативный массив вида:
    $city_dictionary[$en_name] = $ru_name;
    И произвести замену:
    //$data['response'][0]['cities'][0] - вы уверены, что по конечному нулевому индексу находится весь список, а не один город?
    foreach($data['response'][0]['cities'][0] as $city_key => $city)
    {
      if(array_key_exists($city, $city_dictionary))
       $data['response'][0]['cities'][0][$city_key] = $city_dictionary[$city];
    }

    После этого $data можно конвертнуть обратно в json и в нем будет заменено то, что было в словаре $city_dictionary.
    PS: Метод имеет ограничение. В текущем формате ассоциативного массива $city_dictionary нельзя разместить два равноправных варианта перевода. В случае наличия альтернативного варианта русского перевода, из csv будет извлечен в массив последний вариант.
    PS2: Ассоциативный массив словаря ограничен объемом выделенной оперативной памяти скрипта.
    Для более объемного словаря целесообразно делать выгрузку в базу данных и от туда использовать словарь, либо в memcache - архитектура технологии идеально подходит под условия вашей задачи. Но использовать и ту и другую нужно имея небольшой опыт.
    Ответ написан
  • Как исправить файл стиля xsl?

    @alexalexes
    Сложно сделать first- или last- специфичный выходной элемент, так как нельзя внятно получить значение position.
    Однако, можно воспользоваться таким костылем:
    1) Вывести запятую и перенос строки впереди очередного элемента VALUES, сохранив перенос после элемента.
    2) Закомментировать лишнюю запятую в запросе.
    То есть добиться такого вывода:
    INSERT INTO table (config, allowance, tablename) VALUES --,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Ph'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc1'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc12'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''Mc2'']/Voltage', 3, 'number_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Amperage', 3, 'float_actual')
    ,
    ('Station/Equip/Slot/Item[@key=''1'']/Supply/Item[@key=''An'']/Voltage', 3, 'number_actual')
    ;

    Правило:
    INSERT INTO table (config, allowance, tablename) VALUES --</xsl:text><xsl:apply-templates/>
        <xsl:text>;</xsl:text>
      </xsl:template>
      
      <xsl:template match="node()[@format]">
        <xsl:variable name="allowance" select="Allowance/@value"/>
       <xsl:text>,&#10;</xsl:text> <!-- Сюда добавлены запятая и перенос -->    
    <xsl:value-of select="concat('(', $apostrophe)"/>
        <xsl:for-each select="ancestor::*">
          <xsl:variable name="element" select="local-name()"/>
          <xsl:value-of select="$element"/>
          <xsl:if test="$element='Item'">
            <xsl:value-of select="concat('[@key=', $apostrophe, $apostrophe, @key, $apostrophe, $apostrophe, ']')"/>
          </xsl:if>
          <xsl:text>/</xsl:text>
        </xsl:for-each>
        <xsl:choose>
          <xsl:when test="starts-with(@format, 'N')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'number_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'F')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'float_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:when test="starts-with(@format, 'D')">
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'decimal_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="concat(local-name(), $apostrophe, ', ', $allowance, ', ', $apostrophe, 'string_actual', $apostrophe, ')')"/> <!--убран вывод последней запятой -->
          </xsl:otherwise>
        </xsl:choose>
        <xsl:text>&#10;</xsl:text>
      </xsl:template>
      <xsl:template match="text()"/>
    </xsl:stylesheet>
    Ответ написан
    Комментировать
  • Почему при возведении -1000 в 1/3 степень получается Nan?

    @alexalexes
    Выражение:
    $result = -1000 ** (1 / 3);
    выполняется с таким приоритетом:
    $result = -(1000 ** (1 / 3));
    Поэтому тут нет NAN.
    Ответ написан
    Комментировать
  • Как правильно вывести массив из бд и перебрать его?

    @alexalexes
    На этом фрагменте строки:
    => '{type' =>
    у вас должно закрасться подозрение, что нужно собирать вложенный объект как-то по другому, а именно:
    $taskList[] = array( // старый способ объявления массива, можно [, но не суть
    'type' => 'Feature', 
    'id' => $row->id, 
    'geometry' => // в json-е встретилась фигурная скобка (свойство-объект) - повторяю ее открытие в своей конструкции 
    [ // это хоть и объявление массива, но в определенном режиме в JSON конвертнется в объект, так как имена свойств ассоциативные
      'type' => 'Point', 
      'coordinates' =>
        [ // а тут массив останется массивом, так как о ключах ни слова (они по индексу)
        $row->coordinates,
        $row->coordinates2
        ] // конец свойства coordinates
    ] // конец свойства geometry
    
    );
    Ответ написан
    1 комментарий
  • Какая разница между генераторами и массивами?

    @alexalexes
    https://www.php.net/manual/ru/language.generators....
    foreach (xrange(1, 9, 2) as $number) {
        echo "$number ";
    }

    Если рассказать простым языком магии, то при таком вызове внутри foreach, функция xrange определяет, что ее результат не собираются записывать в отдельную переменную, а собираются перебирать по элементам.
    Поэтому, когда выполнение интерпретатора php доходит до команды as, функция xrange выполняется до первого попавшегося yield внутри этой функции и возвращает это значение. При этом, контекст функции запоминается, а также внутренний цикл:
    for ($i = $start; $i <= $limit; $i += $step) {
                yield $i;
    }

    засыпает до того момента, пока во внешнем foreach выполнение не пройдет команду as еще раз, тогда произойдет размораживание yield и извлечение следующего значения, чтобы использовать его только как один элемент $number.
    За счет того, что as меняет режим работы вызова функции xrange, получается не извлекать все подряд.
    Ответ написан
    Комментировать
  • Как спасти данные на HDD?

    @alexalexes
    Подключить к компу диск через sata и загрузить комп флешкой с утилитами Acronis. Эти утилиты не будут лишний раз опрашивать диск, как это делает ОС при загрузке, есть шанс одним-двумя движениями что-то сделать с файлами или разделом диска, не требуя от диска 100% работоспособности.
    Конкретно - воспользоваться утилитой Acronis Disk Director. На разделе диска использовать опцию "Посмотреть файлы". Если утилита прочитает раздел, то откроет просмотр. С помощью нее можно скопировать файлы на другой диск.
    Если раздел не определился, то можно попробовать восстановить его.
    Ответ написан
    Комментировать
  • Как удалить элемент массива в localstorage, по нажатию на крестик, и перезаписать массив?

    @alexalexes
    Нужно использовать обертку+замыкание для обработчика, удаляющего элемент по клику.
    tasks.push(data); // тут вставили очередной элемент
    let task_index = tasks.length - 1; // узнаем его индекс по длине массива, так как он в текущей ситуации последний
    // несколько строк спустя
    b1.addEventListener("click", 
    (function(inner_task_index) // функция-обертка для изоляции контекста, сюда передается значение task_index, я специально выделил его другим именем inner_task_index, чтобы видеть контекст функции-обертки
      {
    // обертка возвращает функцию-обработчик события  для addEventListener
    return function delFromLocalSt() {
        task.removeChild(li);
            let array = JSON.parse(localStorage.getItem('task'));
            array.splice(inner_task_index, 1); // удаляем элемент по известному индексу используя механизм замыкания, используя контекст функции обертки
        localStorage.setItem('task', JSON.stringify(array));
       }
    })(task_index) // вызываем хитрую обертку, чтобы обеспечить изоляцию переменной от контекста функции createEl
    );
    Ответ написан
    1 комментарий
  • Зачем нужен multitouch на 10 касаний?

    @alexalexes
    Тоже искал на этот вопрос ответ. Из всего вороха статей и видеороликов можно сделать вывод.
    1. Для 99% задач хватит поддержки 2-3 одновременных касаний сенсора.
    2. Сенсор, который поддерживает 2 одновременных касания имеет технические ограничения, не позволяющие определять 2 касания в точках, расположенных на одной оси. В связи с этим нужно использовать сенсор с не менее 5 одновременных касаний. В нем не сэкономили на технологии изготовления, и регистрация 2-3 касаний гарантирована в любых точках.
    3. Теоретически, в сенсор на 10 касаний могли заложить более высокое разрешение в плане детализации точек касания (как бонус не экономии на технологии), что позволило бы точно захватывать более мелкие детали интерфейса. Но этот тезис нужно подтверждать либо техническими характеристиками, либо экспериментально.
    Ответ написан
    Комментировать
  • Как правильно организовать ссылку на значение в связанной таблице?

    @alexalexes
    Нет смысла. Вы не для красоты в таблице Book завели свойство author_id, чтобы связывать по нему строку из таблицы Author, тем самым получать доступ ко всем свойствам по идентификатору author_id.
    PS: А вы уверены что у книжки строго один автор? Или это для вас просто учебный пример?
    Ответ написан
  • Где в Chrome, нужно смотреть JS-события, применённые к элементу во время какого-либо действия с этим элементом?

    @alexalexes
    F12. Раздел "Элементы", выбираете элемент, на котором нужно посмотреть обработчик события. В области интерфейса для просмотра свойств элемента выбираете вкладку "Прослушиватели событий". Выбираете вид события, и выбираете точку входа в JS коде на это событие. Далее, при просмотре кода JS на вкладке "Источники" выбираете, где вам поставить точки останова, чтобы словить остановку выполнения обработки события.
    PS: Такой метод исследования работает только на ванильном или слабо прототипированном коде, написанный без применения библиотек и фреймворков. При использовании библиотек и фреймворков точки привязки событий будут указывать, как правило, на одну единственную функцию в этой библиотеке, отвечающей за высокоуровневый байндинг событий. В этом случае нужно изучать, какие инструменты для отладки есть в самой библиотеке или фреймворке.
    Ответ написан
    Комментировать
  • Как сделать, чтобы неподходящие под условие не забивали лимит?

    @alexalexes
    Вариант А.
    Вы не можете гарантировать, что любой файл изображений, сведения о которых храните в базе, будет доступен физически в любой момент.
    Придется неопределенное число раз постучаться в базу и протестировать каждую запись о файле, существует ли он физически. При тесте формируем список мертвых и живых файлов. После того, как протестировали нужное кол-во живых файлов, можно делать итоговый запрос с оглядкой на список мертвых файлов.
    $need_count = 10;  // сколько требуется файлов для выборки
    $alive_count  = 0;  // сколько живых файлов
    $is_need_repeat = true; // требуется повторить попытку получить живые файлы
    $death_list = []; // сюда накапливаем список id мертвых файлов
    $alive_list = []; // сюда накапливаем список id живых файлов
    while($is_need_repeat) // Если можно делать итерационную попытку и пока не набрали нужное количество живых файлов
    {
    // Этот запрос, чтобы прощупать целостность файлов, достаточно получить только те атрибуты, которые позволяют проверить его путь и запомнить id.
    $database->setQuery("
        SELECT id
        from блаблабла
        WHERE блаблабла 
                   ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса, они нам не нужны
                   ".(count($alive_list) > 0 ? : ' and id not in ('.join(',',$alive_list).') ' : '')." -- отсеиваем живые файлы из запроса, мы их уже проверяли
        ORDER блаблабла
    limit 0,".($need_count - $alive_count)); // делаем лимит по оптимистичному сценарию, как будто можем получить список файлов, и все они будут живые, но только то кол-во, которое недостает
    while($row = mysql_fetch_assoc($request))
    {
      if(file_exists('/www/ПУТЬ/'.$row['id'].'_100.jpg'))
      {
        $alive_list[] = $row['id']; // файл живой, заносим его id в список
      }
      else
      {
        $death_list[] = $row['id']; // файл мертвый, заносим его id в список
      }
      $curr_alive_count = count($alive_list);
      $is_need_repeat = $curr_alive_count > 0 && $curr_alive_count > $alive_count && $curr_alive_count < $need_count; // необходимо продолжить попытки, если на текущей итерации получили хоть один живой файл, живых файлов на этой итерации оказалось больше, чем на предыдущей, и их кол-во не достаточно до необходимого
      $alive_count = $curr_alive_count; // вписываем кол-во живых файлов на текущей итерации для проверки в будущем цикле (чтобы сравнить результаты двух циклов)
    }
    }
    // теперь можно сделать нормальный запрос, исключив мертвые файлы:
    $database->setQuery("
        SELECT *
        from блаблабла
        WHERE блаблабла 
                   ".(count($depth_list) > 0 ? : ' and id not in ('.join(',',$death_list).') ' : '')." -- отсеиваем мертвые файлы из запроса
        ORDER блаблабла
    limit 0,".$need_count);

    Вариант Б.
    Вы можете гарантировать, что контролируете целостность файлов.
    Тогда в таблице изображений делаете колонку is_del. Когда удаляете файл, вы должны пометить запись о файле в базе как удаленную по этому атрибуту.
    Если вы все таки частично контролируете целостность, то в определенный период времени (например, запускать скрипт по cron раз в час, сутки) вам нужно пройтись по всему списку файлов в базе и проверить целостность каждого файла, и внести актуальную метку is_del.
    Тогда получать живые файлы будет чуть-чуть проще:
    $database->setQuery("
        SELECT *
        from блаблабла
        WHERE блаблабла 
               and is_del is null -- или нулю, в зависимости, что будет по умолчанию
        ORDER блаблабла
    limit 0,".$need_count);
    Ответ написан
    4 комментария
  • Как изменить exe file?

    @alexalexes
    Если приложение не предусматривает использование отдельного конфиг файла с настройками видеорежима, то в общем случае - никак. Подобные характеристики заложены в файлах проекта у разработчиков приложения. Естественно, эти исходные файлы вам никто не предоставит.
    Есть вариант сделать реверс инжиниринг exe файла и попытаться найти нужные байты, отвечающие за видеорежим.
    Но если вы задаете такой вопрос, значит вы не знакомы с реверс инжинирингом. Чтобы им пользоваться, мало простого знакомства с процессом декомпиляции, нужно на этом собаку съесть.
    Ответ написан
    Комментировать
  • Какие проблемы могут возникнуть при работе программы с файлом БД из удаленной папки?

    @alexalexes
    Вариант с стандартным сервером БД, решающий все вопросы выше пока исключен.

    Вы не ищите легких путей. Перестаньте мыслить файлами с общим доступом в качестве хранилища. Эту роль как раз целиком и полностью берет полноценная СУБД в вашем кейсе.
    Ответ написан
    Комментировать
  • Как сделать такую штуку в HTML?

    @alexalexes
    Можно честно спиратить из vk.com плашку "Новые сообщения".
    <h4 class="im-page--history-new-bar _im_unread_bar_row">
    :before
    <span>Новые сообщения</span>
    :after
    </h4>
    Ответ написан
    Комментировать
  • Как извлечь данные записи бд по кнопке?

    @alexalexes
    В href записываете get параметр id строки.
    <a href="?id=1">см. запись</a>
    Если текущий список php используется для вывода всего списка, то скрипт нужно модифицировать так, что принимая параметр id, он начал работать по логике вывода сведений одной строки. Нет параметра - выводим все.
    if(isset($_GET['id']))
    {
      // тут код или вызов функции для работы с одной записью
    }
    else
    {
      // тут код или вызов функции для вывода всего списка
    }

    В ветке кода, где работаем с одной записью, подставляем get параметр в запрос:
    msqli_prepare("текст запроса ... where id = ?"); // ставим в нужное место запроса параметрические метки
    msqli_bind_param("i", $_GET["id"]); // передаем параметр на место меток-вопросов, в каком порядке они идут
    msqi_execute();
    // msqli_fetch функция и форматированный вывод сведений

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

    @alexalexes
    Самое ленивое исправление - заменить n на k в двух местах.
    Console.WriteLine("\nЭлементы нового массива: ");
    for (int i = 0; i < n /* тут заменить на k */; i++)
                {
                    Console.Write(n_numbers[i] + " ");
                }
    
                Console.WriteLine("\nЗначение среднего арифметического нового массива: " + SearchAverage(n_numbers, n /* тут заменить на k */));
    Ответ написан
    6 комментариев
  • Как сверстать блок, чтобы дочерние элементы переносились на новую строку с учетом фиксированной кнопки в углу?

    @alexalexes
    Как упомянуто в соседнем ответе, будет очень костыльно и чисто для спортивного интереса.
    К тому же, есть ограничение на фиксированный размер элемента, которое вам не нужно.
    <style>
        div.container
        {
          display: flex;
          flex-wrap: wrap;
          width: 770px;
          height: 90px;
          background-color: green;
          overflow: hidden;
        }
        div.container > div
        {
          width: 60px;
          height: 25px;
          background-color: #df1245;
          text-align: center;
          margin: 5px;
          padding: 5px 0;
        }
        div.container > div:nth-child(n + 22) /*этим селекторам задаем свойство сортировки элементам, которые идут после кнопки "показать еще" если контейнер будет адаптивным, придется прописывать кучу вариантов nth-child */
        {
          order: 2;
        }
        div.container > label.more
        {
          display: block;
          width: 130px;
          height: 25px;
          margin: 5px;
          padding: 5px 0;
          text-align: center;
          order: 1; /* У кнопки стоит такой индекс сортировки чтобы оказаться между видимыми и невидимыми элементами */
          background-color: #78d412;
        }
        div.container label.more span.less
        {
          display: none;
        }
        #show-more-state
        {
          display: none;
        }
        #show-more-state:checked ~ div.container
        {
          height: auto;
        }
        #show-more-state:checked ~ div.container label.more
        {
          order: 3;
          margin-left: auto;
        }
        #show-more-state:checked ~ div.container label.more span.more
        {
          display: none;
        }
        #show-more-state:checked ~ div.container label.more span.less
        {
          display: initial;
        }
      </style>
      <input id="show-more-state" type="checkbox"/> <!-- Этим чекбоксом запонимаем состояние кнопки, чтобы можно было оттолкнуться стилями от превдокласса :checked -->
      <div class="container">
        <label class="more" for="show-more-state"><span class="more">ПОКАЗАТЬ ЕЩЕ</span><span class="less">СВЕРНУТЬ</span></label>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
        <div>ITEM</div>
      </div>
    Ответ написан
  • Как записать выбранное значение в скрытый инпут?

    @alexalexes
    С практической точки зрения целесообразно использовать не текстовое значение label, а для каждого элемента input[type="radio"] снабдить своим value. Установленное value от радиокнопки легче получать и потом как-то использовать.
    Но если хочется с текстовыми пунктами играться, то можно их вычленить так:
    $("input[name='block1']").on('change', function() 
    {
      let current_label = this.parentNode.querySelector('label'); // от кликнутого элемента this получаем родителя, в родителе ищем первый попавшийся label - предположительно он содержит, то что нужно. 
      $("input[name='block1_check']").val(current_label.innerText); // вставляем в нужный скрытый инпут содержимое label
    })
    Ответ написан
  • Как быть с 4 уровневой вложенностью кавычек в HTML?

    @alexalexes
    На более вложенном уровне экранирования нужно два символа экранирования \
    Первый символ экранирует символ экранирования для следующего уровня.
    Второй символ экранирует кавычку, чтобы не включало закрытие кавычки на уровне PHP.
    $value = '<form method="post">
    <button type="submit" onclick="return confirm(\'Вы уверены, что хотите сменить статус на \\\'Доставлен\\\' ?\')">Доставить</button>
    </form>';

    Вариант 2. Чтобы забыть об экранировании на уровне PHP, можно воспользоваться синтаксисом heredoc, который позволит вставлять любое константное содержимое без явного экранирования.
    $value = <<<ANY_RANDOM_SYMBOLS_FOR_BORDER
    <form method="post">
    <button type="submit" onclick="return confirm('Вы уверены, что хотите сменить статус на \'Доставлен\' ?')">Доставить</button>
    </form>
    ANY_RANDOM_SYMBOLS_FOR_BORDER;
    Ответ написан
    1 комментарий
  • Как исправить ошибку закрытия таба при попытки ввода информации в input?

    @alexalexes
    На элемент inputa type="number" повесить обработчик события клика с вызовом остановки всплытия события.
    PS: Ссылка для получения полного понимания механизма всплытия/погружения событий.
    Ответ написан
    Комментировать