Ответы пользователя по тегу PHP
  • Как реализовать склонения слов после чисел в исходном коде php?

    vhood
    @vhood
    Не забывайте отмечать решения
    Не ломать голову и использовать готовый инструмент

    Пример из README (только на русском):
    echo Carbon::now()->subMinutes(2)->locale('ru_RU')->diffForHumans(); // '2 минуты назад'

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

    vhood
    @vhood
    Не забывайте отмечать решения
    Можно использовать массив с названиями подключаемых файлов и перемешивать его с помощью shuffle перед выводом.
    Выводить в цикле.
    $files = [
        'file-foo.php',
        'file.php',
        'file2.php',
        'file-bar.php',
        'file3.php',
    ];
    shuffle($files);
    
    foreach  ($files as $file) {
        include ($file);
    }


    Если файлов много, 10 файлов можно подключать, выбрав срез массива имен файлов
    foreach  (array_slice($files, 0, 10) as $file) {
        include ($file);
    }

    Однако операция shuffle для большого массива может быть затратной, по-этому вместо shuffle и array_slice можно воспользоваться array_rand
    - shuffle($files);
    
    - foreach  ($files as $file) {
    + foreach  (array_rand($files, 10) as $file) {
        include ($file);
    }
    Но array_rand не подойдет, если нужно сделать некую пагинацию (выводить первые 10 случайных файлов, затем следующие 10 других случайных файлов и в итоге вывести все файлы в случайном порядке, а затем поменять порядок и снова выводить по 10). Подход с array_slice позволит сделать такую пагинацию.
    Ответ написан
    2 комментария
  • Как локализовать дату регистрации пользователя wordpress?

    vhood
    @vhood
    Не забывайте отмечать решения
    $datetime = new DateTime($user_reg);
    + $formatter = new IntlDateFormatter('ru_RU');
    + $formatter->setPattern('d MMM, Y');
    
    - echo $datetime->format('F j, Y');
    + echo $formatter->format($datetime);


    Должен быть установлен модуль php-intl
    Ответ написан
    Комментировать
  • Вывод определенной информации на страницах с конкретными именами в адресе URL с помощью strpos?

    vhood
    @vhood
    Не забывайте отмечать решения
    Просто добавить логики в условие.

    В PHP 8 есть str_contains

    if (!str_contains($url, '/info/') && !str_contains($url, '/news/')) {
        echo 'вывод содержимого';
    } else {
        echo 'вывод содержимого';
    }
    Ответ написан
    1 комментарий
  • Функция str_replace() не работает?

    vhood
    @vhood
    Не забывайте отмечать решения
    html_entity_decode()

    https://onlinephp.io/c/9d203 (при работе с этой строкой, учтите, что в строке есть кавычка)
    Ответ написан
    4 комментария
  • Регулярное выражение поиск по группам или нет?

    vhood
    @vhood
    Не забывайте отмечать решения
    preg_match()
    $str = "$status['Совершенно_новое'] = 'Brand_new<br>New'";
    $pattern = "(?<=\$status\[')([а-яА-ЯёЁa-zA-Z]+?.*')([A-za-z]+?.*)(?=')";
    preg_match($patern, $str, $matches);
    
    var_dump($matches);
    // полный match и группы


    Паттерн получше: \$status\['([^']+)'\][^']*'([^']*)'
    https://regex101.com/r/10CLSM/1
    Ответ написан
  • Как подружить html с json?

    vhood
    @vhood
    Не забывайте отмечать решения
    HTML - язык разметки, никакие значения он не меняет
    Ответ написан
    Комментировать
  • Переписать грамотнее и с помощью Laravel реально ли и каким лучше образом?

    vhood
    @vhood
    Не забывайте отмечать решения
    Выводить HTML через echo точно не правильно, изначально PHP полюбили как раз за то, что можно закрыть PHP тег ?> и писать чистый HTML, можно посреди HTML открыть PHP тег <?php и воспользоваться языком, например вывести HTML в цикле (опять же, закрыв тег после начала цикла), или использовать переменную как значение, или выводить HTML по условию.

    В Laravel используется шаблонизатор Blade, но если есть ощущение, что Laravel изучать еще рано, можно через composer поставить какой-нибудь самостоятельный шаблонизатор (искать не сложно) и научиться пользоваться им.

    тут всякие визуальные уточнения страницы; форма, css специфика для страницы
    css стоит писать отдельно и подключать как файл/файлы, для формы будет отдельный шаблон

    тут всякие оперативные реакции на действия в браузере требуемые страницей.
    js тоже стоит писать отдельно и подключать как файл/файлы

    Работа с шаблонами - не самое востребованное знание, скорее очень базовое. Стоит так же изучить:
    • Архитектурный паттерн MVC (Model, View, Controller), т.к. его все популярные фреймворки реализуют и с ним так или иначе придется работать
    • Базы данных и SQL. Обязательно нужно уметь проектировать таблицы и индексы, забирать данные из базы и обновлять их
    • Безопасность, или как правильно писать приложения, что-бы их не взломали SQL инъекциями, XSS атаками и т.д.
    • Маршрутизацию. Можно попробовать найти какой-нибудь php-router на github и изучить работу с ним, внедрить в проект

    Таким образом, приложение будет обрабатывать запрос через некий роутер, посылать его в контроллер (буква C из MVC), контроллер запросит данные в какой-нибудь модели (M), отправит их в шаблон некого шаблонизатора и вернет с его помощью готовый HTML.

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

    Так же добавлю, что первую работу лично я нашел без знания фреймворков, но хорошее знание языка и баз данных, а так же знания HTML, CSS и базовые знания JS - обязательно. Да и без фронтенда динамичный сайт не сделать, но начать изучение фронтенда лучше всего с изучения чистого javascript, т.к. знание языка важнее и открывает правильную дорогу дальше. А вот на каком этапе изучения останавливаться и куда больше делать упор - решать Вам.
    Ответ написан
    1 комментарий
  • Как правильно сформировать запрос и вывести данные в цикле?

    vhood
    @vhood
    Не забывайте отмечать решения
    Если "в лоб":

    1. Убираем группировку, никаких подгрупп база не выдаст, будет по 1 записи на "уровень"
    - $ref_system = $pdo->prepare("SELECT * FROM `db_ref_system` GROUP BY `rs_type` ORDER BY `id` ASC");
    + $ref_system = $pdo->prepare("SELECT * FROM `db_ref_system` ORDER BY `id` ASC");


    2. Фильтруем итоговый вывод в 3 массива и выводим их
    <?php
    $all = $ref_system->fetchAll();
    $plc = array_filter($all, fn ($fields) => $fields['rs_type'] === 'plc');
    $deposit = array_filter($all, fn ($fields) => $fields['rs_type'] === 'deposit');
    $offer = array_filter($all, fn ($fields) => $fields['rs_type'] === 'offer');
    ?>
    <?php foreach ([$plc, $deposit, $offer] as $level => $data): ?>
      <div class="col-md-4 col-12 mb-lg-0 mb-4">
        <div class="fw-bold h5 mb-3">
          <?= $level + 1 ?>-й уровень
        </div>
        <?php foreach($data as $ref) : ?>
        <div class="mb-4">
          <span class="text-muted fw-semibold"><?=$ref['rs_type']?></span>
          <div>
            <div class="d-flex align-items-center pt-2">
              <div class="progress w-100">
                <div class="progress-bar bg-warning" role="progressbar" style="width: 100%;" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
              </div>
              <span class="ms-3 fw-bold text-warning"><?=$ref['rs_percent']?>%</span>
            </div>
          </div>
        </div>
        <?php endforeach; ?>
      </div>
    <?php endforeach; ?>
    Ответ написан
    5 комментариев
  • Как поулчить XML выгрузку на Битрикс с вложенными атрибутами?

    vhood
    @vhood
    Не забывайте отмечать решения
    Если это (ссылку взял из комментов в документации) и есть класс \Bitrix\Main\XmlWriter, то с его помощью - никак.

    Он пишет сразу в файл, так что и регуляркой итоговый результат не пройти.

    Можно залезть в него рефлексией, но в программировании это моветон и читабельность кода будет ухудшена.

    Самый оптимальный вариант - наследовать этот класс, изменить несколько его функций и использовать унаследованный класс. Примерно так:
    class AppXmlWriter extends XmlWriter
    {
        private $file = '';
        private $charset = '';
        private $tab = 0;
        private $f = null;
        private $lowercaseTag = false;
        private $errors = array();
    
        // конструктор скопирован, т.к. там все private
        public function __construct(array $params)
        {
            if (isset($params['file']))
            {
                $server = \Bitrix\Main\Application::getInstance()->getContext()->getServer();
                $this->file = $server->getDocumentRoot() . trim($params['file']);
                // create new file
                if (
                    isset($params['create_file']) &&
                    $params['create_file'] === true &&
                    is_writable($this->file)
                    )
                {
                    unlink($this->file);
                }
            }
            if (isset($params['charset']))
            {
                $this->charset = trim($params['charset']);
            }
            else
            {
                $this->charset = SITE_CHARSET;
            }
            if (isset($params['lowercase']) && $params['lowercase'] === true)
            {
                $this->lowercaseTag = true;
            }
            if (isset($params['tab']))
            {
                $this->tab = (int)$params['tab'];
            }
        }
    
        public function prepareAttributes(array $attributes): string
        {
            $result = '';
    
            if (empty($attributes)) {
                return $result;
            }
    
            foreach ($attributes as $key => $value) {
                $result .= sprintf(' %s="%s"', $key, $value);
            }
    
            return $result;
        }
    
        public function writeBeginTag($code, array $attributes = [])
        {
            if (!$this->f) {
                return;
            }
    
            fwrite($this->f, str_repeat("\t", $this->tab) . '<' . $this->prepareTag($code) . $this->prepareAttributes($attributes) . '>' . PHP_EOL);
            $this->tab++;
        }
    
        public function writeFullTag($code, $value, array $attributes = [])
        {
            if (!$this->f) {
                return;
            }
    
            $code = $this->prepareTag($code);
            $codeAttributes = $this->prepareAttributes($attributes);
            fwrite($this->f,
                str_repeat("\t", $this->tab) .
                (
                    trim($value) == ''
                    ? '<' . $code . $codeAttributes . ' />' . PHP_EOL
                    :   '<' . $code . $codeAttributes . '>' .
                    $this->prepareValue($value) .
                    '</' . $code . '>' . PHP_EOL
                )
            );
        }
    }
    Ответ написан
    1 комментарий
  • Как исправить синтаксическую ошибку в Битрикс?

    vhood
    @vhood
    Не забывайте отмечать решения
    Можно засунуть код в редактор, который подсвечивает синтаксис, и исправить там.

    Ошибок много, какие-то символы )"&gt; после span идут, href не назначен (переменная вызывается, в которой массив, а ключ массива отсутствует и php не закрывается).

    Вот, немного поправил именно тот участок, что предоставлен:
    <a href="<?=$arSection["SECTION_PAGE_UR"]?>" data-bx-app-ex-href="<?=$arSection["SECTION_PAGE_UR"]?>" class="section">
    			<div class="section__picture">
    				 <?
                                $picture = SITE_TEMPLATE_PATH.'/img/no_photo.png';
                                if ($arSection["PICTURE"] != ""){
                                    $picture = CFile::ResizeImageGet($arSection["PICTURE"], Array("height" => 175))["src"];
                                }
                                ?>
    				<div style="background-image:url('<span id=" title="Код PHP: &lt;?=$picture;?&gt;" class="bxhtmled-surrogate">
    					<span class="bxhtmled-surrogate-inner"><span class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>
    				</div>
    				<div class="section__icon">
     <i class="far fa-sign-in"></i>
    				</div>
    			</div>
    			<div class="section__main">
    				 <?=$arSection["NAME"];?>
    			</div>
     </a>
    		</div>
    		 <?
                    if ($s > 5)
                        break;
                    $s++;?> <?endforeach;?>
    	</div>
    	 <?if (count($arSections) > 6):?>
    	<div class="button-line">
     <a href="/katalog/" class="button button_black wstyle wstyle_white">Посмотреть все категории</a>
    	</div>
    	 <?endif;?>
    </div>
     <?endif;?> <?
    $iblock_id = 4;
    $arServices = Array();
    $arFilterE = Array("IBLOCK_ID" => $iblock_id, "ACTIVE" => "Y");
    $arSelectE = Array("IBLOCK_ID", "ID", "NAME", "PREVIEW_PICTURE");
    $rsElement = CIBlockElement::GetList(
        Array("SORT"=>"ASC"),
        $arFilterE,
        false,
        false,
        $arSelectE
    );
    while($arElement = $rsElement->GetNextElement()){
        $arFieldsE = $arElement->GetFields();
        $arServices[] = $arFieldsE;
    }
    ?> <?if (count($arServices) > 0):?>
    <div class="block block_border">
    	<div class="title title_center">
    		Популярные услуги
    	</div>
    	<div class="row">
    		 <?$s = 1;?> <?foreach ($arServices as $arService):?>
    		<div class="col-lg-4">
     <a href="<?=$arService["DETAIL_PAGE_URL"]?>" data-bx-app-ex-href="<?=$arService["DETAIL_PAGE_URL"];?>" class="section section_wtitle">
    			<div class="section__picture">
    				 <?
                                $picture = SITE_TEMPLATE_PATH.'/img/no_photo.png';
                                if ($arService["PREVIEW_PICTURE"] != ""){
                                    $picture = CFile::ResizeImageGet($arService["PREVIEW_PICTURE"], Array("height" => 200))["src"];
                                }
                                ?>
    				<div style="background-image:url('<span id=" title="Код PHP: &lt;?=$picture;?&gt;" class="bxhtmled-surrogate">
    					<span class="bxhtmled-surrogate-inner"><span class="bxhtmled-right-side-item-icon"></span><span class="bxhtmled-comp-lable" unselectable="on" spellcheck="false">Код PHP</span></span>
    				</div>
    				<div class="section__title">
    					 <?=$arService["NAME"];?>
    				</div>
    			</div>
     </a>
    Ответ написан
    1 комментарий
  • Как правильно пройтись циклом внутри другого?

    vhood
    @vhood
    Не забывайте отмечать решения
    Одиакового ничего, идея скорее всего выводить по идексу в массиве

    Значит нужно по индексу и связывать
    <?php foreach ($arItem['PROPERTIES']['IMG_BEFORE']['VALUE'] as $index => $arImgBeforeSrc): ?>
        <?php $arImgAfterSrc = $arItem['PROPERTIES']['IMG_AFTER']['VALUE'][$index] ?>
        <div class="cocoen">
          <img data-src="" class="blog-list__item-image<?=($arParams['ROUNDED_IMAGE'] ? ' rounded' : '');?>" src="<?=CFile::getPath($arImgBeforeSrc);?>" alt="">
          <img data-src="" class="blog-list__item-image<?=($arParams['ROUNDED_IMAGE'] ? ' rounded' : '');?>" src="<?=CFile::getPath($arImgAfterSrc);?>" alt="">
        </div>
    <?php endforeach ?>

    Только в коде не учтен момент, когда изображение "после" может отсутствовать. Во избежание ошибки, вторую картинку лучше в условии выводить и в объявлении переменной $arImgAfterSrc проверку сделать.
    Ответ написан
    Комментировать
  • Как настроить PHP Psalm в VS Code для вложенной папки?

    vhood
    @vhood
    Не забывайте отмечать решения
    "psalm.configPaths": [
        "src/psalm.xml",
    ]
    Ответ написан
    Комментировать
  • Как сделать что бы открывалось модальное окно и в него выводились данные из БД?

    vhood
    @vhood
    Не забывайте отмечать решения
    Нужно с помощью JS посылать AJAX запрос на PHP скрипт.

    Далее 2 варианта:

    1) PHP скрипт возвращает данные (например, в формате JSON), JS заполняет поля модального окна этими данными и отображает его

    2) PHP скрипт возвращает HTML уже готового модального окна, JS только подставляет его в родительский элемент

    Пример запроса:

    async function openModal(id = 0){
        if(!id){
           return;
        }
    
        const response = await fetch(`library.php?id=${id}`);
        const responseText = await response.text();
    
       // Дальше делайте манипуляции с модальным окном и полученными данными
    }
    Ответ написан
  • Как вытащить строку из текста?

    vhood
    @vhood
    Не забывайте отмечать решения
    $str = '
    текст текст текст текст текст
    <tr><td>Габариты заводской упаковки (длина, ширина, высота): <b>35 x 16 x 9</b> см. </td></tr>
    <tr><td>Габариты упаковочной коробки (длина, ширина, высота): <b>40 x 21 x 14</b> см. </td></tr>
    текст текст текст текст текст
    ';
    
    preg_match('/Габариты упаковочной коробки.*<b>(.*)<\/b>/', $str, $matches);
    
    $value = array_key_exists(1, $matches) ? $matches[1] : null;
    
    var_dump($value);
    
    // 40 x 21 x 14
    Ответ написан
    1 комментарий
  • Как перебрать многомерный массив с учетом динамического промежуточного ключа?

    vhood
    @vhood
    Не забывайте отмечать решения
    $ids = [];
    foreach ($array['_embedded']['movement_acceptance'] as $acceptance) {
        $ids[] = $acceptance['id'];
    }
    var_dump($ids);
    Ответ написан
    2 комментария