Ответы пользователя по тегу PHP
  • Как использовать $this в анонимных функциях?

    prototype_denis
    @prototype_denis
    Symfony
    <?php
    
    class App
    {
        public $func = null;
        public $funcFatal = null;
    
        public $variable = 'Ok';
    
        public function runFunc()
        {
            $func = $this->func;
    
            return $func();
        }
    }
    
    $app = new App();
    
    $app->func      = \Closure::bind(function () { return $this->variable; },   $app, 'App');
    $app->funcFatal = \Closure::bind(function () { return $this; },             $app, 'App');
    
    
    var_dump($app->runFunc());            // string(2) "Ok"
    var_dump($app->funcFatal->variable);  // Fatal error
    
    
    // $app->func instanceof \Closure      // true
    // $app->funcFatal instanceof \Closure // true
    // $app->func instanceof \App          // false
    // $app->funcFatal instanceof \App     // false
    Ответ написан
  • Скрипт перевода маски под сети в двоичный код?

    prototype_denis
    @prototype_denis
    Symfony
    <?php
    
    $ip = '5.100.192.0';
    
    // 00000101 01100100 11000000 00000000
    print vsprintf("%08d %08d %08d %08d", array_map('decbin', explode('.', $ip)));
    Ответ написан
  • Как проверить конечность массива?

    prototype_denis
    @prototype_denis
    Symfony
    Немного ревью... и рефакторинга.

    $iter = ceil((count($data[$arrCenter[$i]]['j']) + count($data[$arrCenter[$i]]['i'])) / 2) + ceil($w / $machin);
    
    // Зачем вам индексированый массив?
    for ($a = 0; $a < $iter; $a++) {
    
        // Где проверка на существование $data[$arrCenter[$i]]['i'][$a] $data[$arrCenter[$i]]['j'][$a] ?
        
        $center = $arrCenter[$i];
        $arrayI = $data[$center]['i'][$a];
        $arrayJ = $data[$center]['j'][$a];
        
        // !$var === ($var == 0 || $var == '')
        if (!$arrayJ['order'] && !$arrayI['order']) {
            
            if (($arrayI['weight'] + $arrayJ['weight']) <= $machin) {
    
                $weight[$a] = $arrayI['weight'] + $arrayJ['weight'];
                
                array_unshift($path[$center][$c], $arrayI['name']);
                
                // use buffer
                echo $arrayJ['name'] . '<br/>';
                
                // array_push(...) === $var[] = $value
                $path[$center][$c][] = $arrayJ['name'];
                
                unset($data[$center]['i'][$a], $data[$center]['j'][$a]);
            }
        }
        //                  ^
        //                  |
        // +----------------
        // |
        // Вы только что их убили.  +-- Где проверка на существование?
        //                          |
        //                          V
    
        if ($data[$arrCenter[$i]]['j'][$a]['order'] < $data[$arrCenter[$i]]['i'][$a]['order']) {
            // ...
        }


    Что касается следующего элемента в массиве.
    Вы сами не запутались?
    Разверните строку и вы увидете:
    if (
                (
                    !next($data[$arrCenter[$i]]['j']) && 
                    !next($data[$arrCenter[$i]]['i']) && 
                    (
                        !empty($data[$arrCenter[$i]]['j']) && 
                        !empty($data[$arrCenter[$i]]['j'])
                    )
                )
        ) {
            // ...
        } else {
            // ...
        }



    Внимание
    Эта функция может возвращать как boolean FALSE, так и не-boolean значение, которое приводится к FALSE. За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.


    Упростите...
    if (
            false === next($data[$arrCenter[$i]]['j']) && 
            false === next($data[$arrCenter[$i]]['i'])
        ) {
            // ...
        } else {
            // ...
        }


    Наведите порядок в коде.
    Используйте временные переменные.
    Раз вы "убиваете" по индексу, проверяйте существование далее в коде.
    Ответ написан
  • Fancybox как решить проблему с циклом?

    prototype_denis
    @prototype_denis
    Symfony
    Ну и заморочки....
    Делайте проще.

    <?php
    $lines = file('/images/certificates.txt', FILE_IGNORE_NEW_LINES);
    foreach ($lines as $line) {
        // $line - строка из из файла
    
    }
    Ответ написан
  • Curl. Где ошибка в коде?

    prototype_denis
    @prototype_denis
    Symfony
    curl_setopt($ch, CURLOPT_POSTFIELDS, "SessionKey={$sk[1]}&Page=..."); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, "SessionKey={$sk[1]}&Search...");


    Или...
    curl_setopt($ch, CURLOPT_POSTFIELDS, "SessionKey=" . $sk[1] . "&Page=..."); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, "SessionKey=" . $sk[1] . "&Search...");
    Ответ написан
  • Почему в песочнице посчитало правильно а в скрипте нет?

    prototype_denis
    @prototype_denis
    Symfony
    Ниже воспроизвел вашу ситуацию. (В браузере вы увидите ваш "выхлоп")
    Что именно возвращает этот метод "get_formatted_line_subtotal" ?

    <?php
    
    $item['qty'] = 1;
    // $priseone = $order->get_formatted_line_subtotal( $item ); // Что тут???  
    $priseone = "1 560руб. <span style=\"display: none\">440443431</span>";
    
    echo $priseone . "<br>";
    $prise = preg_replace("/[^0-9]/","",$priseone);
    echo $prise . "<br>";
    $prise = $prise / $item['qty'];
    echo $prise . "<br>";
    $prise = $prise + 0.05 * $prise;
    echo $prise . "<br>";
    $prise = round($prise, -1);
    echo $prise . "<br>";
    $prise = $prise * $item['qty'];
    echo $prise . "<br>";
    Ответ написан
  • Откуда растут ноги у простоты в использовании Twig?

    prototype_denis
    @prototype_denis
    Symfony
    {#- /views/header.twig -#}
    <div>
        <div class="left">
            {% include "/views/header/left" %}
        </div>
        <div class="right">
            {% include "/views/header/right" %}
        </div>
    </div>
    
    {#- /views/header/left.twig -#}
    <ul>
        <li><a href="#!">Link</a></li>
        <li><a href="#!">Link 2</a></li>
    </ul>
    
    
    {#- /views/header/right.twig -#}
    <p class="text-left">Right</p>
    
    
    {#- /views/base.twig -#}
    <!doctype html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>{% block title %}Hello!{% endblock %}</title>
        </head>
        <body>
            <div class="row">
                <div class="col-md-2">
                    {% include "/views/header.twig" %}
                </div>
                <div class="col-md-10">
                    {% block content %}{% endblock %}
                </div>
            </div>
            <div class="row">
                <div class="col-md-12">
                    {% block footer %}{% endblock %}
                </div>
            </div>
        </body> 
    </html> 
    
    
    {#- /views/ajax.twig -#}
    {% block content %}{% endblock %}
    
    
    
    
    {#- /views/pages/base.twig -#}
    {% extends "/views/base.twig" %}
    {% block title %}
        Welcome.
    {% endblock %}
    {% block content %}{% endblock %}
    {% block footer %} (c) 2015 {% endblock %}
    
    
    
    
    {#- /views/pages/blog/index.twig -#}
    {% extends app.isAjax() ? "/views/pages/ajax.twig" : "/views/pages/base.twig" %}
    {% block title %}
        {{ parent() }} This best blog.
    {% endblock %}
    {% block content %}
        <h1>Header</h1>
        <p>Content text</p>
    {% endblock %}
    {% block footer %}{#- remove parent -#}{% endblock %} 
    
    
    Что тут происходит.
    При рендере /views/pages/blog/index.twig 
    шаблонизатор будет подниматься вверх.
    
    В нём переопределяем footer, дополняем title.
    title  = "??? This best blog."
    footer = ""
    content = "<h1>...."
    
    index (проверка переменной) +-> ajax.twig -> вывод
                                |
                                | or
                                |
                                +-> page/base.twig + 
                                                   |
          +----------------------------------------+
          |      Тут по пути уже к базовому шаблону переопределяем footer и title
          |      title  = "Welcome. This best blog."
          |      footer = ""
          |      content = "<h1>...."
          |
          v                 А тут уже include
          base.twig - - - > header.twig - + - - > left.twig
          |                               + - - > right.twig
          v
        вывод
    
    
    +---------------------------------------+
    | +-----------------------------------+ |
    | |                                   | |
    | | +--------------+ +--------------+ | |
    | | | left         | | right        | | | header
    | | +--------------+ +--------------+ | |
    | |                                   | |
    | +-----------------------------------+ |
    | |                                   | |
    | | +----------------------------+    | | base | ajax
    | | | Welcome. This best blog.   |    | | title
    | | +----------------------------+    | |
    | |                                   | |
    | | +----------------------------+    | |
    | | |  Header                    |    | | content
    | | |  Content text              |    | |
    | | +----------------------------+    | |
    | |                                   | |
    | +-----------------------------------+ |
    +---------------------------------------+


    Помимо простой иерархии блоков, в шаблонизаторе очень много интересного.
    Только и успевай документацию читать...

    ЗЫ. По умолчанию тут почему-то html подсветка. (бред)
    Ответ написан
  • Какую php CMS выбрать frontend разработчику?

    prototype_denis
    @prototype_denis
    Symfony
    Мне кажется одним из вариантов будет использовать firebase (Но меня не слушайте, я с front разработкой дружу поверхностно)

    Что касается CMS производных от фреймворков, да и самих фреймворков, то тут надо исходить от поставленной задачи. Для типовых - любая, которая может.
    А вот если REST, мудрёная логика или ещё что в ТЗ. То если не удастся отговорить заказчика от этого функционала (или найти альтернативы), то тут уже либо самому вникать в фреймвок, либо найти порядочного компаньона.
    Ответ написан
  • Есть ли изменения в asserts в PHP7?

    prototype_denis
    @prototype_denis
    Symfony
    В ответе на ваше сообщение имели ввиду такое поведение.
    <?php
    
    namespace First
    {
        class A
        {
            const classname = '\First\A';
        }
        
    }
    
    namespace Second\First
    {
        class A {}
    }
    
    
    namespace Second
    {
        class B extends \First\A { }
        
        $classname = '\Second\B';
        // true (\First\A::classname) 
        var_dump(assert('is_subclass_of($classname, First\A::classname)')); 
    
        // Undefined class constant 'classname' (\Second\First\A::classname)
        var_dump(assert(is_subclass_of($classname, First\A::classname)));
    }
    Ответ написан
  • Как узнать ОС своего хостинга на PHP?

    prototype_denis
    @prototype_denis
    Symfony
    PHP_OS - предопределенная константа php, в которой содержится значение операционной системы, где его собрали.
    php_uname('s') - эта функция с аргументом "s" показывает тукущую систему.

    Документация тут
    Ответ написан
  • Как работают свойства и методы класса?

    prototype_denis
    @prototype_denis
    Symfony
    <?php
    
    // читай, что такое psr-{0,7}
    // Приучай себя сразу к порядку в коде
    class Article 
    {
        // Публичные свойства класса. 
        public $text; 
        public $title;
      
        // Метод, тоже публичный.
        // Судя по названию метода, тут что-то должно 
        // рисоваться или выводится.
        public function view($text, $title)
        {
            // Так как не указан return этого метода, 
            // то по умолчанию возвращается null;
            // Привыкай всегда что-то возвращать из методов.
    
            $this->text = $text; // здесь публичной переменной присваивается 
            $this->title = $title; // значение из аргумента этого метода.
        } 
    
        // $this указывает на этот объект.
        // Работает внутри класса.
        // $this->text, $this->title - свойства
        // $this->view() - вызов метода.
        // По умолчанию свойста тождественно равны "null"
    }
    
    // Не ленись и называй переменные нормальными именами
    // $article = new Article();
    $a = new Article; // new Article() <- приучи себя ставить скобки.
    
    
    /**
     * class Article#2 (2) {
     *  public $text  => NULL
     *  public $title => NULL
     * }
     */
    var_dump($a);
    
    $a->text = 'Привет мир'; // Установил значение
    
    /**
     * class Article#2 (2) {
     *  public $text  => string(21) "Привет всем"
     *  public $title => NULL
     * }
     */
    var_dump($a);
    
    $a->title = 'Мир';  // Ещё раз установил значение
    $a->view('Привет всем', 'Приветствие'); // И ещё раз.
    
    /**
     * class Article#2 (2) {
     *  public $text  => string(21) "Привет всем"
     *  public $title => string(22) "Приветствие"
     * }
     */
    var_dump($a);
    
    /**
     * array(1) {
     *   [0] => string(4) "view"
     * }
     */
    var_dump(get_class_methods($a));
    Ответ написан
  • Как вывести картинки из БД?

    prototype_denis
    @prototype_denis
    Symfony
    <?php
    
    function GoCard(){
        // А папка существует? 
        // В неё можно писать?
        $uploads_dir = __DIR__ . '/images/';
        
        // Существует ли значение по этим ключам?
        // Notice:
        $tmp_name = $_FILES["pictures"]["tmp_name"];
        $name = $_FILES["pictures"]["name"];
        
        // А если сервер на винде?
        // А если нет папки libraries и или images
        $path = '/libraries/images/' . $name;
        
        // Загружаем что? 
        // [Предоставляем доступ к нашему серверу любому желающему]
        // А если файл не загрузился?
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
        
        // Кладём базу
        // [Выстрел из дробовика sql инъекцией]
        // Соединение есть?
        mysql_query("INSERT INTO people (name) VALUES ('$path')");
    }; // <- Зачем тут двоеточие? Это не переменная, которая приравнивается к функции.
    
    GoCard(); // Спустили курок
    
    function ReadFromBD(){
        // А если соединение сдохло?
        $res = mysql_query("SELECT * FROM people");
    
        // $mass = array();  // Расскоментируй. Инициализируй переменную.
        
        while (false !== ($row = mysql_fetch_array($res))) {
            $mass[] = $row['name'];
        }; // <- Тут не нужна точка с запятой
    
        // return $mass;  // Расскоментируй, а что ниже удали.
    
        // Идём по не инициализированной переменной. 
        // (Если mysql_fetch_array($res) на первой итерации вернёт false)
        //    ^
        //    |_ Там собирается не ассоциативный массив
        //               $key - это цифры от 0 до ... Зачем?
        foreach($mass as $key => $value) {
            return $value;  // Выходим из функции, возвращая $mass[0].
        }; // <- И тут не нужна точка с запятой
    }; // <- И тут не нужна точка с запятой
    Ответ написан
  • Есть небольшой код, который работает, но с одним маленьким дефектом, как его побороть?

    prototype_denis
    @prototype_denis
    Symfony
    $categories = [ 
        [
            'href' => '#!', 
            'name' => 'a', 
            'children' => [
                [
                    'href' => '#!', 
                    'name' => 'a1', 
                    'children' => [
                        [
                            'href' => '#!', 
                            'name' => 'a2', 
                            'children' => []
                        ],
                        [
                            'href' => '#!', 
                            'name' => 'b2', 
                            'children' => []
                        ]
                    ]
                ],
            ]
        ], [
            'href' => '#!', 
            'name' => 'b', 
            'children' => []
        ]
    ];


    Откуда столько кода? bind'ы, unbind'ы...

    Весь "респонзив" должен быть в css.
    Познакомьтесь с media.
    В js (я далеко не front разработчик) откуда столько знаменитой jQuery лапши? Делайте проще =)
    Что касается php. Слишком тяжело читать ваш код. Разделите логику и вьюху, не мешайте их в кучу.
    Генерируйте деревья рекурсивно.

    <?php
    function generateTree(array $categories = [], &$buffer) {
        $buffer .= '<ul class="dropdown">';
        foreach ($categories as $category) {
            $buffer .= '<li><a href="' . $category['href'] . '">' . $category['name'] . '</a></li>';
            if ($category['children']) {
                $buffer .= '<li class="dropdown-toogle">';
                $buffer .= '<a href="' .  $category['href'] . '">' . $category['name'] . ' (dropdown)</a>';
                generateTree($category['children'], $buffer);
                $buffer .= '</li>';
            }
        }
        $buffer .= '</ul>';
    }
    
    generateTree($categories, $menu);
    ?>
    
    <!doctype html>
    <html lang="ru">
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <style>
            /* @media ... */
        </style>
    </head>
    <body>
        <?= $menu ?>
        <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
        <script>
            $(function () {
              $("ul.dropdown li.dropdown-toogle > a").click(function(){
                $(this).next("ul").slideToggle("slow");
                return false;
              });
            });
        </script>
    </body>
    </html>


    ЗЫ. Надеюсь, хоть чем-то помог.
    Ответ написан
  • Как в php запретить CURL'у делать повторный запрос?

    prototype_denis
    @prototype_denis
    Symfony
    Тестируете в консольке или браузере?

    UPD: Ошибка в скрипте. Повторное использование соединения.
    Ответ написан
  • Частично отрабатывает код, в чём причина?

    prototype_denis
    @prototype_denis
    Symfony
    Выкидывай все if'ы и взгляни на часы повнимательнее...
    В if'ах мало того, что ошибка в условии, так ещё и 4 значения часа исчезают.

    У тебя периоды в 6 часов и 4 значения.

    1) Берём текущий час, делим на 4 равные части ($time / 6).
    2) Прибавляем 1, так как у тебя счёт идет не с 00 часов, а с 18.
    3) И берём остаток от деления на 4. (утро, день и так далее...)

    $i = (($time / 6) + 1) % 4;
    На выходе будет:
    time=0 i=1
    time=1 i=1
    time=2 i=1
    time=3 i=1
    time=4 i=1
    time=5 i=1
    time=6 i=2
    time=7 i=2
    time=8 i=2
    time=9 i=2
    time=10 i=2
    time=11 i=2
    time=12 i=3
    time=13 i=3
    time=14 i=3
    time=15 i=3
    time=16 i=3
    time=17 i=3
    time=18 i=0
    time=19 i=0
    time=20 i=0
    time=21 i=0
    time=22 i=0
    time=23 i=0
    time=24 i=1
    Ответ написан
  • Как проверить существует ли запись в CSV файле?

    prototype_denis
    @prototype_denis
    Symfony
    при повторном подходе проверять записи на наличие в этом CSV и если конкретная запись из результата парсинга отсутствует, то дописать csv файл.

    // $firstArray  = str_getcsv... old
    // $secondArray = str_getcsv... new
    $mergedArray = array_merge_recursive($secondArray, $firstArray);
    Ответ написан
  • Реализация вложенного синонимайзера?

    prototype_denis
    @prototype_denis
    Symfony
    Сваял на коленке, не тестил. Дорабатывай, оптимизируй... А так, в следующий раз приводи примеры своего кода, а то тут обычно на соседний сайт посылают ))))

    Суть проста - это калькулятор, где надо скобочки учитывать.
    Идём из глубин в самый верх.

    <?php
    
    /**
     * class MagicWord
     */
    class MagicWord
    {
        /**
         * @param string $string
         */
        public function __invoke($string)
        {
            return $this->process($string);
        }
    
        /**
         * @param string $string
         * @return string
         * @throw InvalidArgumentException
         */
        private function getPart($string)
        {
            $array  = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
            $start  = 0;
            $end    = count($array);
    
            for ($i = 0; $i < $end; $i++) {
                if ($array[$i] == '{') {
                    $start = $i;
                }
                if ($array[$i] == '}') {
                    $end = $i;
                    break;
                }
            }
    
            if ($start > $end) {
                throw \InvalidArgumentException('Bad brackets');
            }
    
            $words = [];
            for ($i = $start; $i < $end; $i++) {
                if ($array[$i] == '{' || $array[$i] == '}') {
                    continue;
                }
                $words[] = $array[$i];
            }
    
            return join('', $words);
        }
    
        /**
         * (a|b|c) return b or a or c
         * @param string $string
         * @return string
         */
        private function getRandWord($string)
        {
            $array = explode('|', $string);
            shuffle($array);
    
            return current($array);
        }
    
        /**
         * Black magic function )))
         * @return string
         */
        public function process($string)
        {
            if (preg_match('/{/', $string)) {
                $words      = $this->getPart($string);
                $word       = $this->getRandWord($words);
                $string     = str_replace('{'.$words.'}', $word, $string);
    
                return $this->process($string);
            } else {
                return $string;
            }
        }
    
        /**
         * Check bracket balance
         * @param string $string
         * @return boolean
         */
        public function checkBalance($string)
        {
            $array      = preg_split('//u', $string, -1, PREG_SPLIT_NO_EMPTY);
            $balance    = 0;
            foreach($array as $char) {
                if ($char === '{') {
                    --$balance;
                }
                if ($char === '}') {
                    ++$balance;
                }
            }
    
            return ! ($balance);
        }
    }
    
    
    $data = '{ Здравствуйте | { Привет { подруга | подружка } | Hello } | Добрый вечер { друг | { подруга | подружка } } }';
    
    $class = new MagicWord();
    if ($class->checkBalance($data)) {
        echo $class->process($data);
    }
    
    // or
    echo $class($data);
    Ответ написан
  • Смена погоды в зависимости от времени суток?

    prototype_denis
    @prototype_denis
    Symfony
    Взгляните на xml повнимательнее, там в атрибутах уже время суток указано.
    Ответ написан
  • Как написать регулярное выражение удаления a href?

    prototype_denis
    @prototype_denis
    Symfony
    Если вам нужно "отключить" ссылку у активного элемента списка то используйте css
    li.active > a {
    	pointer-events: none;
    	cursor: default;
    	text-decoration: none;
    }

    Но если без пыха не обойтись...
    $string = '<ul>
    <li class="active"><a href="">Раздел</a></li>
    <li><a href="">Раздел2</a></li>
    </ul>';
    
    $string = preg_replace('|<li class="active"><a href="">(.*?)</a></li>|', '<li class="active">${1}</li>', $string);
    
    var_dump($string);
    Ответ написан