Нередко нам из больших многомерных массивов данных нужно вытащить конкретные данные по ключу. Представим, что наш многомерный массив - это таблица с данными и нам нужна только одна колонка оттуда. Обычно мы берём нативную функцию PHP array_column(), но что если у нас в значениях массива могут оказаться объекты (stdClass)? Или в массиве может не оказаться нужной колонки?

Здесь нам поможет метод ArrayHelper::getColumn().

Простой пример: хотим избавиться от вложенных циклов. А точнее - просто спрятать их с глаз долой:

// в макете материала
    foreach($customFields['lending-sections']->subform_rows as $sections):
        foreach ($sections as $section):
            echo LayoutHelper::render(layoutFile: trim($sections['layout-id']->value), displayData: ['item' => $this->item, 'jcfields' => $customFields], basePath: __DIR__);
        endforeach;
    endforeach;

А можно сделать то же самое таким образом:

use \Joomla\Utilities\ArrayHelper;

$layout_id_fields = ArrayHelper::getColumn($customFields['lending-sections']->subform_rows, 'layout-id');
$layout_ids = ArrayHelper::getColumn($layout_id_fields, 'value');

foreach($layout_ids as $layout_id) {
   // выводим макет
}

Метод ArrayHelper::getColumn(array $array, $valueCol, $keyCol = null) из массива массивов или объектов извлекает:

  • значения из колонки $valueCol
  • при желании — переиндексирует результат по $keyCol

Метод работает почти как array_column() (документация PHP array_column), но:

  • умеет работать с объектами
  • умеет возвращать целые элементы, если $valueCol === null

Учитывая, что Joomla под капотом повсеместно таскает массивы с объектами (выборки из базы и т.д.) - знание такого метода существенно может упростить жизнь и ускорить разработку.

Ну и с его помощью можно пересобрать массив (сменить индексы):

// исходный массив
$items = [
    ['id' => 10, 'title' => 'Заголовок 1'],
    ['id' => 20, 'title' => 'Заголовок 2'],
];

Применяем метод:

$result = ArrayHelper::getColumn($items, 'title', 'id');

Смотрим результат:

// Это новый массив $result
[
    10 => 'Заголовок 1',
    20 => 'Заголовок 2',
]

Метод активно используется в ядре Joomla.

Толкачев Сергей Юрьевич
Толкачев Сергей Юрьевич

Joomla-разработчик. Контрибьютер ядра Joomla. Один из ведущих Telegram-канала русскоязычного Joomla-сообщества JoomlaFeed, один из модераторов чата русскоязычного Joomla-сообщества. Мои расширения в официальном маркетплейсе расширений Joomla - Joomla Extensions Directory. Имею публикации в официальном журнале международного Joomla-сообщества - Joomla Community Magazine.

Муж. Отец 3 детей.

Россия, Саратов.

Расширения Joomla WebTolk

101 Всего расширений
12 Категорий
512 Выпущено версий
630980 Всего скачиваний
Корзина
Корзина пуста