Нередко нам из больших многомерных массивов данных нужно вытащить конкретные данные по ключу. Представим, что наш многомерный массив - это таблица с данными и нам нужна только одна колонка оттуда. Обычно мы берём нативную функцию 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.