EasyТеория4 min

Основы массивов

Создание, индексация, ассоциативные, многомерные массивы

Основы массивов в PHP

Создание массивов

<?php
declare(strict_types=1);

// Short syntax (recommended)
$fruits = ['apple', 'banana', 'cherry'];

// Long syntax (legacy)
$fruits = array('apple', 'banana', 'cherry');

// Empty array
$empty = [];

// Associative array
$user = [
    'name' => 'Alice',
    'age' => 25,
    'active' => true,
];

// Mixed keys
$mixed = [
    'name' => 'Alice',
    0 => 'zero',
    'items' => [1, 2, 3],
];

// Trailing comma (allowed since PHP 7.3)
$config = [
    'host' => 'localhost',
    'port' => 3306,  // Trailing comma is OK
];

Индексация и ключи

Автоматическая индексация

<?php
declare(strict_types=1);

// Auto-indexed (starts from 0)
$arr = ['a', 'b', 'c'];
// [0 => 'a', 1 => 'b', 2 => 'c']

// Custom starting index
$arr = [5 => 'a', 'b', 'c'];
// [5 => 'a', 6 => 'b', 7 => 'c']
// Next auto-index = max(existing keys) + 1

// Gap in keys
$arr = [0 => 'a', 5 => 'b', 'c'];
// [0 => 'a', 5 => 'b', 6 => 'c']

// Adding elements
$arr = [];
$arr[] = 'first';    // Key 0
$arr[] = 'second';   // Key 1
$arr[10] = 'tenth';  // Key 10
$arr[] = 'next';     // Key 11 (max + 1)

Приведение типов ключей

<?php
declare(strict_types=1);

// Keys are cast to int or string
$arr = [
    1       => 'int 1',
    '1'     => 'string 1',    // Same key! Overwrites previous
    1.9     => 'float 1.9',   // Cast to int(1), overwrites again
    true    => 'bool true',   // Cast to int(1), overwrites again
    false   => 'bool false',  // Cast to int(0)
    null    => 'null value',  // Cast to string ''
    ''      => 'empty string', // Same key as null!
];

var_dump($arr);
// [1 => 'bool true', 0 => 'bool false', '' => 'empty string']

Ловушка экзамена: Ключи массива приводятся к int (если строка является валидным целым числом) или string. true=1, false=0, null='', 1.9=1. Строка '01' НЕ приводится к числу (ведущий ноль), а строка '1' — приводится к int(1).

<?php
declare(strict_types=1);

// String keys that look like integers are cast to int
$arr = ['0' => 'a', '1' => 'b', '2' => 'c'];
var_dump(array_keys($arr));  // [0, 1, 2] — int keys!

// But strings with leading zeros stay as strings
$arr = ['01' => 'a', '02' => 'b'];
var_dump(array_keys($arr));  // ['01', '02'] — string keys!

// Negative numeric strings are also cast to int (PHP 8.1+)
$arr = ['-1' => 'neg'];
var_dump(array_keys($arr));  // [-1] — int in PHP 8.1+

Доступ к элементам

<?php
declare(strict_types=1);

$user = ['name' => 'Alice', 'age' => 25, 'hobbies' => ['php', 'js']];

// Direct access
echo $user['name'];           // Alice
echo $user['hobbies'][0];     // php

// Null coalescing for safe access
echo $user['email'] ?? 'N/A';  // N/A (key doesn't exist)

// Checking existence
var_dump(isset($user['name']));           // true
var_dump(isset($user['email']));          // false
var_dump(array_key_exists('name', $user)); // true

// isset vs array_key_exists
$arr = ['key' => null];
var_dump(isset($arr['key']));              // false (null returns false!)
var_dump(array_key_exists('key', $arr));   // true (key exists)

Ловушка экзамена: isset($arr['key']) возвращает false если значение равно null, даже если ключ существует! Для проверки существования ключа используйте array_key_exists().

Добавление и удаление элементов

<?php
declare(strict_types=1);

$arr = ['a', 'b', 'c'];

// Append
$arr[] = 'd';              // Add to end
$arr[10] = 'k';            // Add at specific key

// Prepend
array_unshift($arr, 'z');  // Add to beginning (reindexes!)

// Remove
unset($arr[0]);            // Remove element (does NOT reindex!)

// Remove and reindex
$arr = array_values($arr); // Reset keys to sequential

// Remove from end
$last = array_pop($arr);   // Returns and removes last element

// Remove from beginning
$first = array_shift($arr); // Returns and removes first (reindexes!)

// Array splice
$arr = ['a', 'b', 'c', 'd', 'e'];
$removed = array_splice($arr, 1, 2, ['x', 'y']);
// $arr = ['a', 'x', 'y', 'd', 'e']
// $removed = ['b', 'c']

Запомни: unset() удаляет элемент, но НЕ переиндексирует массив. array_shift() удаляет первый элемент И переиндексирует. Для переиндексации после unset используйте array_values().

Многомерные массивы

<?php
declare(strict_types=1);

// 2D array
$matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
];
echo $matrix[1][2];  // 6

// Associative nested array
$users = [
    'alice' => [
        'email' => '[email protected]',
        'roles' => ['admin', 'editor'],
    ],
    'bob' => [
        'email' => '[email protected]',
        'roles' => ['user'],
    ],
];

echo $users['alice']['email'];       // [email protected]
echo $users['alice']['roles'][0];    // admin

// Modifying nested values
$users['alice']['roles'][] = 'moderator';

// Destructuring (PHP 7.1+)
['email' => $email, 'roles' => $roles] = $users['alice'];
echo $email;  // [email protected]

// Nested destructuring
[['name' => $name1], ['name' => $name2]] = [
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Bob', 'age' => 30],
];

Сравнение массивов

<?php
declare(strict_types=1);

$a = [1, 2, 3];
$b = [1, 2, 3];
$c = ['0' => 1, '1' => 2, '2' => 3];
$d = [3, 2, 1];

// == (loose): same key/value pairs (with type juggling)
var_dump($a == $b);  // true
var_dump($a == $c);  // true (string keys '0','1','2' = int 0,1,2)
var_dump($a == $d);  // false (different order)

// === (strict): same key/value pairs, same types, same order
var_dump($a === $b);  // true
var_dump($a === $c);  // false! (keys are different types)

// Comparison with different order
$x = ['a' => 1, 'b' => 2];
$y = ['b' => 2, 'a' => 1];
var_dump($x == $y);   // true (order doesn't matter for ==)
var_dump($x === $y);  // false (order matters for ===)

Ловушка экзамена: Для ассоциативных массивов == не учитывает порядок элементов, но === учитывает! ['a'=>1, 'b'=>2] == ['b'=>2, 'a'=>1] = true, но === будет false.

Полезные операции

<?php
declare(strict_types=1);

$arr = [3, 1, 4, 1, 5, 9, 2, 6, 5];

// Count
echo count($arr);     // 9
echo sizeof($arr);    // 9 (alias)

// Check if array
var_dump(is_array($arr));  // true

// Check if empty
var_dump(empty([]));   // true
var_dump(empty($arr)); // false

// in_array — search value
var_dump(in_array(4, $arr));           // true
var_dump(in_array('4', $arr));         // true (loose!)
var_dump(in_array('4', $arr, true));   // false (strict)

// array_search — find key by value
echo array_search(4, $arr);           // 2 (key)
echo array_search(99, $arr);          // false

// Spread operator
$first = [1, 2, 3];
$second = [4, 5, 6];
$merged = [...$first, ...$second];    // [1,2,3,4,5,6]

Вопросы с экзамена ZCE

Проверь себя

5 из 27

Что выведет этот скрипт при третьей загрузке в браузере одним пользователем? ```php session_start(); if (!array_key_exists('counter', $_SESSION)) { $_SESSION['counter'] = 0; } else { $_SESSION['counter']++; } session_regenerate_id(); echo $_SESSION['counter']; ```

Какая функция проверяет, существует ли конкретный элемент в данном массиве?

Какие типы данных можно использовать в качестве ключа массива? (выберите три)

Выберите все правильные варианты

Что произойдёт, если передать ассоциативный массив в `sort()`?

Что вернёт `isset(['key' => null]['key'])`?

Code Challenges

Удаление дубликатов

Напишите функцию, которая удаляет дубликаты из массива, сохраняя порядок элементов. Без array_unique().

Test Cases

1. Input: [1,2,2,3,3,3,4]→ Expected: [1,2,3,4]
2. Input: ["a","b","a","c"]→ Expected: ["a","b","c"]
3. Input: []→ Expected: []
4. Input: [1,1,1]→ Expected: [1]