🐘 PHP

Wörterbücher und Hash-Tabellen in PHP 8.2: Ausführlicher Leitfaden

Словари и хеш-таблицы в PHP

Что такое словарь и зачем он нужен?

Представь, что у тебя есть коробка с ячейками, и на каждой ячейке написан номер. В обычном списке (массиве) номера идут по порядку: 0, 1, 2... Но что если мы хотим хранить данные не по номерам, а по именам? Например, у каждого твоего друга есть имя, и ты хочешь быстро найти его номер телефона по имени.

Для этого в программировании есть словари (ещё их называют ассоциативными массивами или хеш-таблицами). Они работают как настоящий словарь: у тебя есть ключ (например, слово "Россия"), и по нему ты находишь значение (например, "Здравствуйте!").

Основной синтаксис в PHP 8.2

В PHP словарь создаётся с помощью квадратных скобок [], где слева от => идёт ключ, а справа — значение:

<?php
// Словарь: страна => приветствие
$greetings = [
    "Россия" => "Здравствуйте!",
    "Франция" => "Bonjour!",
    "Италия" => "Ciao!",
    "Япония" => "Konnichiwa!"
];

// Выводим приветствие для Франции
echo $greetings["Франция"]; // Выведет: Bonjour!
?>

Ключом может быть строка или число. Значением — что угодно: строка, число, даже другой массив.

Как добавлять, менять и удалять элементы

Работать со словарём очень просто:

<?php
// Создаём пустой словарь
$phonebook = [];

// Добавляем запись
$phonebook["Анна"] = "+7-999-123-45-67";
$phonebook["Петя"] = "+7-999-765-43-21";

// Меняем существующую запись
$phonebook["Анна"] = "+7-911-111-22-33";

// Удаляем запись
unset($phonebook["Петя"]);

// Проверяем, есть ли ключ
if (isset($phonebook["Анна"])) {
    echo "Анна: " . $phonebook["Анна"];
}
?>

Как получить все ключи и все значения

Иногда нужно просто посмотреть, какие у нас есть ключи (например, названия товаров) или только значения (цены). Для этого есть специальные функции:

<?php
$products = [
    "Хлеб" => 50,
    "Молоко" => 80,
    "Яблоки" => 120
];

// Получаем только названия товаров (ключи)
$names = array_keys($products);
print_r($names); // Array([0]=>Хлеб [1]=>Молоко [2]=>Яблоки)

// Получаем только цены (значения)
$prices = array_values($products);
print_r($prices); // Array([0]=>50 [1]=>80 [2]=>120)
?>

Разбор типичных задач

Задача 1: Приветствие для путешественника

У нас есть словарь стран и приветствий. Пользователь вводит название страны, программа выводит приветствие.

<?php
$greetings = [
    "Россия" => "Здравствуйте!",
    "Франция" => "Bonjour!",
    "Италия" => "Ciao!",
    "Испания" => "¡Hola!"
];

echo "Введите название страны: ";
$country = trim(fgets(STDIN));

if (isset($greetings[$country])) {
    echo "Приветствие: " . $greetings[$country] . "\n";
} else {
    echo "Извините, приветствие для этой страны не найдено.\n";
}
?>

Задача 2: Телефонный справочник

Ищем номер телефона по имени:

<?php
$phonebook = [
    "Мария" => "8-495-123-45-67",
    "Иван" => "8-495-765-43-21",
    "Ольга" => "8-495-111-22-33"
];

echo "Введите имя для поиска: ";
$name = trim(fgets(STDIN));

if (array_key_exists($name, $phonebook)) {
    echo "Телефон $name: " . $phonebook[$name] . "\n";
} else {
    echo "Контакт не найден.\n";
}
?>

Задача 3: Планировщик дел на неделю

Каждый день недели — это ключ, а список дел — это массив значений:

<?php
$weekPlan = [
    "Понедельник" => ["Купить хлеб", "Позвонить врачу"],
    "Вторник" => ["Сходить в спортзал"],
    "Среда" => ["Убраться в комнате", "Помыть посуду"]
];

echo "Введите день недели: ";
$day = trim(fgets(STDIN));

if (isset($weekPlan[$day])) {
    echo "Дела на $day:\n";
    foreach ($weekPlan[$day] as $task) {
        echo "- $task\n";
    }
} else {
    echo "На этот день дел нет.\n";
}
?>

Задача 4: Удаление контакта из блокнота

<?php
$contacts = [
    "Анна" => "8-999-111-22-33",
    "Борис" => "8-999-444-55-66",
    "Вика" => "8-999-777-88-99"
];

echo "Введите имя для удаления: ";
$name = trim(fgets(STDIN));

if (isset($contacts[$name])) {
    unset($contacts[$name]);
    echo "Контакт '$name' удалён.\n";
} else {
    echo "Такого контакта нет.\n";
}

echo "Остались контакты:\n";
foreach ($contacts as $name => $phone) {
    echo "$name: $phone\n";
}
?>

Задача 5: Список товаров магазина

<?php
$products = [
    "Хлеб" => 50,
    "Молоко" => 80,
    "Яблоки" => 120,
    "Сыр" => 250
];

echo "Список товаров:\n";
foreach ($products as $name => $price) {
    echo "$name - $price руб.\n";
}
?>

Частые ошибки новичков

  • Ошибка 1: Пытаться обратиться к ключу, которого нет. Всегда проверяй через isset() или array_key_exists().
  • Ошибка 2: Путать ключи и значения. Запомни: слева от => — ключ (имя), справа — значение (телефон, цена).
  • Ошибка 3: Забывать кавычки у строковых ключей. Ключ "Россия" — это строка, её нужно писать в кавычках.
  • Ошибка 4: Использовать echo для вывода всего словаря сразу. Для этого есть print_r() или var_dump().

Итоговый пример: программа для учёта оценок учеников

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

<?php
// Словарь: имя ученика => список оценок
$grades = [
    "Алиса" => [5, 4, 5, 3],
    "Борис" => [3, 4, 4],
    "Вика" => [5, 5, 5, 5, 5]
];

echo "Введите имя ученика: ";
$name = trim(fgets(STDIN));

if (!isset($grades[$name])) {
    echo "Ученик '$name' не найден.\n";
    exit;
}

$studentGrades = $grades[$name];
$average = array_sum($studentGrades) / count($studentGrades);

echo "Оценки $name: " . implode(", ", $studentGrades) . "\n";
echo "Средний балл: " . round($average, 1) . "\n";

// Добавим новую оценку
echo "Введите новую оценку: ";
$newGrade = (int)trim(fgets(STDIN));
$grades[$name][] = $newGrade;

echo "Обновлённые оценки: " . implode(", ", $grades[$name]) . "\n";
?>

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