Ответы пользователя по тегу PHP
  • Почему выдает ошибка composer, если я не в папке PHP?

    @Catrinblaidd
    Комп не знает, что такое 'php' . Ищет исполняемый файл с таким названием в глобальной переменной PATH или в текущей папке. Поэтому, когда Вы находитесь в корневой папке php, он находит, а в других папках - нет. Вам нужно вместо "php" везде писать "C:\Users\вова\Desktop\Server\php-getting-started\php". Или добавить этот путь в системную переменную PATH, как это сделать — зависит от Вашей операционной системы, легко найти инструкцию в поиске.
    Ответ написан
    Комментировать
  • Как проверить огромный массив и вывести данные?

    @Catrinblaidd
    $text = 'sometext"link":"mp3-1456/6567766876843"
    "link":"mp3-1234/5678"anyinfo"link":"mp3-14567890987654/6"';
    \preg_match_all('/\"link\":\"(mp3\-[\d]+\/[\d]+)\"/u', $text, $matches);
    echo '<pre>';
    var_dump($matches[1]);
    Ответ написан
    Комментировать
  • Как в древовидном ассоциативном массиве для каждого раздела создать "ключ-значение" с кодом дочернего раздела?

    @Catrinblaidd
    function addParent($array, $parent = null) {
      foreach ($array as $key => $value) {
        if (\is_null($parent)) {
          $array[$key]['category'] = addParent($value['category'], $value['@attributes']['code']);
          $array[$key]['@attributes'] = $value['@attributes'];
        } else {
          $array[$key]['code_parent'] = $parent;
        }
      }
      return $array;
    }


    Вы бы написали уже какой-нибудь класс под эту структуру.
    Ответ написан
  • Почему выскакивает ошибка заголовков при формировании csv файла?

    @Catrinblaidd
    Он же Вам человечьим языком молвит,
    Headers already sent in /usr/share/nginx/html/project.eng/modules/admin/controllers/ToursController.php on line 1557.

    Т.е. заголовки уже отправлены, в файле таком-то строке такой-то.
    Функцию header() можно вызывать только если клиенту еще не передавались данные. Т.е. где-то раньше был вывод через echo или html или функцию header(); Вот https://www.php.net/manual/ru/function.header.php
    Ответ написан
    Комментировать
  • Как сравнить только часть символов строки?

    @Catrinblaidd
    $name = 'testOne';
    $ending = \preg_replace('/[a-z]+([A-Z]+)/u', '$1', $name);
    switch ($ending) {
      case 'One': {
        echo 'One';
        break;
      }
      case 'Two': {
        echo 'Two';
        break;
      }
      case 'Three': {
        echo 'Three';
        break;
      }
    }
    Ответ написан
    Комментировать
  • Как рекурсией пройтись по массиву с категориями и в каждой категории получить элементы ["id"], ["parent"], ["name"]?

    @Catrinblaidd
    Вы бы текстом скопировали кусок структуры, а не картинкой. Кто же захочет разбираться?

    Если структура именно такая...
    code
    multimap($arr);
    
    function multimap($array, $level = 0) {
      $result = [];
      foreach ($array as $key => $data) {
        foreach ($data as $inner) {
          $result[$key] = [
            'id' => $inner['@attributes']['id'],
            'name' => $inner['@attributes']['name']
          ];
          if ($level == 0) {
            $result[$key]['parent'] = $inner['@attributes']['parent'];
          }
          unset($inner['@attributes']);
          $result = \array_merge($result, multimap($inner, $level+1));
        }
      }
      return $result;
    }


    Как вы живёте с такими массивами?)
    Ответ написан
    Комментировать
  • Как вывести php файлы из папки по дате?

    @Catrinblaidd
    $files = glob("blocks/*.php");
    $result = [];
    foreach ($files as $filename) {
      $time = \filectime($filename);
      $result[$time] = $filename;
    }
    ksort($result);
    foreach ($result as $file) {
      include($file);
    }
    Ответ написан
    7 комментариев
  • Как PHP вывести файлы по дате добавления?

    @Catrinblaidd
    $formats = ['pdf','mp4'];
    $files = \array_values(\array_diff(\scandir($path), ['..', '.']));
    $list = [];
    foreach ($files as $file) {
      \preg_match('/\.([^\.]+$)/', $file, $format);
      if (!empty($format)) {
        $format = $format[1];
        if (\in_array($format, $formats)) {
          $time = \filectime($path . $file);
          $time = \date("F d Y H:i:s.", $time);
          $list[$time] = $file;
        }
      }
    }
    \krsort($list);
    $list = \array_slice($list, 0, 5);
    foreach ($list as $date => $file) {
      echo "$file $date <br>"; 
    }
    Ответ написан
    Комментировать
  • Как на php создать блок с динамическими данными?

    @Catrinblaidd
    echo 'скачано ' . rand(100, 200) . ' раз';
    С правильными окончаниями:
    $nums = ['2', '3', '4'];
    $count = rand(100, 200);
    $a_num = mb_substr($count, -1, 1);
    $b_num = mb_substr($count, -2, 1);
    $str = 'раз';
    if (in_array($a_num, $nums) && $b_num != '1') $str .= 'а';
    echo "скачано $count $str";
    Ответ написан
  • Что значит у string число в скобках?

    @Catrinblaidd
    Это длина значения строки в байтах.
    Ответ написан
    Комментировать
  • Как распарсить данные из массива?

    @Catrinblaidd
    В поле full_response приходит просто текст. Как парсить - зависит от того, в каком виде нужно получить данные в итоге. Предполагаю, что вам нужно что-то вроде этого
    function makeArray($keys, $value) {
      $result = [];
      if (sizeof($keys) == 1) {
        $key = $keys[0];
        $result[$key] = $value;
      } else {
        $key = array_shift($keys);
        $result[$key] = makeArray($keys, $value);
      }
      return $result;
    }
    
    $path = 'http://api.warface.ru/user/stat/?name=Элез&server=1';
    $content = file_get_contents($path);
    $content = json_decode($content, TRUE);
    $fullResponse = $content['full_response'];
    $fullResponse = explode("\n", $fullResponse);
    $result = [];
    
    foreach ($fullResponse as $string) {
      $string = preg_split('/[\s]*=[\s]*/u', $string, -1, PREG_SPLIT_NO_EMPTY);
      if ($string) {
        preg_match_all('/[\s]*\[([^\[\]]+)\]([^\[\]]+)/', $string[0], $matches);
        $keys = [];
        $i = 1; $total = \sizeof($matches);
        for ($i; $i < $total; $i+=2) {
          $keys = [];
          foreach ($matches[$i] as $num => $key) {
            $keys[] = $key;
            $keys[] = $matches[$i+1][$num];
          }
          $array = makeArray($keys, $string[1]);
          $result = array_merge_recursive($result, makeArray($keys, $string[1]));
        }
      } 
    }
    $content['full_response'] = $result;
    
    echo '<pre>';
    var_dump($content);
    echo '</pre>';
    Ответ написан
    Комментировать
  • Как по указанному пути найти единственный файл и прочитать его?

    @Catrinblaidd
    $dir = './раздел1/';
    if (is_dir($dir)) {
      $files = scandir($dir);
      $files = array_diff($files, ['.', '..']);
      $files = array_values($files);
      if (sizeof($files) == 1) {
        $file = $dir . $files[0];
        $content = file_get_contents($file);
      } else {
        echo "В папке $dir не один файл";
      }
    } else {
      echo "Не найдена папка $dir";
    }

    Можно убрать проверки, если Вы абсолютно уверенны, что папка существует и в ней только один файл.
    $dir = './раздел1/';
    $files = scandir($dir);
    $files = array_diff($files, ['.', '..']);
    $files = array_values($files);
    $content = file_get_contents($dir . $files[0]);

    Проще было бы знать и имя этого файла, тогда всё свелось бы к
    $fileName = 'имя_файла';
    $path = './раздел1/' . $fileName;
    if (file_exists($path)) {
      $content = file_get_contents($path);
    } else {
      echo "Нет файла $fileName по пути $path";
    }
    Ответ написан
    Комментировать
  • Редирект если cookie "старше" 2 минут?

    @Catrinblaidd
    if (empty($_COOKIE['entry_time'])) {
      SetCookie('entry_time', time(), time() + 24 * 60 * 60);
    } else {
      if ((time() - $_COOKIE['entry_time']) >= 2 * 60) {
        header('Location: http://site.ru/');
      }
    }
    Ответ написан
    Комментировать
  • Почему не работает скрипт?

    @Catrinblaidd
    <?php
      \error_reporting(0); // запрещаем вывод сообщений о возможных ошибках
      
      function test_mail($char) { // функция, проверяющая реальность адреса
        return (boolean) \preg_match('/[\w\d\._-]+@[\w\d\._-]+\.[\w\d]{2,}/u', $char);
      }
    
      function find_mail($maillist, $email) { // функция, проверяющая наличие адреса в базе
        $result = FALSE;
        foreach ($maillist as $key => $part) {
          if ($email == \trim($part)) {
            $result = $key; // возвращаем порядковый номер адреса, если он найден
            break;
          }
        }
        return $result;
      }
      
      function add_mail($file, $email) {
        \file_put_contents($file, "$email\n", FILE_APPEND);
      }
      
      function remove_mail($file, $maillist, $key) {
        unset($maillist[$key]);
        \file_put_contents($file, \implode('', $maillist));
      }
      
      $message = ''; // здесь будет сообщение о результате действия  
      if (!empty($_POST)) { // если форма отправлена
        $fromemail = 'admin@site.ru'; // адрес администратора для отправки ошибок
        $email = \trim(\strtolower(\htmlentities($_POST['email']))); // очищаем введённый адрес
        $file = "maillist.txt"; // файл, содержащий адреса
        
        if (\file_exists($file)) { // файл существует
          $maillist = \file($file);
          if (!empty($email) && test_mail($email)) { // email не пустой и правильный
            $key = find_mail($maillist, $email); // номер адреса в базе или FALSE, если такого нет
            if (isset($_POST['subscribe'])) { // запрошена подписка на рассылку
              if ($key === FALSE) { // email нет в базе
                add_mail($file, $email);
                $message = "E-mail: $email добавлен в базу рассылки.";
              } else { // email уже есть в базе
                $message = "E-mail: $email уже есть в базе рассылки.";
              }
            } elseif (isset($_POST['unsubscribe'])) { // запрошена отписка от рассылки
              if ($key === FALSE) { // email нет в базе
                $message = "E-mail: $email не найден в базе рассылки.";
              } else {
                remove_mail($file, $maillist, $key);
                $message = "E-mail: $email удален из базы рассылки.";
              }
            }
          } else { // email пустой или неправильный
            $message = "E-mail: $email не сушествует.";
          }
        } else { // файл не существует
          $message = "Не найден файл $file ! Пожалуйста <A HREF=\"mailto:$fromemail\">сообщите</a> мне об ошибке.";
        }
      }
      
      \header('Content-Type: text/html; charset=utf-8;');
    ?>
    
      <p><?=$message?></p>
      <form method="post">
        <fieldset>
          <legend>Подписаться на рассылку</legend>
          <label for="email">Введите e-mail:</label>
          <input type="text" id="email" name="email" size="30" required>
          <input type="submit" name="subscribe" value="Подписаться">
        </fieldset>
      </form>
      <form method="post">
        <fieldset>
          <legend>Отписаться от рассылки</legend>
          <label for="email">Введите e-mail:</label>
          <input type="text" id="email" name="email" size="30" required>
          <input type="submit" name="unsubscribe" value="Отписаться">
        </fieldset>
      </form>
    Ответ написан
    Комментировать
  • Как улучшить цикл php?

    @Catrinblaidd
    <?php $generalNumber = 1 ?>
        <?php $listNumber = 0 ?>
        <?php 
            while ( have_rows('comands') ) : the_row();
            $name = get_sub_field('comands_name');
            $photo = get_sub_field('comands_photo');
            $spec  = get_sub_field('comands_spec');
         ?>
        <?php if($listNumber % 4 == 0): ?>
          <?php $innerNumber = 1 ?>
          <div class="comands-list">
        <?php endif;     $listNumber++; ?>
    
    
        <?php if ($innerNumber == 2): ?>
          <div class="comands-center">
        <?php endif; ?>
        
          <!-- Comands Item -->
          <div class="comands-item">
            <div class="comands-item__photo">
              <img src="<?php echo $photo ?>">
            </div>
            <div class="comands-item__info">
              <div class="fitem">
                <div class="number"><?php echo $generalNumber; $generalNumber++ ?></div>
                <div class="ftext"><?php echo $name ?></div>
              </div>
              <div class="comands-text"><?php echo $spec ?></div>
            </div>
          </div>
    
          <!-- End Comands Item -->
          
        <?php if ($innerNumber == 3): ?>
          </div>
        <?php endif; ?>
          
        <?php if($listNumber % 4 == 0): ?>
            </div>
        <?php endif; $listNumber == 0; $innerNumber++; ?>
    
        <?php endwhile ?>
    Ответ написан
    Комментировать
  • Как разбить строку по 2 разделителям?

    @Catrinblaidd
    $string = 'localhost/shop/html/catalog.php?page=1';
    \preg_match('/\/([\w\.]+)\?/u', $string, $result);
    if (!empty($result[1])) {
      $result = $result[1];
    } else {
      $result = null;
    }
    echo $result;
    Ответ написан
    Комментировать
  • Почему код не добавляет в массив всё элементы?

    @Catrinblaidd
    break прерывает выполнение цикла. для чего вообще вам проверять условие ==null?
    $nmPhoto = array('photo1','photo2','photo3','photo4','photo5','photo6','photo7');
    $resultPhoto = [];
    foreach ($nmPhoto as $key => $name) {
      if (isset($_POST[$name])) {
        $resultPhoto[$key] = $_POST[$name];
      }
    }
    echo '<pre>';
    print_r ($resultPhoto);
    echo '</pre>';

    P.S. и сила, всё-таки, прЕбудет)
    Ответ написан
    Комментировать
  • Где можно найти идеи для CMS плагинов?

    @Catrinblaidd
    У любой CMS есть форум, да и просто форумы IT-web-направленности. На таких форумах обычно есть раздел, где люди рассказывают, какого плагина им не хватает или какую задачу они пытаются решить. Вот например https://ru.wordpress.org/support/forum/plugins-and...
    Ответ написан
    1 комментарий
  • Цикл в 100.000 итераций vs "умного" цикла?

    @Catrinblaidd
    100000 итераций, Вы серьёзно?
    $arr = \range (0, 100000);
    $res = [];
    $start = \microtime(true);
    $i = 0; 
    for ($i; $i<100000; ++$i) {
      if ($arr[$i] != 0) {
        $res[$i] = $arr[$i];
      }
    }
    $end = \round(\microtime(true) - $start, 2);
    echo $end;
    Ответ написан
    Комментировать