Вялый. Вялый Ограничение глубины рекурсии

ВЯЛЫЙ

ВЯЛЫЙ. Слово вялый (ср. вялость , умственная вялость ), восходящее к форме причастия прош. вр. от глагола вянуть (ср. увянуть - увял , завянуть - завял ), в современном языке оторвалось от лексического гнезда, связанного с корнем вяд - вя (д ). Выражения вялые цветы , вялые овощи устарели. Точно так же семантически обособилось как от вянуть , так и от вялый слово вялить (вялить рыбу , вяленая рыба ).

Печатается по авторской рукописи (1 тетрадный лист). К слову вялый и однокоренным словам В. В. Виноградов обращается также в статье «Об основном словарном фонде и его словообразующей роли в истории языка»: «От вянуть (увянуть - увядать , увядание , завянуть , повянуть , вялый , вялость и т. п.) через посредство вялый (вялость ) обособляются слова вялить , вяленый .

Любопытно, что в современном русском языке прямое значение слова вялый (ср. вялые цветы, вялые овощи) все больше слабеет, становится малоупотребительным; над ним явно возобладало переносное употребление: вялое настроение , вялый характер » (Виноградов. Избр. тр.: Лексикология и лексикография, с. 64). - И . У .

В. В. Виноградов. История слов , 2010

Синонимы :

Смотреть что такое "ВЯЛЫЙ" в других словарях:

    Безжизненный, бесстрастный, апатичный, инертный, дряблый, медлительный, мешкотный, неповоротливый, неподвижный, нерасторопный, сонливый, сонный, флегматический, тяжелый на подъем; ворона, мямля, разиня, соня, байбак, мокрая курица. Прот. слабый.… … Словарь синонимов

    вялый - ВЯЛЫЙ, апатический, апатичный, неживой, сонный … Словарь-тезаурус синонимов русской речи

    ВЯЛЫЙ, вялая, вялое; вял, вяла, вяло. 1. Увядший, лишившийся свежести (устар.). Вялые цветы. 2. перен. Без бодрости, энергии, живости. Вялое настроение. Вялая работа. «Вяло (нареч.) тявкали где то собаки.» Д.Бедный. Толковый словарь Ушакова. Д.Н … Толковый словарь Ушакова

    ВЯЛЫЙ, ая, ое; вял. 1. полн. Увядший, завянувший. В. цветок. Вялые листья. 2. перен. Лишённый бодрости, энергии. В. работник. Вялое настроение. | сущ. вялость, и, жен. (ко 2 знач.). Толковый словарь Ожегова. С.И. Ожегов, Н.Ю. Шведова. 1949 1992 … Толковый словарь Ожегова

    вялый - вялый, кратк. ф. вял, вяла, вяло, вялы; сравн. ст. вялее … Словарь трудностей произношения и ударения в современном русском языке

    Прил., употр. сравн. часто Морфология: вял, вяла, вяло, вялее; вялы; нар. вяло 1. Растения, продукты и т. п. называют вялыми, когда они лишены упругости, свежести. На прилавке лежали вялые фрукты. 2. Человека, животное называют вялым, когда он… … Толковый словарь Дмитриева

    вялый - ая, ое; вял, вя/ла, вя/лы 1) полн. ф. О растениях: потерявший свежесть, увядший. Вялая сирень. Вялые цветы. [Бабы] навязчиво предлагали пассажирам вялую малину (Куприн). Синонимы: блеклый, жу/хлый, поблекший 2) перен. Лишенный живого … Популярный словарь русского языка

    Укр. В’ялий Характеристика Длина 11 км Площадь бассейна 59 км² Водоток Исток … Википедия

    Прил. 1. Потерявший свежесть, увядший (о растениях). отт. перен. разг. Лишённый живости, яркости; неинтересный, скучный. 2. перен. Медлительный от усталости, слабости, болезни и т.п. (о человеке). отт. Свойственный такому человеку или животному.… … Современный толковый словарь русского языка Ефремовой

    Вялый, вялая, вялое, вялые, вялого, вялой, вялого, вялых, вялому, вялой, вялому, вялым, вялый, вялую, вялое, вялые, вялого, вялую, вялое, вялых, вялым, вялой, вялою, вялым, вялыми, вялом, вялой, вялом, вялых, вял, вяла, вяло, вялы, вялее, повялее … Формы слов

Книги

  • Дискретный анализ. Формальные системы и алгоритмы 2-е изд., испр. и доп. Учебное пособие для академического бакалавриата , Михаил Николаевич Вялый. В данном учебном пособии излагаются основы теории формальных систем и теории алгоритмов. В книге рассматриваются примеры классического и интуиционистского исчисления высказываний… электронная книга
  • Дискретный анализ. Основы высшей алгебры 2-е изд., испр. и доп. Учебное пособие для академического бакалавриата , Михаил Николаевич Вялый. Данное учебное пособие посвящено введению в высшую алгебру. В нем рассматриваются свойства основных алгебраических структур: групп, колец, полей. Основное внимание в книге сфокусировано на…

Последнее обновление: 19.07.2016

Одним из ключевых компонентов паттерна MVC являются модели . Ключевая задача моделей - описание структуры и логики используемых данных.

Как правило, все используемые сущности в приложении выделяются в отдельные модели, которые и описывают структуру каждой сущности. В зависимости от задач и предметной области мы можем выделить различное количество моделей в приложении.

Все модели оформляются как обычные POCO-классы (plain-old CRL objects), то есть обычные классы на языке C#. Например, если мы работаем с приложением интернет-магазина мобильных телефонов, то мы могли бы определить в проекте следующую модель, представляющую телефон:

Public class Phone { public int Id { get; set; } public string Name { get; set; } public string Company { get; set; } public int Price { get; set; } }

Модель Phone определяет ряд свойств: уникальный идентификатор Id, название, компанию производителя и цену. Это классическая анемичная модель . Анемичная модель не имеет поведения и хранит только состояние в виде свойств.

Однако модель необязательно должна состоять только из свойств. Кроме того, она может иметь конструктор, какие-нибудь методы, поля, вообщем предствлять стандартный класс на языке C#. Модели, которые также определяют поведение, в противоположность анемичным моделям называют "толстыми" моделями (Rich Domain Model / Fat Model / Thick Model). Например, мы можем уйти от анемичной модели, модифицировав ее следующим образом:

Public class Phone { private decimal _discount = 0; public Phone(decimal discount) { this._discount = discount; } public int Id { get; set; } public string Name { get; set; } public string Company { get; set; } public decimal Price { get; set; } public decimal GetPriceWithDiscount() { return this.Price - (this.Price * this._discount); } }

Но какой бы способ описания сущности не был выбран, главное не перегружать класс модели и помнить, что его предназначение состоит прежде всего описывать данные. И модель должна описывать только одну сущность, следуя принципу единой ответственности.

В приложении ASP.NET MVC Core модели можно разделить по степени применения на несколько групп:

    Модели, объекты которых хранятся в специальных хранилищах данных (например, в базах данных, файлах xml и т.д.)

    Модели, которые используются для передачи данных представление или наоборот, для получения данных из представления. Такие модели еще называтся моделями представления

    Вспомогательные модели для промежуточных вычислений

Как правило, для хранения моделей создается в проекте отдельная папка Models . Модели представления нередко помещаются в отдельную папку, которая нередко называется ViewModels .

Проект ASP.NET MVC Core со встроенной аутентификацией по умолчанию уже содержит эти папки, и в них находятся в все необходимые модели. Однако если мы создаем проект без встроенной аутентификации, то эти папки отсутствуют. И соответственно нам надо добавить эти папки вручную. Но опять же подчеркну, что нам необязательно называть папки для хранения моделей именно Models и ViewModels. Это могут быть каталоги с любыми называниями, можно помещать модели в корень проекта, но более распространенным стилем являются названия Models и ViewModels.

Например, создадим новый проект ASP.NET Core по типу Web Application и назовем его ModelsApp . Вначале добавим в проект папку Models для хранения моделей.

И в нее поместим новый класс Company:

Public class Company { public int Id { get; set; } public string Name { get; set; } public string Country { get; set; } }

И также добавим в папку Models класс Phone

Public class Phone { public int Id { get; set; } public string Name { get; set; } public Company Manufacturer { get; set; } public decimal Price { get; set; } }

Эти модели будут описывать данные, которые мы будем использовать. Эти данные могут храниться в базе данных, но для простоты мы определим их в контроллере. Изменим контроллер HomeController следующим образом:

Using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using ModelsApp.Models; // пространство имен моделей namespace ModelsApp.Controllers { public class HomeController: Controller { List companies; ListPhones; public HomeController() { Company apple = new Company { Id = 1, Name = "Apple", Country="США" }; Company microsoft = new Company { Id = 2, Name = "Microsoft", Country="США" }; Company google = new Company { Id = 3, Name = "Google", Country="США" }; companies = new List { apple, microsoft, google }; phones = new List { new Phone { Id=1, Manufacturer= apple, Name="iPhone 6S", Price=56000 }, new Phone { Id=2, Manufacturer= apple, Name="iPhone 5S", Price=41000 }, new Phone { Id=3, Manufacturer= microsoft, Name="Lumia 550", Price=9000 }, new Phone { Id=4, Manufacturer= microsoft, Name="Lumia 950", Price=40000 }, new Phone { Id=5, Manufacturer= google, Name="Nexus 5X", Price=30000 }, new Phone { Id=6, Manufacturer= google, Name="Nexus 6P", Price=50000 } }; } public IActionResult Index() { return View(phones); } } }

Список объектом модели передается в представление с помощью метода View() .

И в конце изменим представление Index.cshtml , которое будет выводить все объекты:

@using ModelsApp.Models @model IEnumerable @{ ViewData["Title"] = "Home Page"; }

@foreach (Phone p in Model) { }
@p.Name@p.Manufacturer?.Name@p.Price

В этой заметке я хочу рассказать о технологии LazyLoad или в простонародье «ленивая загрузка»(её ещё называют бесконечный скроллинг или Infinity Scroll) в Битриксе. Метод, описанный мной, будет точно работать в компонентах catalog.section и news.list .

Файлы компонентов, мы конечно же, модифицировать не будем.

«Ленивая загрузка» позволяет снизить нагрузку на сервер, а так же намного быстрее показывать нужный контент пользователю. Зачем ему перезагружать всю страницу целиком, если можно подгрузить только нужный фрагмент страницы. В нашем случаем — это элементы, будь то, элементы новостей или товары каталога.

Суть такого механизма проста: пользователю сначала показывается, например, 15 новостей и потом, как только он докручивает до их конца, сразу же подгружаются следующие 15 элементов. И так, пока не закончатся элементы.

Технические детали

В конце, после списка элементов, мы будем вставлять пустую ссылку, на следующие элементы. В ссылку будем добавлять параметр AJAX_PAGE, он нам ещё понадобится.
Выглядеть она будет примерно так:

/news/?PAGEN_2=2&AJAX_PAGE=Y

NavNum ; $paramValue = $arResult [ " NAV_RESULT " ] -> NavPageNomer ; $pageCount = $arResult [ " NAV_RESULT " ] -> NavPageCount ; if ($paramValue < $pageCount ) { $paramValue = (int ) $paramValue + 1 ; $url = htmlspecialcharsbx ( $APPLICATION -> GetCurPageParam ( sprintf (" %s=%s " , $paramName , $paramValue ) , array ($paramName , " AJAX_PAGE " , ) ) ) ; echo sprintf ("

" , $url ) ; } ?>

Способ первый: без кеширования

Этот способ самый простой и первым приходит в голову.

В шаблон компонента, до вывода элементов вставляем такую строку:

if (isset ($_GET [ " AJAX_PAGE " ] ) ) { $APPLICATION -> RestartBuffer () ; }

А после вывода элементов вставляем это:

if (isset ($_GET [ " AJAX_PAGE " ] ) ) { die () ; }

Что мы делаем:
Если страницу открываем при помощи AJAX , то перед выводом элементов сбрасываем буфер контента функцией $APPLICATION->RestartBuffer() . А в конце просто выходим. Тем самым мы отдаем только нужный кусок контента при аякс запросе.

Но в этом способе есть большой минус. Функция RestartBuffer() не будет работать при включенном кешировании.

Способ второй: с кешированием

Тут нам на помощь приходит файл component_epilog.php . Он выполняется при каждой загрузке страницы и запускается после того, как отработал шаблон. Как раз то, что нам нужно.

Теперь в шаблон компонента, до вывода элементов и после вывода элементов вставляем html комментарий:

В папке с темой для нужного компонента создаем файл component_epilog.php и вставляем в него этот код:

if (! defined (" B_PROLOG_INCLUDED " ) || B_PROLOG_INCLUDED !== true ) die () ; if (isset ($_GET [ " AJAX_PAGE " ] ) ) { $content = ob_get_contents () ; ob_end_clean () ; $APPLICATION -> RestartBuffer () ; list (, $content_html ) = explode (" " , $content ) ; echo $content_html ; die () ; }

Пример JavaScript кода

(function (" , ajaxPagerWrapClass = " ajax-pager-wrap " , ajaxPagerLinkClass = " ajax-pager-link " , ajaxWrapAttribute = " = [ " + " "> " " , " " ] . join (" " ) , busy = false , attachPagination = function (wrapperClass ) { var $ wrapper = $ (" . " + wrapperClass ) , $ window = $ (window ) ; if ($ wrapper . length && $ (" . " + ajaxPagerWrapClass ) . length ) { $ window . on (" scroll " , function () { if (($ window . scrollTop () + $ window . height () ) > ($ wrapper . offset () . top + $ wrapper . height () ) && ! busy ) { busy = true ; $ (" . " + ajaxPagerLinkClass ) . click () ; } } ) ; } } , ajaxPagination = function (e ) { e . preventDefault () ; busy = true ; var wrapperClass = $ (" . " + ajaxPagerLinkClass ) . data (ajaxWrapAttribute ) , $ wrapper = $ (" . " + wrapperClass ) , $ link = $ (this ) ; if ($ wrapper . length ) { $ (" . " + ajaxPagerWrapClass ) ) ; $. get ($ link . attr (" href " ) , { " AJAX_PAGE " : " Y " } , function (data ) { $ (" . " + ajaxPagerWrapClass ) . remove () ; $ wrapper . append (data ) ; attachPagination (wrapperClass ) ; busy = false ; } ) ; } } ; $ (function () { if ($ (" . " + ajaxPagerLinkClass ) . length && $ (" . " + ajaxPagerLinkClass ) . data (ajaxWrapAttribute ) . length ) { attachPagination ($ (" . " + ajaxPagerLinkClass ) . data (ajaxWrapAttribute ) ) ; $ (document ) . on (" click " , " . " + ajaxPagerLinkClass , ajaxPagination ) ; } } ) ; } ) () ;

Объясню, что происходит. Теперь при открытии страницы при помощи AJAX запроса, отрабатывает шаблон и вызывается файл component_epilog.php. В нем мы получаем весь контент из буфера, разбиваем его по нашему html комментарию и отдаем клиенту.

Вот такой вот хитрый способ:)

Обновлено 1.12.14

В комментариях к заметке и в письмах на почту люди спрашивают, как быть с включенным композитным режимом ? Ведь второй способ «с включенным кешированием» не заработает. И совершенно верно.

Способ третий: с включенным композитным режимом

Если посмотреть на блок-схему работы технологии , то можно заметить, что после исполнения страницы и перед записью её в кеш композита, вызывается событие OnEndBufferContent (оно же вызывается и без технологии). На нём мы и сыграем.

Привожу код обработчика для композитного режима :

// при включенном композитном режиме, сохраняем в кеш, контент нужный для отдачи аяксом \ Bitrix \ Main \ EventManager :: getInstance () -> addEventHandlerCompatible (" main " , " OnEndBufferContent " , function (& $content ) { if (version_compare (SM_VERSION , " 14.5.0 " ) >= 0 && CHTMLPagesCache :: IsCompositeEnabled () ) { if (isset ($_SERVER [ " HTTP_X_REQUESTED_WITH " ] , $_GET [ " AJAX_PAGE " ] ) && strtolower ($_SERVER [ " HTTP_X_REQUESTED_WITH " ] ) === " xmlhttprequest " ) { list (, $content_html ) = explode (" " , $content ) ; if (is_string ($content_html ) && strlen ($content_html ) ) { $content = $content_html ; } } } } ) ;

Добавить его нужно в init.php вашего сайта.

Если в настройках композита стоит галочка «Сохранять на диск только страницы без параметров», то в поле «а также страницы содержащие только следующие параметры» надо добавить параметр AJAX_PAGE.

И хочу заметить, что при этом способе код приведённый во втором пункте для файла component_epilog.php с включенным кеширование нужно удалить.

Ещё теги для роботов: ajax постраничная навигация , ajax пагинация , ajax подгрузка товаров .

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

*Наведите курсор мыши для приостановки прокрутки.

Назад Вперед

Получение списка папок с помощью PHP

Список каталогов средствами PHP, или листинг директорий

Листингом директорий мы будем называть запрос общего вида, формирующий список всех, либо некоторых файлов и каталогов родительской директории - процесс похожий на работу индексной страницы, обеспечиваемой большинством веб-серверов, но с бо льшим контролем над контентом и форматированием оного же.

Ещё одно преимущество данного скрипта - возможность выполнять определённые действия с файлами, используя PHP. В любом случае, первый шаг, который нам нужно сделать - это запрос к файловой системе - вернуть список файлов и каталогов.

Функции, представленные ниже, позволяют обеспечить извлечение имён файлов и других свойств из определённой директории или же пройтись по подкатегориям рекурсивно.

Замечание: в PHP5 есть функция scandir , которая "возвращает список файлов и каталогов, внутри директории, по заданному пути", однако она не выводит какую-либо дополнительную информацию о находящихся внутри директории файлах.

Листинг одной директории

Для начала, вот пример простой функции, которая возвращает список файлов, каталогов и их свойства, из одной директории (более продвинутые версии этой функции вы найдёте чуть ниже в данном уроке.)

read())) { // пропустить скрытые файлы if($entry == ".") continue; if(is_dir("$dir$entry")) { $retval = array("name" => "$dir$entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); } elseif(is_readable("$dir$entry")) { $retval = array("name" => "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry")); } } $d->close(); return $retval; } ?>

Вы можете использовать эту функцию как ниже:

Возвращаемое значение является ассоциативным массивом файлов, включающим в себя информацию о пути к файлу, размер и дату последней модификации, кроме случая, когда файл является директорией, в этом случае строка "(dir)" возникает вместо размера файла.

Пример 1:

",print_r($dirlist),""; /* пример вывода Array ( => Array ( => images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Пример 2:

",print_r($dirlist),""; /* пример вывода Array ( => Array ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Вывод списка файлов через HTML

Чтобы получить результаты вывода на странице в HTML, мы прокрутим возвращаемый массив через цикл

\n"; echo "NameTypeSizeLast Mod.\n"; foreach($dirlist as $file) { echo "\n"; echo "{$file["name"]}\n"; echo "{$file["type"]}\n"; echo "{$file["size"]}\n"; echo "\n"; echo "\n"; } echo "\n\n"; ?>

Этот код довольно просто модифицировать, например:

  • - вывести результаты листинга списком вместо таблицы;
  • - сделать названия файлов активными ссылками;
  • - заменить имена иконками на основании того, какой тип у файла;
  • и т.д.

Например, для вывода только PNG-файлов, добавьте простое условие в цикл вывода:

\n"; echo "NameTypeSizeLast Mod.\n"; foreach($dirlist as $file) { //проверка на принадлежность файла к PNG if(!preg_match("/\.png$/", $file["name"])) continue; echo "\n"; echo "{$file["name"]}\n"; echo "{$file["type"]}\n"; echo "{$file["size"]}\n"; echo "",date("r", $file["lastmod"]),"\n"; echo "\n"; } echo "\n\n"; ?>

В этом примере будут пропущены и скрыты все файлы, чьи имена заканчиваются на .png . Вы также можете применить дополнительные условия, основанные на типе файла, его размере или дате последнего изменения.

Если вы, например, хотите отобразить миниатюру, ссылкой на картинку большего размера, или даже видео, просто задайте этим 2-м файлам одинаковые имена и в скрипте выше используйте str_replace или похожую функцию, чтобы модифицировать содержимое ссылок.

Рекурсивный листинг директории

И раз уж мы зашли так далеко, здесь будут только незначительные изменения в функции вызова рекурсивного списка и субкатегорий. Добавляя второй параметр в функцию, мы сохраняем предыдущий функционал листинга одиночной директории.

read())) { // пропустить скрытые файлы if($entry == ".") continue; if(is_dir("$dir$entry")) { $retval = array("name" => "$dir$entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) { $retval = array_merge($retval, getFileList("$dir$entry/", true)); } } elseif(is_readable("$dir$entry")) { $retval = array("name" => "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry")); } } $d->close(); return $retval; } ?>

Чтобы новый функционал заработал, вам нужно ввести значение true (или 1) в качестве второго параметра.

Перед рекурсингом скрипта проверьте, являются ли поддиректории читабельными а также ознакомьтесь с последним пунктом данного урока, дабы избежать ошибок доступа.

Как и раньше, возвращаемая величина - это массив, ассоциативный массивов. Фактически, единственное дополнение - это ещё одна дополнительная опция для рекурсивного листинга.

Ограничение глубины рекурсии

Этот финальный пример добавляет ещё одно свойство - способность к определению, как "глубоко" должна проходить рекурсия. Предыдущий код будет продолжать исследовать вложенные директории, до тех пор пока они не закончатся. Этот скрипт поможет установить ограничение, по количеству уровней вложенных директорий.

read())) { // пропустить скрытые файлы if($entry == ".") continue; if(is_dir("$dir$entry")) { $retval = array("name" => "$dir$entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) { if($depth === false) { $retval = array_merge($retval, getFileList("$dir$entry/", true)); } elseif($depth > 0) { $retval = array_merge($retval, getFileList("$dir$entry/", true, $depth-1)); } } } elseif(is_readable("$dir$entry")) { $retval = array("name" => "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry")); } } $d->close(); return $retval; } ?>

Как и раньше, мы добавили всего 1 новый параметр и пару строк кода. Если значение по умолчанию, отвечающее за глубину рекурсинга, не задано, то оно устанавливается в false . Это позволяет нам быть уверенными в том, что предыдущие особенности остаются и последующий код не "поломается" при изменении функции.

Всем привет!
Вы слушаете «Пятиминутку PHP», выпуск номер 21 — подкаст о новостях из мира PHP, интересных постах в блогах и современных подходах к разработке.

Напомню, что со времён версии 4.0 в PHP существует конструкция list , которая позволяет присвоить несколько значений из пронумерованного массива нескольким переменным в одну строку. Это удобный синтаксис, если, например, вы читаете результаты запроса к базе или хотите вернуть из функции несколько значений.

Как это выглядит: вы используете оператор присваивания и пишете list($a, $b) = $arr , где справа от оператора присваивания должен находиться массив. Соответственно, переменной $a будет присвоено значение нулевого элемента массива, а переменной $b значение элемента массива с индексом 1. Один из известных трюков – это возможность поменять местами значения двух переменных в одну строку написав list($a, $b) = [$b, $a] .

Внутри конструкции list можно указать любое количество переменных, и они примут значения соответствующих по порядку элементов массива, стоящего справа от оператора присваивания.

Не все знают, но конструкции list можно вкладывать друг в друга, тем самым обращаясь к вложенным массивам. Ещё одна хитрость в том, что некоторые элементы из массивов можно пропустить, просто написав внутри list две запятые подряд.

Кстати говоря, в правой части присваивания не обязательно должен быть PHP тип array, это может быть любой тип реализующий интерфейс ArrayAccess .

Всё что я рассказал только что – это не что-то новое, это конструкция list, которая существует в PHP начиная с версии 4.0. А что нового предлагает нам «RFC: Allow specifying keys in list()», так это возможность разбирать по переменным не только пронумерованные массивы, но и ассоциативные, указывая требуемые ключи в конструкции list.

Например, у нас есть ассоциативный массив, отображающий какую-то строку из таблицы из базы данных. Я хочу вынуть значения трёх элементов из этого массива в отдельные переменные, значения элементов с ключами ‘id’, ‘name’ и ‘age’. Можно сделать три операции присваивания. А можно более кратко: написать list("id" => $id, "name" => $name, "age" => $age) = $arr . Ключами внутри конструкции list могут быть не только строковые литералы, но и выражения, например, константы или переменные содержащие значение ключа.

Второй RFC, который я хочу упомянуть в этом выпуске подкаста, называется «Square bracket syntax for array destructuring assignment» — новый синтаксис деструктуризации массивов. Destructuring (или «деструктуризация») – это когда мы разбираем сложную структуру данных по кусочкам, по отдельным переменным. Конструкция list по сути и есть способ деструктуризации массивов. Данный RFC предлагает нам больше не писать слово list, а использовать квадратные скобки в левой части оператора присваивания.

Это изменение сродни тому, когда с выходом PHP 5.4 мы смогли создавать массивы не используя конструкцию array, а через квадратные скобки. Теперь же с квадратными скобками по обе стороны присваивания, синтаксис становится консистентным и симметричным, и это мне нравится.

Более того, этот RFC учитывает предыдущий и мы сможем деструктурировать и ассоциативные массивы, указывая нужные ключи в левой части присваивания.

Синтаксис квадратных скобок, как и конструкцию list, можно будет вкладывать друг в друга для доступа ко вложенным массивам. Единственное, чего нельзя: мешать новый синтаксис со старой конструкцией list при вложении.

Ждём в PHP 7.1 и используем по вкусу.

До встречи в следующем выпуске!