Самоучитель: PHP 8.5: инженерный практикум
Глава 6 из 22II. Мастерская данных85 минут

Глава 6. Массивы как списки, карты и множества

Один синтаксис array скрывает несколько структур данных; ошибки начинаются, когда список незаметно превращается в карту или ключи теряют предметный смысл.

После главы вы сможете
  • различить list и map
  • выбрать ключ по инварианту
  • оценить стоимость преобразования

Форма массива — часть контракта

Список имеет последовательные числовые ключи и обычно кодируется в JSON как массив. Карта связывает ключ со значением и кодируется как объект. После filter у списка могут остаться разрывы ключей; если внешний контракт требует JSON-массив, выполните array_values осознанно.

Ключ id ускоряет поиск записи в памяти, но превращает коллекцию в карту. Не используйте отображаемое имя упражнения как ключ: имена меняются и могут повторяться. Стабильный идентификатор — отдельное поле.

Выбор структуры

Формы коллекцииСтруктуру выбирают по операциям чтения и инвариантам, а не по привычке писать квадратные скобки.СписокпорядокКарта idдоступМножествоналичиеГруппыcategoryDTOграница
Структуру выбирают по операциям чтения и инвариантам, а не по привычке писать квадратные скобки.

Объединение имеет семантику

Оператор + сохраняет значения левого массива для существующих ключей. array_merge перенумеровывает числовые ключи и заменяет строковые более поздними. Spread делает запись компактнее, но не отменяет правил ключей. Перед объединением назовите, что означает конфликт.

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

Индексирование тренировок

<?php
declare(strict_types=1);

$workouts = [
    ['id' => 41, 'minutes' => 35],
    ['id' => 44, 'minutes' => 50],
];

$byId = [];
foreach ($workouts as $workout) {
    $byId[$workout['id']] = $workout;
}

echo $byId[44]['minutes'];

Стоимость скрывается в удобстве

Повторный array_filter внутри цикла создаёт квадратичную работу на больших наборах. Один раз постройте индекс, если затем выполняется много поисков. Не оптимизируйте без измерения, но умейте назвать число проходов и объём промежуточных копий.

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

Лабораторная работа

Получите список подходов и постройте карту по id, множество уникальных exercise_id и группы по дате. Для каждой структуры запишите допустимость повторов и значение порядка.

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie