• Как вернуть 2 значения в PHP return?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Вариант 1 - Деструктуризация:
    // Возврат нескольких значений:
    function some() {
        return [23, 42];
    }
    
    // Получение
    [$a, $b] = some();
    
    \var_dump($a, $b);


    Вариант 2 - Деструктуризация с ключами:
    // Возврат нескольких значений:
    function some() {
        return ['a' => 23, 'b' => 42];
    }
    
    // Получение
    ['a' => $a, 'b' => $b] = some();
    
    \var_dump($a, $b);


    Вариант 3 - Генераторы с ключами:
    function some() {
        yield 'a' => 23;
        yield 'b' => 42;
    }
    
    foreach (some() as $key => $value) {
      echo $key . ':' . $value; // a:23 b:42
    }


    Вариант 4 - Генераторы без ключей:
    function some() {
        yield 23;
        yield 42;
    }
    
    foreach (some() as $value) {
      echo $value; // 23 42
    }


    Вариант 5 - Генераторы с возвратом:
    function some() {
        yield 23;
        return 42;
    }
    
    $value = some();
    echo $value->current(); // 23
    $value->next();
    echo $value->getReturn(); // 42


    Вариант 6 - DTO:
    class DataTransferObject
    {
        private $a;
        private $b;
    
        public function __construct($a, $b)
        {
            $this->a = $a;
            $this->b = $b;
        }
    
        public function getA()
        {
            return $this->a;
        }
    
        public function getB()
        {
            return $this->b;
        }
    }
    
    function some() {
        return new DataTransferObject(23, 42);
    }
    
    $value = some();
    echo $value->getA(); // 23
    echo $value->getB(); // 42


    И ещё куча всяких вариантов, но мне влом придумывать уже)
    Ответ написан
    4 комментария
  • Почему foo.x === undefined?

    rockon404
    @rockon404
    Frontend Developer
    Все достаточно просто, хоть и не совсем очевидно.
    Выражение:
    foo.x = foo = {n: 2};
    равносильно:
    foo.x = (foo = {n: 2});

    Мы присваиваем объекту по идентификатору foo свойство x, которое равно результату операции присваивания идентификатору foo ссылки на объект { n: 2 }.

    Чтобы в этом убедиться достаточно добавить переменную bar, присвоить ей начальное значение foo и вывести в конце:
    let foo = {};
    
    const bar = foo;
    
    foo.x = (foo = {n: 2});
    
    console.log(foo.x === undefined);  // true
    
    console.log(bar);  // { x: { n:  2 } }
    
    console.log(bar.x === foo);  // true


    Ключевые отличия операций присваивания, которые важно понимать:
    foo.x = - присваивание свойства конкретному объекту. На момент вызова в нашем примере это {}.
    foo = - присваивание значения самому идентификатору foo. Это может быть примитив, ссылка на объект или функцию. В нашем случае это объект { n: 2 }.
    Ответ написан
    Комментировать
  • Есть ли официальная документация по JavaScript?

    Stalker_RED
    @Stalker_RED
    Javascript - это одна из реализаций ECMA-262. Если вам нужно именно "официально-стандартно" - вам именно сюда.
    Обратите внимание, это девятая редакция, которая вышла в июле. В следующем году скорее всего выйдет новая редакция. Ну и в этом СТАНДАРТЕ вы не найдете всяких новых экспериментальных штук. Экспериментальные штуки обычно описаны в черновиках.

    BOM и DOM - это на самом деле не часть javascript, это API браузеров.

    В 99% случаев вам будет удобнее всего ориентироваться на MDN, там все неплохо структурировано, и поддерживается в довольно актуальном состоянии.
    Ответ написан
    1 комментарий
  • Как трансформировать object Object?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    const option = object.map(obj => Object.values(obj)[0])

    Если ожидается, что могут быть некорректные данные вместо объекта, сделайте дополнительную проверку.
    Но мне кажется, вам нужно с сортировкой по этому индексу?
    Ответ написан
    Комментировать
  • Как в js динамически рисовать предметы?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Логикой. Имеете две точки, стартовая и конечная, пока они пустые. При первом клике делаете проверку, если стартовой точки нет, то этот клик и будет стартовой точкой, значит записываем координаты клика в стартовую точку. В этот момент должно работать событие мыши mousemove, которое делает проверку, есть ли стартовая точка и нет конечной, тогда рисуем прямоугольник от стартовой точки до точки координат мыши. При повторном клике опять делается проверка, если стартовая точка есть а конечной нет, то записываем точку мыши в конечную. В этот момент условие в mousemove больше не работает, т.к. есть конечная точка, прямоугольник закрыт. Можно его нарисовать окончательно.
    У fillRect конечная точка описывается шириной и высотой, поэтому нужно ее высчитывать вот так:
    width = xEnd - xStart;
    height = yEnd - yStart;
    Ответ написан
    5 комментариев
  • Есть ли разница на что вешать обработчик для отправки формы - на саму форму: on submit или на кнопку отправки: on click?

    DimaLondon
    @DimaLondon
    Лучше вешать на форму (атрибут onsubmit), потому что форма отправляется не только кликом по кнопке, а и, к примеру, нажатием Enter при установленном фокусе в INPUT[type="text"].
    Ответ написан
    4 комментария
  • Почему автопрефиксер добавляет префикс для box-shadow?

    bootd
    @bootd Куратор тега CSS
    Гугли и ты откроешь врата знаний!
    Автопрефиксер работает на основе настройки в webpack или gulp, в которой указывается, какие версии браузеров вы поддерживаете. А can i use ему нужен для того, что бы узнать, нужно ли для указанной версии браузера указывать префикс к свойствам. Либо положите болт, ибо плохого в этом ничего нет, или просто укажите список версий браузеров, для которых не нужны префиксы.

    Отвечая на 2й вопрос, то лучше использовать плагины для галпа или webpack. Причина проста, ваша заготовка для сборки будет независимо работать от любого редактора и любой человек сможет без проблем использовать все фичи вашей сборки запуском 1й команды npm install, а редактор вы можете сменить, в котором заново будете устанавливать свои плагины.
    Ответ написан
    2 комментария
  • Можно ли верстать сайты без gulp?

    sharnirio
    @sharnirio
    Front-end developer
    На новой работе порою стала заходить чистая верстка на доработку без сборщика, было не очень (если уж честно, то совсем) удобно после пары лет работ с gulp grunt. Так что через пару таких проектов понял что нужен хотя бы необходимый минимум для таких работ, а именно:
    1) сервер для статики что б вручную не обновлять
    -установить browser-sync (https://browsersync.io/) глобально для запуска сервера, ввести в командной строке - 'npm install -g browser-sync'
    - в дальнейшем запуск сервера (вводить команду в корне проекта) осуществляется командой - ' browser-sync start --server --files "./**/*.+(css|html|js)" --directory "/" --no-notify '
    2) Препроцессоры в моем случае scss (просто переименовываю основной файл стилей скажем style.css в style.scss и работаю с последним)
    -для компиляции с scss в css можете использовать удобный для вас способ, я компилирую через командную строку, для этого использую глобально установленный ruby-sass (https://sass-lang.com/ruby-sass) команда (gem install sass) нужен установленный ruby и ставлю watcher и компиляцию файлов командой "sass --no-cache --sourcemap=none --watch style.scss:style.css --style expanded"
    3) для основных команд создать bash алиасы на быстрый вызов команды
    ps. так что можно и без gulp в принципе, но хотя бы 2 первых пункта нужно использовать в любом случае.
    Ответ написан
    Комментировать
  • Верно ли я обращаюсь к файлу по адресу?

    mindtester
    @mindtester Куратор тега Windows
    http://iczin.su/hexagram_48
    на скрине один "ONU-Manager" через дефис, другой через пробел
    кроме то, используйте синтаксис, который позволит вам скопировать путь из проводника
    StreamReader fr = new StreamReader(@"D:\C# Projects\ONU-Manager\ONU Manager\bin\Debug\check.txt");

    ps используйте как пример к размышлению

    using System;
    using System.IO;
    
    namespace mypath
    {
        class Program
        {
            static void Main(string[] args)
            {
                var p = Environment.CurrentDirectory;
                Console.WriteLine(p);
                Console.ReadKey();
                p += @"\..\..\App.config";
                var appcfg = File.ReadLines(p);
                foreach(var l in appcfg)
                    Console.WriteLine(l);
                Console.ReadKey();
            }
        }
    }
    Ответ написан
    2 комментария
  • Жуткий класс тега html?

    @Froggyweb
    https://modernizr.com/
    выставляет классы в зависимости от того какие технологии поддерживает твой браузер
    Ответ написан
    3 комментария
  • Как правильно в ларавеле работать с сессией при загрузке сайта?

    Denormalization
    @Denormalization
    Если я правильно понял, то делать нужно через Middleware.
    Просто пишем Middleware который будет проверять сессии и делать нужные вещи.
    Затем вешаем этот Middelware на нужный роут\группу роутов и все.
    Ответ написан
    Комментировать
  • Опции из БД в глобальный массив для доступности в любой точке приложения. Как реализовать такое?

    swede2k
    @swede2k
    Full-stack developer
    Существует куча готовых решений:
    anlutro/laravel-settings
    Если не хочется брать готовое, можно посмотреть принцип реализации.
    Ответ написан
    Комментировать
  • Видит ли поисковая система, провайдер или кто бы то ни было еще напечатанные, но не отправленные запросы?

    landergate
    @landergate
    IT-шный jack-of-all-trades
    Да, поскольку для показа подсказок, системе нужно выполнить по ней выборку.
    Если запрос был по HTTPS, то увидит только поисковик (при условии, что он не сотрудничает с органами). Если без HTTPS, технически увидеть его могут все посредники между компьютером и конечным сервером.
    Ответ написан
  • Динамическое изменение класса в компоненте vue?

    lonsaria
    @lonsaria
    Документация: https://ru.vuejs.org/v2/guide/class-and-style.html

    Достаточно добавить v-bind:class="'area' + index"

    Ответ написан
    Комментировать
  • Как спарсить все точки с google карты на сайте padi.com?

    @AlexndrNovikov
    Solution Architect in Spiral Scout
    Не вижу особых препятствий:

    Eсть URL
    POST https://apps.padi.com/scuba-diving/dive-shop-locator/Dsl/GetDiveShops


    Принимает json параметры
    cLat:33.638802
    cLong:-117.603366
    courseIds:""
    distanceMeters:1000000
    eLng:-117.1913786953125
    levelIds:"3,2"
    mapSize:"smaller"
    nLat:33.99591887201719
    offeringIds:""
    sLat:33.280197932608054
    searchString:""
    specialtyId:-1
    storeNumber:-1
    wLng:-118.0153533046875

    Нужно провести ревес инженириг (читай, потестить с разными параметрами) на что влияют Lang/Lng/Lat параметры, и написать просто цикл запросов который бы для всех участков карты запросил с сервера результаты.
    В тестах поможет ответ - там как раз границы указаны. (массив SearchRecords - результаты поиска, Bounds - границы участка поиска)
    По сути задача
    1) понять какие входные параметры запроса возвращают какой участок карты в Bounds)
    2) подобрать массив входных параметров чтобы перебрать все участки карты последовательно
    3) запустить цикл и спарсить ответы из SearchRecords в одно хранилище
    4) убрать дубликаты
    5) преобразовать в желаемый формат (csv для excel)
    Ответ написан
    7 комментариев
  • Объясните, почему не срабатывает await?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Потому что await работает только с Promise-like объектами, то есть объектами имеющими метод then()
    Под капотом await работает примерно следующим образом:
    // пусть value - результат операции справа от await
    // resolve - функция, которая получает 1 аргумент, который вернет await
    // (но не раньше выполнения микротасков event loop)
    // reject - функция, которая получает 1 аргумент, который пробросит исключение в await
    // (но не раньше выполнения микротасков event loop)
    if(value && typeof value.then === 'function') {
      value.then(resolve, reject);
    } else {
      resolve(value);
    }

    Про event loop, а так же что в нем микротаски - гуглите. Скажу лишь одно, микротаски выполняются на каждой итерации event loop притом все сразу, пока не закончатся.

    console.log синхронный, оборачивание его в await не даст результата, кроме разве что следующее действие (которого в примере нет) будет выполнено в следующем микротаске, но по сути сразу же
    setTimeout - асинхронный, но на колбэках, необходимо либо обернуть его в Promise либо в Promise-like объект.
    Вариант с Promise:
    async function my_function() {
      console.log('1');
      await new Promise(resolve => setTimeout(resolve, 1000));
      console.log('2');
      console.log('3');
    }

    Вариант с Promise-like:
    async function my_function() {
      console.log('1');
      await {then(resolve) { setTimeout(resolve, 1000); }};
      console.log('2');
      console.log('3');
    }
    Ответ написан
    Комментировать
  • Почему не срабатывает querySelector?

    rockon404
    @rockon404
    Frontend Developer
    Отлично работает

    Подскажите, как правильно искать в данном! случае (именно forEach).

    Document.querySelectorAll() возвращает NodeList, а NodeList.forEach не поддерживается ie.
    Можно использовать метод forEach массива и вызывать его на NodeList:
    [].forEach.call(document.querySelectorAll('div.foo'), e => {
      [].forEach.call(e.querySelectorAll('div.bar'), e => console.log(e));
    });
    Ответ написан
    2 комментария
  • С помощью регулярного выражения получить массив, элементами которого будут являться все найденные теги p?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    https://habr.com/post/68345/
    Читайте при жадные и нежадные квантификаторы.

    P.S. А ещё можно воспользоваться средствами самого браузера
    let str = '<h1>Я</h1>\n<p>Помню</p>\n<h1>Чудное</h1>\n<p>Мгновенье</p>';
    let div = document.createElement('div');
    div.innerHTML = str;
    let ps = div.getElementsByTagName('p');
    Ответ написан
    Комментировать
  • Как получить user name у belongsTo коллекции?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Ну так:
    $user = User::with('photos')->where('id', $id)->first();
    
    return \view('....', ['photos' => $user->photos, 'user' => $user]);
    Ответ написан
    Комментировать
  • Как решить проблему с памятью?

    angrydev
    @angrydev
    1. Отключите лишние extensions (modules), включите opcache.
    2. Как вариант - посмотрите в сторону zRam, чтобы уменьшить занимаемый объём RAM. Но в этом случае - вы будете оплачивать экономию нагрузкой на CPU.
    3. Через nginx распределите нагрузку на несколько серверов. Но в таком случае Вам придётся выделить отдельный сервер под БД и файловое хранение (не обязательно, но желательно), а так же решать проблему с пропускной способностью сети.
    Ответ написан
    5 комментариев