Как составить массив php

Массивы

На самом деле массив в PHP — это упорядоченное отображение, которое устанавливает
соответствие между значением и ключом.
Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как
собственно массив, список (вектор), хеш-таблицу (являющуюся реализацией карты), словарь,
коллекцию, стек, очередь и, возможно, что-то ещё. Так как значением массива может быть
другой массив PHP, можно также создавать деревья и многомерные массивы.

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

Синтаксис

Определение при помощи array()

Массив (тип array) может быть создан языковой конструкцией array().
В качестве параметров она принимает любое количество разделённых запятыми пар
key => value
(ключ => значение).

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

Запятая после последнего элемента массива необязательна и может быть опущена.
Обычно это делается для однострочных массивов, то есть array(1, 2)
предпочтительней array(1, 2, ). Для многострочных массивов с другой
стороны обычно используется завершающая запятая, так как позволяет легче добавлять
новые элементы в конец массива.

Замечание:

Существует короткий синтаксис массива, который заменяет
array() на [].

Пример #1 Простой массив


<?php
$array
= array(
"foo" => "bar",
"bar" => "foo",
);
// Использование синтаксиса короткого массива
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>

key может быть либо типа int, либо типа
string. value может быть любого типа.

Дополнительно с ключом key будут сделаны следующие преобразования:


  • Строки (string), содержащие целое число (int) (исключая случаи, когда число предваряется знаком +) будут преобразованы к типу int.
    Например, ключ со значением "8" будет в действительности сохранён со
    значением 8. С другой стороны, значение "08" не
    будет преобразовано, так как оно не является корректным десятичным целым.

  • Числа с плавающей точкой (float) также будут преобразованы к типу
    int, то есть дробная часть будет отброшена. Например, ключ со значением
    8.7 будет в действительности сохранён со значением 8.

  • Тип bool также преобразовываются к типу int.
    Например, ключ со значением true будет сохранён со значением
    1 и ключ со значением false будет сохранён со
    значением 0.

  • Тип null будет преобразован к пустой строке. Например, ключ со
    значением null будет в действительности сохранён со значением
    "".

  • Массивы (array) и объекты (object) не
    могут
    использоваться в качестве ключей. При подобном использовании будет
    генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).

Если несколько элементов в объявлении массива используют одинаковый ключ, то только
последний будет использоваться, а все другие будут перезаписаны.

Пример #2 Пример преобразования типов и перезаписи элементов


<?php
$array
= array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>

Результат выполнения данного примера:

array(1) {
  [1]=>
  string(1) "d"
}

Так как все ключи в вышеприведённом примере преобразуются к 1,
значение будет перезаписано на каждый новый элемент и останется только последнее
присвоенное значение "d".

Массивы в PHP могут содержать ключи типов int и string
одновременно, так как PHP не делает различия между индексированными и ассоциативными
массивами.

Пример #3 Смешанные ключи типов int и string


<?php
$array
= array(
"foo" => "bar",
"bar" => "foo",
100 => -100,
-
100 => 100,
);
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

Параметр key является необязательным. Если он не указан,
PHP будет использовать предыдущее наибольшее значение ключа типа
int, увеличенное на 1.

Пример #4 Индексированные массивы без ключа


<?php
$array
= array("foo", "bar", "hallo", "world");
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hallo"
  [3]=>
  string(5) "world"
}

Возможно указать ключ только для некоторых элементов и пропустить для других:

Пример #5 Ключи для некоторых элементов


<?php
$array
= array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

Как вы видите последнее значение "d" было присвоено ключу
7. Это произошло потому, что самое большое значение ключа целого
типа перед этим было 6.

Пример #6 Расширенный пример преобразования типов и перезаписи элементов


<?php
$array
= array(
1 => 'a',
'1' => 'b', // значение "b" перезапишет значение "a"
1.5 => 'c', // значение "c" перезапишет значение "b"
-1 => 'd',
'01' => 'e', // поскольку это не целочисленная строка, она НЕ перезапишет ключ для 1
'1.5' => 'f', // поскольку это не целочисленная строка, она НЕ перезапишет ключ для 1
true => 'g', // значение "g" перезапишет значение "c"
false => 'h',
'' => 'i',
null => 'j', // значение "j" перезапишет значение "i"
'k', // значение "k" присваивается ключу 2. Потому что самый большой целочисленный ключ до этого был 1
2 => 'l', // значение "l" перезапишет значение "k"
);var_dump($array);
?>

Результат выполнения данного примера:

array(7) {
  [1]=>
  string(1) "g"
  [-1]=>
  string(1) "d"
  ["01"]=>
  string(1) "e"
  ["1.5"]=>
  string(1) "f"
  [0]=>
  string(1) "h"
  [""]=>
  string(1) "j"
  [2]=>
  string(1) "l"
}

Этот пример включает все вариации преобразования ключей и перезаписи элементов

Доступ к элементам массива с помощью квадратных скобок

Доступ к элементам массива может быть осуществлён с помощью синтаксиса array[key].

Пример #7 Доступ к элементам массива


<?php
$array
= array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

Результат выполнения данного примера:

string(3) "bar"
int(24)
string(3) "foo"

Замечание:

До PHP 8.0.0 квадратные и фигурные скобки могли использоваться взаимозаменяемо для доступа
к элементам массива (например, в примере выше $array[42] и $array{42}
делали то же самое).
Синтаксис фигурных скобок устарел в PHP 7.4.0
и больше не поддерживается в PHP 8.0.0.

Пример #8 Разыменование массива


<?php
function getArray() {
return array(
1, 2, 3);
}
$secondElement = getArray()[1];
?>

Замечание:

Попытка доступа к неопределённому ключу в массиве — это то же самое,
что и попытка доступа к любой другой неопределённой переменной:
будет сгенерирована ошибка уровня E_WARNING
(ошибка уровня E_NOTICE до PHP 8.0.0),
и результат будет null.

Замечание:

Массив, разыменовывающий скалярное значение, которое не является строкой
(string), отдаст null. До PHP 7.4.0 не выдаётся сообщение об ошибке.
Начиная с PHP 7.4.0, выдаётся ошибка E_NOTICE;
с PHP 8.0.0 выдаётся ошибка E_WARNING.

Создание/модификация с помощью синтаксиса квадратных скобок

Существующий массив может быть изменён путём явной установкой значений в нем.

Это выполняется присвоением значений массиву (array) с указанием в
скобках ключа. Кроме того, ключ можно опустить, в результате получится пустая пара скобок ([]).

    $arr[key] = value;
    $arr[] = value;
    // key может быть int или string
    // value может быть любым значением любого типа

Если массив $arr ещё не существует или для него
задано значение null или false, он будет создан.
Таким образом, это ещё один способ определить массив array. Однако такой
способ применять не рекомендуется, так как если переменная $arr
уже содержит некоторое значение (например, значение типа string из
переменной запроса), то это значение останется на месте и [] может на
самом деле означать доступ к символу в
строке. Лучше инициализировать переменную путём явного присваивания значения.

Замечание:

Начиная с PHP 7.1.0, используя в оператор «пустой индекс» на строке, приведёт к
фатальной ошибке. Ранее, в этом случае, строка молча преобразовывалась в массив.

Замечание:

Начиная с PHP 8.1.0, создание нового массива с помощью значения false устарело.
Создание нового массива из null и неопределённого значения по-прежнему разрешено.

Для изменения определённого значения просто присвойте новое значение элементу,
используя его ключ. Если вы хотите удалить пару ключ/значение, вам необходимо
использовать функцию unset().


<?php
$arr
= array(5 => 1, 12 => 2);$arr[] = 56; // В этом месте скрипта это
// то же самое, что и $arr[13] = 56;
$arr["x"] = 42; // Это добавляет к массиву новый
// элемент с ключом "x"
unset($arr[5]); // Это удаляет элемент из массиваunset($arr); // Это удаляет массив полностью
?>

Замечание:

Как уже говорилось выше, если ключ не был указан, то будет взят максимальный из
существующих целочисленных (int) индексов, и новым ключом будет
это максимальное значение (в крайнем случае 0) плюс 1. Если целочисленных (int) индексов
ещё нет, то ключом будет 0 (ноль).

Учтите, что максимальное целое значение ключа не обязательно
существует в массиве в данный момент
. Оно могло просто существовать
в массиве какое-то время, с тех пор как он был переиндексирован в последний раз.
Следующий пример это иллюстрирует:


<?php
// Создаём простой массив.
$array = array(1, 2, 3, 4, 5);
print_r($array);// Теперь удаляем каждый элемент, но сам массив оставляем нетронутым:
foreach ($array as $i => $value) {
unset(
$array[$i]);
}
print_r($array);// Добавляем элемент (обратите внимание, что новым ключом будет 5, вместо 0).
$array[] = 6;
print_r($array);// Переиндексация:
$array = array_values($array);
$array[] = 7;
print_r($array);
?>

Результат выполнения данного примера:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

Деструктуризация массива

Массивы могут быть деструктурированы с помощью языковых конструкций [] (начиная с PHP 7.1.0)
или list(). Эти конструкции могут быть использованы для деструктуризации массива на отдельные переменные.


<?php
$source_array
= ['foo', 'bar', 'baz'];
[
$foo, $bar, $baz] = $source_array;
echo
$foo; // выведет "foo"
echo $bar; // выведет "bar"
echo $baz; // выведет "baz"
?>

Деструктуризация массива может быть использована в конструкции foreach
для деструктуризации многомерного массива во время итерации по нему.


<?php
$source_array
= [
[
1, 'John'],
[
2, 'Jane'],
];
foreach (
$source_array as [$id, $name]) {
// логика работы с $id и $name
}
?>

Элементы массива будут игнорироваться, если переменная не указана.
Деструктуризация массива всегда начинается с индекса 0.


<?php
$source_array
= ['foo', 'bar', 'baz'];// Присваивание элементу с индексом 2 переменной $baz
[, , $baz] = $source_array;

echo

$baz; // выведет "baz"
?>

Начиная с PHP 7.1.0, ассоциативные массивы также могут быть деструктурированы.
Это позволяет легче выбирать нужный элемент в массивах с числовым индексом,
так как индекс может быть указан явно.


<?php
$source_array
= ['foo' => 1, 'bar' => 2, 'baz' => 3];// Присваивание элементу с индексом 'baz' переменной $three
['baz' => $three] = $source_array;

echo

$three; // выведет 3$source_array = ['foo', 'bar', 'baz'];// Присваивание элементу с индексом 2 переменной $baz
[2 => $baz] = $source_array;

echo

$baz; // выведет "baz"
?>

Деструктуризация массива может быть использована для простой замены двух переменных местами.


<?php
$a
= 1;
$b = 2;
[
$b, $a] = [$a, $b];
echo
$a; // выведет 2
echo $b; // выведет 1
?>

Замечание:

Оператор ... не поддерживается в присваиваниях.

Замечание:

Попытка получить доступ к ключу массива, который не был определён,
аналогична обращению к любой другой неопределённой переменной:
будет выдано сообщение об ошибке уровня E_WARNING
(ошибка уровня E_NOTICE до PHP 8.0.0),
а результатом будет null.

Полезные функции

Для работы с массивами существует достаточное количество полезных
функций. Смотрите раздел функции для работы
с массивами.

Замечание:

Функция unset() позволяет удалять ключи массива.
Обратите внимание, что массив НЕ
будет переиндексирован. Если вы действительно хотите поведения в стиле
«удалить и сдвинуть», можно переиндексировать массив
используя array_values().


<?php
$a
= array(1 => 'один', 2 => 'два', 3 => 'три');
unset(
$a[2]);
/* даст массив, представленный так:
$a = array(1 => 'один', 3 => 'три');
а НЕ так:
$a = array(1 => 'один', 2 => 'три');
*/
$b = array_values($a);
// Теперь $b это array(0 => 'один', 1 => 'три')
?>

Управляющая конструкция foreach существует специально для массивов.
Она предоставляет возможность легко пройтись по массиву.

Что можно и нельзя делать с массивами

Почему $foo[bar] неверно?

Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива.
К примеру, пишите $foo['bar'], а не
$foo[bar]. Но почему? Часто в старых скриптах можно встретить
следующий синтаксис:


<?php
$foo
[bar] = 'враг';
echo
$foo[bar];
// и т.д.
?>

Это неверно, хотя и работает. Причина в том, что этот код содержит неопределённую
константу (bar), а не строку ('bar' — обратите внимание
на кавычки). Это работает, потому что PHP автоматически преобразует
«голую строку» (не заключённую в кавычки строку,
которая не соответствует ни одному из известных символов языка) в строку
со значением этой «голой строки». Например, если константа с именем bar
не определена, то PHP заменит bar на
строку 'bar' и использует её.

Внимание

Резервный вариант для обработки неопределённой константы как пустой строки вызывает ошибку уровня E_NOTICE.
Начиная с PHP 7.2.0 поведение объявлено устаревшим и вызывает ошибку уровня E_WARNING.
Начиная с PHP 8.0.0, удалено и выбрасывает исключение Error.

Замечание:

Это не означает, что нужно всегда заключать
ключ в кавычки. Нет необходимости заключать в кавычки константы или переменные, поскольку это
помешает PHP обрабатывать их.


<?php
error_reporting
(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Простой массив:
$array = array(1, 2);
$count = count($array);
for (
$i = 0; $i < $count; $i++) {
echo
"nПроверяем $i: n";
echo
"Плохо: " . $array['$i'] . "n";
echo
"Хорошо: " . $array[$i] . "n";
echo
"Плохо: {$array['$i']}n";
echo
"Хорошо: {$array[$i]}n";
}
?>

Результат выполнения данного примера:

Проверяем 0:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Плохо:
Хорошо: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Плохо:
Хорошо: 1

Проверяем 1:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Плохо:
Хорошо: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Плохо:
Хорошо: 2

Дополнительные примеры, демонстрирующие этот факт:


<?php
// Показываем все ошибки
error_reporting(E_ALL);$arr = array('fruit' => 'apple', 'veggie' => 'carrot');// Верно
print $arr['fruit']; // apple
print $arr['veggie']; // carrot

// Неверно. Это работает, но из-за неопределённой константы с
// именем fruit также вызывает ошибку PHP уровня E_NOTICE
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...

print $arr[fruit]; // apple

// Давайте определим константу, чтобы продемонстрировать, что
// происходит. Мы присвоим константе с именем fruit значение 'veggie'.

define('fruit', 'veggie');// Теперь обратите внимание на разницу
print $arr['fruit']; // apple
print $arr[fruit]; // carrot

// Внутри строки это нормально. Внутри строк константы не
// рассматриваются, так что ошибки E_NOTICE здесь не произойдёт

print "Hello $arr[fruit]"; // Hello apple

// С одним исключением: фигурные скобки вокруг массивов внутри
// строк позволяют константам там находиться

print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple

// Это не будет работать и вызовет ошибку обработки, такую как:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Это, конечно, также действует и с суперглобальными переменными в строках

print "Hello $arr['fruit']";
print
"Hello $_GET['foo']";// Ещё одна возможность - конкатенация
print "Hello " . $arr['fruit']; // Hello apple
?>

Если вы переведёте error_reporting
в режим отображения ошибок уровня
E_NOTICE (например, такой как
E_ALL), вы сразу увидите эти ошибки. По
умолчанию
error_reporting установлена их не отображать.

Как указано в разделе синтаксис,
внутри квадратных скобок (‘[
и ‘]‘) должно быть выражение. Это означает, что можно писать вот так:


<?php
echo $arr[somefunc($bar)];
?>

Это пример использования возвращаемого функцией значения
в качестве индекса массива. PHP известны также и константы:


<?php
$error_descriptions
[E_ERROR] = "Произошла фатальная ошибка";
$error_descriptions[E_WARNING] = "PHP сообщает о предупреждении";
$error_descriptions[E_NOTICE] = "Это лишь неофициальное замечание";
?>

Обратите внимание, что E_ERROR — это такой же
верный идентификатор, как и bar в первом примере.
Но последний пример по сути эквивалентен такой записи:


<?php
$error_descriptions
[1] = "Произошла фатальная ошибка";
$error_descriptions[2] = "PHP сообщает о предупреждении";
$error_descriptions[8] = "Это лишь неофициальное замечание";
?>

поскольку E_ERROR соответствует 1 и т.д.

Так что же в этом плохого?

Когда-нибудь в будущем команда разработчиков PHP возможно пожелает
добавить ещё одну константу или ключевое слово, либо константа из
другого кода может вмешаться и тогда у вас могут
возникнуть проблемы. Например, вы уже не можете использовать таким
образом слова empty и
default, поскольку они являются
зарезервированными ключевыми словами.

Замечание:

Повторим, внутри строки (string), заключённой
в двойные кавычки, корректно не окружать индексы
массива кавычками, поэтому "$foo[bar]"
является верной записью. Более подробно почему — смотрите
вышеприведённые примеры, а также раздел по
обработке
переменных в строках.

Преобразование в массив

Для любого из типов int, float,
string, bool и resource,
преобразование значения в массив даёт результатом массив с
одним элементом (с индексом 0), являющимся скалярным значением, с
которого вы начали. Другими словами, (array)$scalarValue
— это точно то же самое, что и array($scalarValue).

Если вы преобразуете в массив объект (object), вы
получите в качестве элементов массива свойства (переменные-члены)
этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными
исключениями: целочисленные свойства станут недоступны;
к закрытым полям класса (private) спереди будет дописано имя класса;
к защищённым полям класса (protected) спереди будет добавлен символ ‘*’.
Эти добавленные значения с обоих сторон также имеют NUL байты.
Неинициализированные типизированные свойства
автоматически отбрасываются.


<?php
class A {
private
$B;
protected
$C;
public
$D;
function
__construct()
{
$this->{1} = null;
}
}
var_export((array) new A());
?>

Результат выполнения данного примера:

array (
  '' . "" . 'A' . "" . 'B' => NULL,
  '' . "" . '*' . "" . 'C' => NULL,
  'D' => NULL,
  1 => NULL,
)

Это может вызвать несколько неожиданное поведение:


<?php
class A {
private
$A; // Это станет 'AA'
}
class
B extends A {
private
$A; // Это станет 'BA'
public $AA; // Это станет 'AA'
}
var_dump((array) new B());
?>

Результат выполнения данного примера:

array(3) {
  ["BA"]=>
  NULL
  ["AA"]=>
  NULL
  ["AA"]=>
  NULL
}

Вышеприведённый код покажет 2 ключа с именем ‘AA’, хотя один из них на самом деле
имеет имя ‘AA’.

Если вы преобразуете в массив значение null, вы получите
пустой массив.

Распаковка массива

Массив с префиксом ... будет распакован во время определения массива.
Только массивы и объекты, которые реализуют интерфейс Traversable, могут быть распакованы.
Распаковка массива с помощью ... доступна, начиная с PHP 7.4.0.

Массив можно распаковывать несколько раз и добавлять обычные элементы до или после оператора ...:

Пример #9 Простая распаковка массива


<?php
// Использование короткого синтаксиса массива.
// Также работает с синтаксисом array().
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; // [1, 2, 3]
$arr3 = [0, ...$arr1]; // [0, 1, 2, 3]
$arr4 = [...$arr1, ...$arr2, 111]; // [1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; // [1, 2, 3, 1, 2, 3]
function getArr() {
return [
'a', 'b'];
}
$arr6 = [...getArr(), 'c' => 'd']; // ['a', 'b', 'c' => 'd']
?>

Распаковка массива с помощью оператора ... следует семантике функции array_merge().
То есть более поздние строковые ключи перезаписывают более ранние, а целочисленные ключи перенумеровываются:

Пример #10 Распаковка массива с дублирующим ключом


<?php
// строковый ключ
$arr1 = ["a" => 1];
$arr2 = ["a" => 2];
$arr3 = ["a" => 0, ...$arr1, ...$arr2];
var_dump($arr3); // ["a" => 2]
// целочисленный ключ
$arr4 = [1, 2, 3];
$arr5 = [4, 5, 6];
$arr6 = [...$arr4, ...$arr5];
var_dump($arr6); // [1, 2, 3, 4, 5, 6]
// Который [0 => 1, 1 => 2, 2 => 3, 3 => 4, 4 => 5, 5 => 6]
// где исходные целочисленные ключи не были сохранены.
?>

Замечание:

Ключи, которые не являются ни целыми числами, ни строками, вызывают ошибку TypeError.
Такие ключи могут быть сгенерированы только объектом Traversable.

Замечание:

До PHP 8.1 распаковка массива со строковым ключом не поддерживалась:


<?php
$arr1
= [1, 2, 3];
$arr2 = ['a' => 4];
$arr3 = [...$arr1, ...$arr2];
// Ошибка: невозможно распаковать массив со строковыми ключами в example.php:5
$arr4 = [1, 2, 3];
$arr5 = [4, 5];
$arr6 = [...$arr4, ...$arr5]; // работает. [1, 2, 3, 4, 5]
?>

Примеры

Тип массив в PHP является очень гибким, вот несколько примеров:


<?php
// это
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // ключом будет 0
);$b = array('a', 'b', 'c');// . . .полностью соответствует
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // ключом будет 0$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';// после выполнения этого кода, $a будет массивом
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round',
// 'name' => 'apple', 0 => 4), а $b будет
// array(0 => 'a', 1 => 'b', 2 => 'c'), или просто array('a', 'b', 'c').
?>

Пример #11 Использование array()


<?php
// Массив как карта (свойств)
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);// исключительно числовые ключи
$array = array( 7,
8,
0,
156,
-
10
);
// это то же самое, что и array(0 => 7, 1 => 8, ...)$switching = array( 10, // ключ = 0
5 => 6,
3 => 7,
'a' => 4,
11, // ключ = 6 (максимальным числовым индексом было 5)
'8' => 2, // ключ = 8 (число!)
'02' => 77, // ключ = '02'
0 => 12 // значение 10 будет перезаписано на 12
);// пустой массив
$empty = array();
?>

Пример #12 Коллекция


<?php
$colors
= array('red', 'blue', 'green', 'yellow');

foreach (

$colors as $color) {
echo
"Вам нравится $color?n";
}
?>

Результат выполнения данного примера:

Вам нравится red?
Вам нравится blue?
Вам нравится green?
Вам нравится yellow?

Изменение значений массива напрямую возможно
путём передачи их по ссылке.

Пример #13 Изменение элемента в цикле


<?php
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset(
$color); /* это нужно для того, чтобы последующие записи в
$color не меняли последний элемент массива */
print_r($colors);
?>

Результат выполнения данного примера:

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

Следующий пример создаёт массив, начинающийся с единицы.

Пример #14 Индекс, начинающийся с единицы


<?php
$firstquarter
= array(1 => 'Январь', 'Февраль', 'Март');
print_r($firstquarter);
?>

Результат выполнения данного примера:

Array
(
    [1] => 'Январь'
    [2] => 'Февраль'
    [3] => 'Март'
)

Пример #15 Заполнение массива


<?php
// заполняем массив всеми элементами из директории
$handle = opendir('.');
while (
false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>

Массивы упорядочены. Вы можете изменять порядок элементов,
используя различные функции сортировки. Для дополнительной
информации смотрите раздел функции
для работы с массивами. Вы можете подсчитать количество
элементов в массиве с помощью функции count().

Пример #16 Сортировка массива


<?php
sort
($files);
print_r($files);
?>

Поскольку значение массива может быть чем угодно, им также
может быть другой массив. Таким образом вы можете создавать
рекурсивные и многомерные массивы.

Пример #17 Рекурсивные и многомерные массивы


<?php
$fruits
= array ( "fruits" => array ( "a" => "апельсин",
"b" => "банан",
"c" => "яблоко"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "первая",
5 => "вторая",
"третья"
)
);
// Несколько примеров доступа к значениям предыдущего массива
echo $fruits["holes"][5]; // напечатает "вторая"
echo $fruits["fruits"]["a"]; // напечатает "апельсин"
unset($fruits["holes"][0]); // удалит "первая"

// Создаст новый многомерный массив

$juices["apple"]["green"] = "good";
?>

Обратите внимание, что при присваивании массива всегда
происходит копирование значения. Чтобы скопировать массив по
ссылке, вам нужно использовать оператор ссылки.


<?php
$arr1
= array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 изменился,
// $arr1 всё ещё array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4; // теперь $arr1 и $arr3 одинаковы
?>

thomas tulinsky

7 years ago


I think your first, main example is needlessly confusing, very confusing to newbies:

$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

It should be removed.

For newbies:
An array index can be any string value, even a value that is also a value in the array.
The value of array["foo"] is "bar".
The value of array["bar"] is "foo"

The following expressions are both true:
$array["foo"] == "bar"
$array["bar"] == "foo"


ken underscore yap atsign email dot com

15 years ago


"If you convert a NULL value to an array, you get an empty array."

This turns out to be a useful property. Say you have a search function that returns an array of values on success or NULL if nothing found.

<?php $values = search(...); ?>



Now you want to merge the array with another array. What do we do if $values is NULL? No problem:

<?php $combined = array_merge((array)$values, $other); ?>



Voila.


liberchen at gmail dot com

5 years ago


Since PHP 7.1, the string will not be converted to array automatically.

Below codes will fail:

$a=array();
$a['a']='';
$a['a']['b']=''; 
//Warning: Illegal string offset 'b'
//Warning: Cannot assign an empty string to a string offset

You have to change to as below:

$a=array();

$a['a']=array(); // Declare it is an array first
$a['a']['b']='';


Yesterday php'er

6 years ago


--- quote ---
Note:
Both square brackets and curly braces can be used interchangeably for accessing array elements
--- quote end ---

At least for php 5.4 and 5.6; if function returns an array, the curly brackets does not work directly accessing function result, eg. WillReturnArray(){1} . This will give "syntax error, unexpected '{' in...".
Personally I use only square brackets, expect for accessing single char in string. Old habits...


jeff splat codedread splot com

18 years ago


Beware that if you're using strings as indices in the $_POST array, that periods are transformed into underscores:

<html>
<body>
<?php
    printf
("POST: "); print_r($_POST); printf("<br/>");
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="Windows3.1" value="Sux">
    <input type="submit" value="Click" />
</form>
</body>
</html>

Once you click on the button, the page displays the following:

POST: Array ( [Windows3_1] => Sux )


chris at ocportal dot com

9 years ago


Note that array value buckets are reference-safe, even through serialization.

<?php

$x
='initial';

$test=array('A'=>&$x,'B'=>&$x);

$test=unserialize(serialize($test));

$test['A']='changed';

echo
$test['B']; // Outputs "changed"

?>



This can be useful in some cases, for example saving RAM within complex structures.


phplatino at gmail dot com

1 year ago


to know the depth (dimension) of a ARRAY, you can use this:

function Dim_Ar($A, $i){
    if(!is_array($A))return 0;
    $t[] = 1;
    foreach($A AS $e)if(is_array($e))$t[] = Dim_Ar($e, ++ $i) + 1;
    return max($t);
    }

and use with:

$Q = ARRAY(ARRAY(ARRAY()), ARRAY(ARRAY()));// here depth/dimension is three

echo Dim_Ar($Q, 0);


ia [AT] zoznam [DOT] sk

17 years ago


Regarding the previous comment, beware of the fact that reference to the last value of the array remains stored in $value after the foreach:

<?php
foreach ( $arr as $key => &$value )
{
   
$value = 1;
}
// without next line you can get bad results...
//unset( $value );
$value = 159;
?>

Now the last element of $arr has the value of '159'. If we remove the comment in the unset() line, everything works as expected ($arr has all values of '1').

Bad results can also appear in nested foreach loops (the same reason as above).

So either unset $value after each foreach or better use the longer form:

<?php
foreach ( $arr as $key => $value )
{
   
$arr[ $key ] = 1;
}
?>


anisgazig at gmail dot com

4 years ago


//array keys are always integer and string data type and array values are all data type
//type casting and overwriting(data type of array key)
//----------------------------------------------------
$arr = array(
1=>"a",//int(1)
"3"=>"b",//int(3)
"08"=>"c",//string(2)"08"
"80"=>"d",//int(80)
"0"=>"e",//int(0)
"Hellow"=>"f",//string(6)"Hellow"
"10Hellow"=>"h",//string(8)"10Hellow"
1.5=>"j",//int(1.5)
"1.5"=>"k",//string(3)"1.5"
0.0=>"l",//int(0)
false=>"m",//int(false)
true=>"n",//int(true)
"true"=>"o",//string(4)"true"
"false"=>"p",//string(5)"false"
null=>"q",//string(0)""
NULL=>"r",//string(0)"" note null and NULL are same
"NULL"=>"s",//string(4)"NULL" ,,,In last element of multiline array,comma is better to used.
);
//check the data type name of key
foreach ($arr as $key => $value) {
var_dump($key);
echo "<br>";
}

//NOte :array and object data type in keys are Illegal ofset.......


caifara aaaat im dooaat be

17 years ago


[Editor's note: You can achieve what you're looking for by referencing $single, rather than copying it by value in your foreach statement. See http://php.net/foreach for more details.]

Don't know if this is known or not, but it did eat some of my time and maybe it won't eat your time now...

I tried to add something to a multidimensional array, but that didn't work at first, look at the code below to see what I mean:

<?php

$a1

= array( "a" => 0, "b" => 1 );

$a2 = array( "aa" => 00, "bb" => 11 );
$together = array( $a1, $a2 );

foreach(

$together as $single ) {

   
$single[ "c" ] = 3 ;

}
print_r( $together );

/* nothing changed result is:

Array

(

    [0] => Array

        (

            [a] => 0

            [b] => 1

        )

    [1] => Array

        (

            [aa] => 0

            [bb] => 11

        )

) */
foreach( $together as $key => $value ) {

   
$together[$key]["c"] = 3 ;

}
print_r( $together );
/* now it works, this prints

Array

(

    [0] => Array

        (

            [a] => 0

            [b] => 1

            [c] => 3

        )

    [1] => Array

        (

            [aa] => 0

            [bb] => 11

            [c] => 3

        )

)

*/
?>


dylanfj700 at gmail dot com

3 years ago


// Before php 5.4
$array = array(1,2,3);

// since php 5.4 , short syntax
$array = [1,2,3];

// I recommend using the short syntax if you have php version >= 5.4


lars-phpcomments at ukmix dot net

18 years ago


Used to creating arrays like this in Perl?

@array = ("All", "A".."Z");

Looks like we need the range() function in PHP:

<?php
$array
= array_merge(array('All'), range('A', 'Z'));
?>

You don't need to array_merge if it's just one range:

<?php
$array
= range('A', 'Z');
?>


note dot php dot lorriman at spamgourmet dot org

9 years ago


There is another kind of array (php>=  5.3.0) produced by

$array = new SplFixedArray(5);

Standard arrays, as documented here, are marvellously flexible and, due to the underlying hashtable, extremely fast for certain kinds of lookup operation.

Supposing a large string-keyed array

$arr=['string1'=>$data1, 'string2'=>$data2 etc....]

when getting the keyed data with

$data=$arr['string1'];

php does *not* have to search through the array comparing each key string to the given key ('string1') one by one, which could take a long time with a large array. Instead the hashtable means that php takes the given key string and computes from it the memory location of the keyed data, and then instantly retrieves the data. Marvellous! And so quick. And no need to know anything about hashtables as it's all hidden away.

However, there is a lot of overhead in that. It uses lots of memory, as hashtables tend to (also nearly doubling on a 64bit server), and should be significantly slower for integer keyed arrays than old-fashioned (non-hashtable) integer-keyed arrays. For that see more on SplFixedArray :

http://uk3.php.net/SplFixedArray

Unlike a standard php (hashtabled) array, if you lookup by integer then the integer itself denotes the memory location of the data, no hashtable computation on the integer key needed. This is much quicker. It's also quicker to build the array compared to the complex operations needed for hashtables. And it uses a lot less memory as there is no hashtable data structure. This is really an optimisation decision, but in some cases of large integer keyed arrays it may significantly reduce server memory and increase performance (including the avoiding of expensive memory deallocation of hashtable arrays at the exiting of the script).


ivail89 at mail dot ru

2 years ago


Function unset can delete array's element by reference only when you specify source array. See example:
<?php
$array
= [1, 2, 3, 4, 5];
foreach (
$array as $k => &$v){
    if (
$k >= 3){
        unset(
$v);
    }
}
echo
count($array); // 5
?>
In this case unset delete only reference, however original array didn't change.

Or different example:
<?php
$arr
= [1, 2];
$a = &$arr[0];
unset(
$a);
count($arr); // 2
?>

So for deleting element from first example need use key and array.
<?php
// ...
 
unset($array[$k]);
// ...
?>


Denise Ignatova

5 years ago


When creating arrays , if we have an element with the same value as another element from the same array, we would expect PHP instead of creating new zval container to increase the refcount and point the duplicate symbol to the same zval. This is true except for value type integer.
Example:

$arr = ['bebe' => 'Bob', 'age' => 23, 'too' => 23 ];
xdebug_debug_zval( 'arr' );

Output:
arr:

(refcount=2, is_ref=0)
array (size=3)
  'bebe' => (refcount=1, is_ref=0)string 'Bob' (length=3)
  'age' => (refcount=0, is_ref=0)int 23
  'too' => (refcount=0, is_ref=0)int 23

but :
$arr = ['bebe' => 'Bob', 'age' => 23, 'too' => '23' ];
xdebug_debug_zval( 'arr' );

will produce:
arr:

(refcount=2, is_ref=0)
array (size=3)
  'bebe' => (refcount=1, is_ref=0)string 'Bob' (length=3)
  'age' => (refcount=0, is_ref=0)int 23
  'too' => (refcount=1, is_ref=0)string '23' (length=2)
or :

$arr = ['bebe' => 'Bob', 'age' => [1,2], 'too' => [1,2] ];
xdebug_debug_zval( 'arr' );

Output:
arr:

(refcount=2, is_ref=0)
array (size=3)
  'bebe' => (refcount=1, is_ref=0)string 'Bob' (length=3)
  'age' => (refcount=2, is_ref=0)
    array (size=2)
      0 => (refcount=0, is_ref=0)int 1
      1 => (refcount=0, is_ref=0)int 2
  'too' => (refcount=2, is_ref=0)
    array (size=2)
      0 => (refcount=0, is_ref=0)int 1
      1 => (refcount=0, is_ref=0)int 2


tissus

5 years ago


In array(key=>value) construct key is also an expression.
This works fine:
  $a = array(
    1     =>0,
    1+1   =>1,
    $k    =>2,
    $x.'4'=>3
  );

Walter Tross

12 years ago


It is true that "array assignment always involves value copying", but the copy is a "lazy copy". This means that the data of the two variables occupy the same memory as long as no array element changes.

E.g., if you have to pass an array to a function that only needs to read it, there is no advantage at all in passing it by reference.


Anonymous

3 years ago


Wrappers for (array), returns array with normalize keys (without prefix):
<?php
function to_array_recursive($value): array
{
        if (!
is_object($value)) {
                return (array)
$value;
        }
       
$class = get_class($value);
       
$arr = [];
       
foreact ((array)  $value as $key => $val) {
               
$key = str_replace(["*", "{$class}"], '', $key);
               
$arr[$key] = is_object($val) ? to_array_recursive($val) : $val;
        }
        return
$arr;
}

function

to_array($value): array
{
       
$arr = (array) $value;
        if (!
is_object($value)) {
                return
$arr;
        }
       
$class = get_class($value);
       
$keys = str_replace(["*", "{$class}"], '', array_keys($arr));
        return
array_combine($keys, $arr);
}
?>
Demo:
<?php
class Test
{
        protected
$var = 1;
        protected
$var2;
        private
$TestVar = 3;

            public function

__construct($isParent = true)
    {
        if (
$isParent) {
           
$this->var2 = new self(! $isParent);
        }
    }
}
$obj = new Test();
var_dump((array) $obj, to_array_recursive($obj));
?>

ivegner at yandex dot ru

9 years ago


Note that objects of classes extending ArrayObject SPL class are treated as arrays, and not as objects when converting to array.

<?php
class ArrayObjectExtended extends ArrayObject
{
    private
$private = 'private';
    public
$hello = 'world';
}
$object = new ArrayObjectExtended();
$array = (array) $object;// This will not expose $private and $hello properties of $object,
// but return an empty array instead.
var_export($array);
?>


magraden86 at gmail dot com

5 months ago


"Additionally the following key casts will occur: Floats are also cast to ints, which means that the fractional part will be truncated."

PHP 8.1 will show the following warning: "Deprecated: Implicit conversion from float ... to int loses precision in ..."


Вернуться к: Типы

На самом деле массив в PHP — это упорядоченное отображение, которое
устанавливает соответствие между значением и
ключом. Этот тип оптимизирован в нескольких
направлениях, поэтому вы можете использовать его как собственно
массив, список (вектор), хэш-таблицу (являющуюся реализацией карты),
словарь, коллекцию, стек, очередь и, возможно, что-то еще.
Так как значением массива может быть другой массив PHP, можно также создавать
деревья и многомерные массивы.

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

Синтаксис

Определение при помощи array()

Массив (тип array) может быть создан языковой конструкцией array().
language construct. В качестве параметров она принимает любое количество разделенных запятыми пар
key => value
(ключ => значение).

array(
    key  => value,
    key2 => value2,
    key3 => value3,
    ...
)

Запятая после последнего элемента массива необязательна и может быть опущена.
Обычно это делается для однострочных массивов, т.е. array(1, 2)
предпочтительней array(1, 2, ). Для многострочных массивов
с другой стороны обычно используется завершающая запятая, так как позволяет легче добавлять
новые элементы в конец массива.

Начиная с PHP 5.4 возможно использовать короткий синтаксис определения массивов, который заменяет языковую конструкцию
array() на [].

Пример #1 Простой массив


<?php
$array 
= array(
    
"foo" => "bar",
    
"bar" => "foo",
);
// Начиная с PHP 5.4
$array = [
    
"foo" => "bar",
    
"bar" => "foo",
];
?>

key может быть либо типа integer,
либо типа string. value может быть
любого типа.

Дополнительно с ключом key будут сделаны следующие преобразования:


  • Строки, содержащие целое число будут преобразованы к
    типу integer. Например, ключ со значением «8» будет в действительности
    сохранен со значением 8. С другой стороны, значение «08» не будет
    преобразовано, так как оно не является корректным десятичным целым.

  • Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, т.е.
    дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности
    сохранен со значением 8.

  • Тип bool также преобразовываются к типу integer. Например, ключ со значением
    true будет сохранен со значением 1
    и ключ со значением false будет сохранен со значением 0.

  • Тип null будет преобразован к пустой строке. Например, ключ со значением
    null будет в действительности сохранен со значением «».

  • Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей.
    При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).

Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний
будет использоваться, а все другие будут перезаписаны.

Пример #2 Пример преобразования типов и перезаписи элементов


<?php
$array 
= array(
    
1    => "a",
    
"1"  => "b",
    
1.5  => "c",
    
true => "d",
);
var_dump($array);
?>

Результат выполнения данного примера:

array(1) {
  [1]=>
  string(1) "d"
}

Так как все ключи в вышеприведенном примере преобразуются к 1, значение будет перезаписано
на каждый новый элемент и останется только последнее присвоенное значение «d».

Массивы в PHP могут содержать ключи типов integer и string одновременно,
так как PHP не делает различия между индексированными и ассоциативными массивами.

Пример #3 Смешанные ключи типов integer и string


<?php
$array 
= array(
    
"foo" => "bar",
    
"bar" => "foo",
    
100   => -100,
    -
100  => 100,
);
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  ["foo"]=>
  string(3) "bar"
  ["bar"]=>
  string(3) "foo"
  [100]=>
  int(-100)
  [-100]=>
  int(100)
}

Параметр key является необязательным. Если он не указан, PHP будет
использовать предыдущее наибольшее значение ключа типа integer, увеличенное на 1.

Пример #4 Индексированные массивы без ключа


<?php
$array 
= array("foo""bar""hello""world");
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(5) "hello"
  [3]=>
  string(5) "world"
}

Возможно указать ключ только для некоторых элементов и пропустить для других:

Пример #5 Ключи для некоторых элементов


<?php
$array 
= array(
         
"a",
         
"b",
    
=> "c",
         
"d",
);
var_dump($array);
?>

Результат выполнения данного примера:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

Как вы видите последнее значение «d» было присвоено ключу
7. Это произошло потому, что самое большое значение ключа целого типа перед этим
было 6.

Доступ к элементам массива с помощью квадратных скобок

Доступ к элементам массива может быть осуществлен с помощью синтаксиса array[key].

Пример #6 Доступ к элементам массива


<?php
$array 
= array(
    
"foo" => "bar",
    
42    => 24,
    
"multi" => array(
         
"dimensional" => array(
             
"array" => "foo"
         
)
    )
);
var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);
?>

Результат выполнения данного примера:

string(3) "bar"
int(24)
string(3) "foo"

Замечание:

Для доступа к элементам массива могут использоваться как квадратные, так и
фигурные скобки (например, $array[42] и $array{42}
означают одно и то же в вышеприведенном примере).

С PHP 5.4 стало возможным прямое разыменование массива, возвращаемого в качестве результата вызова функции или метода.
Раньше приходилось использовать временные переменные.

С PHP 5.5 стало возможным прямое разыменование элементов у литерала массива.

Пример #7 Разыменование массива


<?php
function getArray() {
    return array(
123);
}
// в PHP 5.4
$secondElement getArray()[1];// ранее делали так
$tmp getArray();
$secondElement $tmp[1];// или так
list(, $secondElement) = getArray();
?>

Замечание:

Попытка доступа к неопределенному ключу в массиве — это то же самое,
что и попытка доступа к любой другой неопределенной переменной:
будет сгенерирована ошибка уровня E_NOTICE,
и результат будет NULL.

Создание/модификация с помощью синтаксиса квадратных скобок

Существующий массив может быть изменен явной установкой значений
в нем.

Это выполняется присвоением значений массиву array с указанием в скобках
ключа. Кроме того, вы можете опустить ключ. В этом случае добавьте к
имени переменной пустую пару скобок ([]).

    $arr[key] = value;
    $arr[] = value;
    // key может быть integer или string
    // value может быть любым значением любого типа

Если массив $arr еще не существует, он будет создан.
Таким образом, это еще один способ определить массив array. Однако такой способ
применять не рекомендуется, так как если переменная $arr уже содержит
некоторое значение (например, значение типа string из переменной запроса), то
это значение останется на месте и [] может на самом деле означать
доступ к символу в
строке. Лучше инициализировать переменную путем явного
присваивания значения.

Для изменения определенного
значения просто присвойте новое значение элементу, используя его ключ.
Если вы хотите удалить пару ключ/значение, вам необходимо
использовать функцию unset().


<?php
$arr 
= array(=> 112 => 2);$arr[] = 56;    // В этом месте скрипта это
                // то же самое, что и $arr[13] = 56;
$arr["x"] = 42// Это добавляет к массиву новый
                // элемент с ключом "x"
unset($arr[5]); // Это удаляет элемент из массиваunset($arr);    // Это удаляет массив полностью
?>

Замечание:

Как уже говорилось выше, если ключ не был указан, то будет взят максимальный из
существующих целочисленных (integer) индексов, и новым ключом будет
это максимальное значение (в крайнем случае 0) плюс 1. Если целочисленных индексов
еще нет, то ключом будет 0 (ноль).

Учтите, что максимальное целое значение ключа не обязательно
существует в массиве в данный момент
. Оно могло просто существовать
в массиве какое-то время, с тех пор как он был переиндексирован в последний раз.
Следующий пример это иллюстрирует:


<?php
// Создаем простой массив.
$array = array(12345);
print_r($array);// Теперь удаляем каждый элемент, но сам массив оставляем нетронутым:
foreach ($array as $i => $value) {
    unset(
$array[$i]);
}
print_r($array);// Добавляем элемент (обратите внимание, что новым ключом будет 5, вместо 0).
$array[] = 6;
print_r($array);// Переиндексация:
$array array_values($array);
$array[] = 7;
print_r($array);
?>

Результат выполнения данного примера:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

Полезные функции

Для работы с массивами существует достаточное количество полезных
функций. Смотрите раздел функции для работы
с массивами.

Замечание:

Функция unset() позволяет удалять ключи массива.
Обратите внимание, что массив НЕ
будет переиндексирован. Если вы действительно хотите поведения в стиле
«удалить и сдвинуть», можно переиндексировать массив
используя array_values().


<?php
$a 
= array(=> 'один'=> 'два'=> 'три');
unset(
$a[2]);
/* даст массив, представленный так:
   $a = array(1 => 'один', 3 => 'три');
   а НЕ так:
   $a = array(1 => 'один', 2 => 'три');
*/
$b array_values($a);
// Теперь $b это array(0 => 'один', 1 => 'три')
?>

Управляющая конструкция foreach существует специально для массивов.
Она предоставляет возможность легко пройтись по массиву.

Что можно и нельзя делать с массивами

Почему $foo[bar] неверно?

Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива.
К примеру, пишите $foo[‘bar’], а не
$foo[bar]. Но почему? Часто в старых скриптах можно встретить
следующий синтаксис:


<?php
$foo
[bar] = 'враг';
echo 
$foo[bar];
// и т.д.
?>

This is wrong, but it works. The reason is that this code has an undefined
constant (bar) rather than a string (‘bar’ — notice the
quotes). PHP may in the future define constants which, unfortunately for such
code, have the same name. It works because PHP automatically converts a
bare string (an unquoted string which does
not correspond to any known symbol) into a string which
contains the bare string. For instance, if there is no defined
constant named bar, then PHP will substitute in the
string ‘bar’ and use that.

Замечание:

Это не означает, что нужно всегда заключать
ключ в кавычки. Нет необходимости заключать в кавычки константы или переменные, поскольку это
помешает PHP обрабатывать их.


<?php
error_reporting
(E_ALL);
ini_set('display_errors'true);
ini_set('html_errors'false);
// Простой массив:
$array = array(12);
$count count($array);
for (
$i 0$i $count$i++) {
    echo 
"nПроверяем $i: n";
    echo 
"Плохо: " $array['$i'] . "n";
    echo 
"Хорошо: " $array[$i] . "n";
    echo 
"Плохо: {$array['$i']}n";
    echo 
"Хорошо: {$array[$i]}n";
}
?>

Результат выполнения данного примера:

Проверяем 0:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Плохо:
Хорошо: 1
Notice: Undefined index:  $i in /path/to/script.html on line 11
Плохо:
Хорошо: 1

Проверяем 1:
Notice: Undefined index:  $i in /path/to/script.html on line 9
Плохо:
Хорошо: 2
Notice: Undefined index:  $i in /path/to/script.html on line 11
Плохо:
Хорошо: 2

Дополнительные примеры, демонстрирующие этот факт:


<?php
// Показываем все ошибки
error_reporting(E_ALL);$arr = array('fruit' => 'apple''veggie' => 'carrot');// Верно
print $arr['fruit'];  // apple
print $arr['veggie']; // carrot

// Неверно. Это работает, но из-за неопределенной константы с
// именем fruit также вызывает ошибку PHP уровня E_NOTICE
// 
// Notice: Use of undefined constant fruit - assumed 'fruit' in...

print $arr[fruit];    // apple

// Давайте определим константу, чтобы продемонстрировать, что
// происходит. Мы присвоим константе с именем fruit значение 'veggie'.

define('fruit''veggie');// Теперь обратите внимание на разницу
print $arr['fruit'];  // apple
print $arr[fruit];    // carrot

// Внутри строки это нормально. Внутри строк константы не
// рассматриваются, так что ошибки E_NOTICE здесь не произойдет

print "Hello $arr[fruit]";      // Hello apple

// С одним исключением: фигурные скобки вокруг массивов внутри
// строк позволяют константам там находиться

print "Hello {$arr[fruit]}";    // Hello carrot
print "Hello {$arr['fruit']}";  // Hello apple

// Это не будет работать и вызовет ошибку обработки, такую как:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Это, конечно, также действует и с суперглобальными переменными в строках

print "Hello $arr['fruit']";
print 
"Hello $_GET['foo']";// Еще одна возможность - конкатенация
print "Hello " $arr['fruit']; // Hello apple
?>

Если вы переведете error_reporting
в режим отображения ошибок уровня
E_NOTICE (например, такой как
E_ALL), вы сразу увидите эти ошибки. По
умолчанию
error_reporting установлена их не отображать.

Как указано в разделе синтаксис,
внутри квадратных скобок (‘[
и ‘]‘) должно быть выражение. Это означает, что можно писать вот так:


<?php
echo $arr[somefunc($bar)];
?>

Это пример использования возвращаемого функцией значения
в качестве индекса массива. PHP известны также и константы:


<?php
$error_descriptions
[E_ERROR]   = "Произошла фатальная ошибка";
$error_descriptions[E_WARNING] = "PHP сообщает о предупреждении";
$error_descriptions[E_NOTICE]  = "Это лишь неофициальное замечание";
?>

Обратите внимание, что E_ERROR — это такой же
верный идентификатор, как и bar в первом примере.
Но последний пример по сути эквивалентен такой записи:


<?php
$error_descriptions
[1] = "Произошла фатальная ошибка";
$error_descriptions[2] = "PHP сообщает о предупреждении";
$error_descriptions[8] = "Это лишь неофициальное замечание";
?>

поскольку E_ERROR соответствует 1, и т.д.

Так что же в этом плохого?

Когда-нибудь в будущем, команда разработчиков PHP, возможно, пожелает
добавить еще одну константу или ключевое слово, либо константа из
другого кода может вмешаться и тогда у вас могут
возникнуть проблемы. Например, вы уже не можете использовать таким
образом слова empty и
default, поскольку они являются
зарезервированными ключевыми словами.

Замечание:

Повторим, внутри строки (string), заключенной
в двойные кавычки, корректно не окружать индексы
массива кавычками, поэтому «$foo[bar]»
является верной записью. Более подробно почему — смотрите
вышеприведенные примеры, а также раздел
обработка
переменных в строках.

Преобразование в массив

Для любого из типов: integer, float,
string, boolean и resource,
преобразование значения в массив дает результатом массив с
одним элементом (с индексом 0), являющимся скалярным значением, с
которого вы начали. Другими словами, (array)$scalarValue
— это точно то же самое, что и array($scalarValue).

Если вы преобразуете в массив объект (object), вы
получите в качестве элементов массива свойства (переменные-члены)
этого объекта. Ключами будут имена переменных-членов, с некоторыми примечательными
исключениями: целочисленные свойства станут недоступны;
к закрытым полям класса (private) спереди будет дописано имя класса;
к защищенным полям класса (protected) спереди будет добавлен символ ‘*’.
Эти добавленные значения с обоих сторон также имеют нулевые байты.
Это может вызвать несколько неожиданное поведение:


<?phpclass {
    private 
$A// Это станет 'AA'
}

class 

extends {
    private 
$A// Это станет 'BA'
    
public $AA// Это станет 'AA'
}var_dump((array) new B());
?>

Вышеприведенный код покажет 2 ключа с именем ‘AA’, хотя один из них на самом деле
имеет имя ‘AA’.

Если вы преобразуете в массив значение NULL, вы получите
пустой массив.

Примеры

The array type in PHP is very versatile. Here are some examples:
Тип массив в PHP является очень гибким, вот несколько примеров:


<?php
// это
$a = array( 'color' => 'red',
            
'taste' => 'sweet',
            
'shape' => 'round',
            
'name'  => 'apple',
            
4        // ключом будет 0
          
);$b = array('a''b''c');// . . .полностью соответствует
$a = array();
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name']  = 'apple';
$a[]        = 4;        // ключом будет 0$b = array();
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';// после выполнения этого кода, $a будет массивом
// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', 
// 'name' => 'apple', 0 => 4), а $b будет
// array(0 => 'a', 1 => 'b', 2 => 'c'), или просто array('a', 'b', 'c').
?>

Пример #8 Использование array()


<?php
// Массив как карта (свойств)
$map = array( 'version'    => 4,
              
'OS'         => 'Linux',
              
'lang'       => 'english',
              
'short_tags' => true
            
);// исключительно числовые ключи
$array = array( 7,
                
8,
                
0,
                
156,
                -
10
              
);
// это то же самое, что и array(0 => 7, 1 => 8, ...)$switching = array(         10// ключ = 0
                    
5    =>  6,
                    
3    =>  7
                    
'a'  =>  4,
                            
11// ключ = 6 (максимальным числовым индексом было 5)
                    
'8'  =>  2// ключ = 8 (число!)
                    
'02' => 77// ключ = '02'
                    
0    => 12  // значение 10 будет перезаписано на 12
                  
);// пустой массив
$empty = array();         
?>

Пример #9 Коллекция


<?php
$colors 
= array('red''blue''green''yellow');

foreach (

$colors as $color) {
    echo 
"Вам нравится $color?n";
}
?>

Результат выполнения данного примера:

Вам нравится red?
Вам нравится blue?
Вам нравится green?
Вам нравится yellow?

Изменение значений массива напрямую стало возможным с версии PHP 5 путем
передачи их по ссылке. До этого необходим следующий обходной прием:

Пример #10 Изменение элемента в цикле


<?php
// PHP 5
foreach ($colors as &$color) {
    
$color strtoupper($color);
}
unset(
$color); /* это нужно для того, чтобы последующие записи в
$color не меняли последний элемент массива */

// Обходной прием для старых версий

foreach ($colors as $key => $color) {
    
$colors[$key] = strtoupper($color);
}
print_r($colors);
?>

Результат выполнения данного примера:

Array
(
    [0] => RED
    [1] => BLUE
    [2] => GREEN
    [3] => YELLOW
)

Следующий пример создает массив, начинающийся с единицы.

Пример #11 Индекс, начинающийся с единицы


<?php
$firstquarter  
= array(=> 'Январь''Февраль''Март');
print_r($firstquarter);
?>

Результат выполнения данного примера:

Array 
(
    [1] => 'Январь'
    [2] => 'Февраль'
    [3] => 'Март'
)

Пример #12 Заполнение массива


<?php
// заполняем массив всеми элементами из директории
$handle opendir('.');
while (
false !== ($file readdir($handle))) {
    
$files[] = $file;
}
closedir($handle); 
?>

Массивы упорядочены. Вы можете изменять порядок элементов,
используя различные функции сортировки. Для дополнительной
информации смотрите раздел функции
для работы с массивами. Вы можете подсчитать количество
элементов в массиве с помощью функции count().

Пример #13 Сортировка массива


<?php
sort
($files);
print_r($files);
?>

Поскольку значение массива может быть чем угодно, им также
может быть другой массив. Таким образом вы можете создавать
рекурсивные и многомерные массивы.

Пример #14 Рекурсивные и многомерные массивы


<?php
$fruits 
= array ( "фрукты"  => array ( "a" => "апельсин",
                                       
"b" => "банан",
                                       
"c" => "яблоко"
                                     
),
                  
"числа"   => array ( 1,
                                       
2,
                                       
3,
                                       
4,
                                       
5,
                                       
6
                                     
),
                  
"дырки"   => array (      "первая",
                                       
=> "вторая",
                                            
"третья"
                                     
)
                );
// Несколько примеров доступа к значениям предыдущего массива
echo $fruits["дырки"][5];    // напечатает "вторая"
echo $fruits["фрукты"]["a"]; // напечатает "апельсин"
unset($fruits["дырки"][0]);  // удалит "первая"

// Создаст новый многомерный массив

$juices["apple"]["green"] = "good"
?>

Обратите внимание, что при присваивании массива всегда
происходит копирование значения. Чтобы скопировать массив по
ссылке, вам нужно использовать оператор ссылки.


<?php
$arr1 
= array(23);
$arr2 $arr1;
$arr2[] = 4// $arr2 изменился,
             // $arr1 все еще array(2, 3)
$arr3 = &$arr1;
$arr3[] = 4// теперь $arr1 и $arr3 одинаковы
?>

Вернуться к: Типы

Arrays are a strong data-handling tool in PHP. Arrays are a type of data structure that enables programmers to store and manipulate several values in a single variable. They are incredibly adaptable and may be utilized in a wide range of applications, from basic lists to complicated data structures. We will cover all you need to know to master dealing with PHP arrays in this comprehensive guide.

Understanding the Basics of PHP Arrays

There are two main types of arrays in PHP: indexed and associative.

Indexed Arrays

Indexed arrays are made by assigning many values to a single variable, each with its own integer index. As an example:

$fruits = array("apple", "banana", "orange");

In this example, “apple” has the index 0, “banana” has the index 1, and “orange” has the index 2. These values may be accessed by using the array’s index, as seen below:

echo $fruits[0]; // outputs "apple"

Associative Arrays

In contrast, associative arrays are built by assigning keys (strings or numbers) to values. As an example:

$person = array("name" => "John Smith", "age" => 30, "address" => "123 Main St.");

In this example, “name” is set to “John Smith,” “age” is set to “30,” and “address” is set to “123 Main St.”. These values may be accessed by using the array’s keys as follows:

echo $person["name"]; // outputs "John Smith"

Creating Arrays

There are several ways to create arrays in PHP, including:

  • Using the array() function
  • Using the square brackets []
  • Using the range() function

Using the array() Function

In PHP, the array() method is the most often used technique to generate an array. As an example:

$fruits = array("apple", "banana", "orange");

Using Square Brackets

You can also create an array using square brackets [] in PHP 5.4 and later versions. For example:

Using the range() Function

The range() function creates an array of numbers within a specified range. For example:

This creates an array of numbers from 1 to 10.

Accessing Array Elements

You can access the elements of an array using the index or key of the element. For example:

$fruits = array("apple", "banana", "orange");
echo $fruits[0]; // outputs "apple"
$person = array("name" => "John Smith", "age" => 30, "address" => "123 Main St.");
echo $person["name"]; // outputs "John Smith"

Modifying Array Elements

You can modify the elements of an array by assigning a new value to the index or key of the element. For example:

$fruits = array("apple", "banana", "orange");
$fruits[0] = "mango";

In this example, the value at index 0 of the $fruits array is changed from “apple” to “mango”.

Similarly, for associative arrays:

$person = array("name" => "John Smith", "age" => 30, "address" => "123 Main St.");
$person["name"] = "Jane Doe";

The value of the key “name” in the $person array is changed from “John Smith” to “Jane Doe” in this example.

Advanced Array Manipulation

After you’ve mastered the fundamentals of arrays, you may go on to more complex array manipulation techniques.

Sorting Arrays

PHP has a number of built-in functions for sorting arrays, including sort(), usort(), and ksort (). Each of these methods organizes the items of an array in a different way, and you may select the one that best meets your requirements.

For example:

sort($fruits);
print_r($fruits);

This will sort the elements of the $fruits array in ascending alphabetical order.

Merging and Splicing Arrays

You can merge two or more arrays together using the array_merge() function, like so:

$fruits1 = array("apple", "banana");
$fruits2 = array("orange", "grapes");
$fruits = array_merge($fruits1, $fruits2);

This will generate a new array containing all of the entries from $fruits1 and $fruits2. You may also use the array splice() method to delete entries from an array, as seen below:

array_splice($fruits, 1, 1);

This will remove the element at index 1 from the $fruits array.

Iterating Through Arrays

You can iterate through the elements of an array using a for loop or a foreach loop, like so:

for ($i = 0; $i < count($fruits); $i++) {
echo $fruits[$i];
}

or

foreach ($fruits as $fruit) {
echo $fruit;
}

Filtering Arrays

You can filter the elements of an array using the array_filter() function, like so:

$filtered = array_filter($fruits, function ($fruit) {
return $fruit != 'banana';
});

This will create a new array that contains all elements of $fruits except for ‘banana’.

Working with Nested Arrays

Nested arrays are arrays that include one or more other arrays. They may be used to store sophisticated data structures.

Creating Nested Arrays

You can create a nested array by including an array as an element of another array. For example:

$fruits = array("apple", "banana", array("orange", "grapes"));

This creates an array $fruits with 3 elements

, where the third element is an array containing “orange” and “grapes”.

Accessing Elements in Nested Arrays

To access an element in a nested array, you must supply the element’s index or key at each level of the nested array. As an example:

$fruits = array("apple", "banana", array("orange", "grapes"));
echo $fruits[2][0]; // outputs "orange"

Modifying Elements in Nested Arrays

You can modify an element in a nested array by specifying the index or key of the element in each level of the nested array. For example:

$fruits = array("apple", "banana", array("orange", "grapes"));
$fruits[2][0] = "mango";

The value at index 0 of the third element (an array) of the $fruits array is changed from “orange” to “mango” in this example.

Iterating Through Nested Arrays

You can iterate through the elements of a nested array using nested loops. For example:

foreach ($fruits as $fruit) {
    if (is_array($fruit)) {
        foreach ($fruit as $subFruit) {
            echo $subFruit;
        }
    } else {
        echo $fruit;
    }
}

This will output all elements of the nested array $fruits.

Built-in PHP Array Functions

PHP has a number of built-in functions for working with arrays. The following are some of the most regularly utilized functions:

  • count(): returns the number of elements in an array
  • sort(): sorts the elements of an array
  • implode(): converts an array into a string
  • explode(): converts a string into an array
  • array_keys(): returns all the keys of an array
  • array_values(): returns all the values of an array
  • array_unique(): removes duplicate values from an array

Best Practices for Working with PHP Arrays

  • Choosing the right data type: It is important to choose the right data type for your array, as it can have a big impact on performance and memory usage.
  • Optimizing performance: Avoid using large arrays or performing complex operations on them, as they can cause performance issues.
  • Error handling and debugging: Always check for errors and debug your code when working with arrays.
  • Security considerations: Be aware of potential security issues when working with arrays, such as SQL injection and cross-site scripting.

Real-world Examples of Using Arrays

  • Data storage and retrieval from a database: Arrays are frequently used to store data retrieved from a database and then used to display it on a webpage.
  • Developing a basic to-do list app: In a to-do list application, arrays may be used to store and manage a list of tasks.
  • Creating a contact form: Arrays may be used to store and validate data sent via a contact form.
  • Creating a simple shopping cart: Arrays can be used to store and manage the items in a shopping cart.

Q&A

Q: What are the two main types of arrays in PHP?
A: The two main types of arrays in PHP are indexed arrays and associative arrays.

Q: How do you create an indexed array in PHP?
A: To create an indexed array in PHP, you can use the array() function or square brackets [] in PHP 5.4 and later versions. For example: $fruits = array("apple", "banana", "orange");

Q: How do you access an element in an indexed array?
A: To access an element in an indexed array, you can use the element’s index. For example: $fruits = array("apple", "banana", "orange"); echo $fruits[0]; // outputs "apple"

Q: How do you create an associative array in PHP?
A: To create an associative array in PHP, you can use the array() function and assign keys to values. For example: $person = array("name" => "John Smith", "age" => 30, "address" => "123 Main St.");

Q: How do you access an element in an associative array?
A: To access an element in an associative array, you can use the element’s key. For example: $person = array("name" => "John Smith", "age" => 30, "address" => "123 Main St."); echo $person["name"]; // outputs "John Smith"

Q: What is a nested array?
A: A nested array is an array that contains one or more arrays inside it. They are useful for storing complex data structures.

Q: How do you iterate through a nested array?
A: To iterate through a nested array, you can use nested loops. For example: foreach ($fruits as $fruit) { if (is_array($fruit)) { foreach ($fruit as $subFruit) { echo $subFruit; } } else { echo $fruit; } }

Q: What is the function to sort an array in PHP?
A: The built-in function to sort an array in PHP is sort(). For example: sort($fruits);

Q: What is the function to remove duplicates from an array in PHP?
A: The built-in function to remove duplicates from an array in PHP is array_unique(). For example: $unique = array_unique($fruits);

Q: What are some best practices to keep in mind when working with PHP arrays?
A: When dealing with PHP arrays, some best practices include selecting the appropriate data type, maximizing efficiency, managing errors and debugging, and being mindful of any security risks.

Exercises

  1. Create an array containing the numbers 1 through 10.
  2. Create a script to output the third member of an array.
  3. Create a script that appends 5 to the end of an array.
  4. Create a script that searches an array for the greatest value and puts it in a variable.
  5. Create a script that sorts an array descendingly.

Answers:

  1. $numbers = range(1,10);
  2. echo $array[2];
  3. $array[] = 5;
  4. $highest = max($array);
  5. rsort($array);

В этой статье вы изучите массивы в PHP, научитесь создавать, перебирать и выводить их, познакомитесь с множеством различных функций для работы с ними.

Что такое массив? Создание массива

Массив – это тип данных для хранения упорядоченного набора элементов. Каждый элемент в массиве состоит из ключа и значения.

В PHP имеются только упорядоченные ассоциативные массивы. Индексированных массивов в PHP нет.

Но тем не менее в PHP мы можем создавать простые массивы. При указании значений без ключей, они будут им присваиваться автоматически.

Например, создадим массив, который будет содержать среднюю температуру каждого месяца в году:

<?php
// создадим массив, состоящий из 12 чисел
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
// получим тип переменной $temperatures
echo gettype($temperatures); // "array"

Здесь мы создали массив $temperatures, содержащий 12 значений. Каждый элемент в этом массиве имеет ключ. Первый элемент имеет в качестве ключа число 0, второй – число 1, и так далее. Последний элемент имеет в качестве ключа число 11.

Другой вариант создания массивов – это использовать функцию array():

<?php
$temperatures = array(-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11);

Создание массива без элементов, то есть пустого массива, в PHP выполняется так:

<?php
$empty1 = [];
$empty2 = array();

Обращение к значению массива выполняется посредством ключа, который указывается в квадратных скобках:

<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
// средняя температура марта
echo $temperatures[2]; // 3
// средняя температура августа
echo $temperatures[7]; // 26

В квадратных скобках при необходимости можно указывать выражение, результат вычисления которого будет использоваться в качестве ключа элемента, значение которого нужно получить:

<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
// выведем среднюю температуру по номеру текущего месяца, но так как нумерация ключей в массиве начинается с 0, то отнимем ещё 1
echo $temperatures[date('n') - 1];

Если мы попытаемся обратиться к элементу, которого нет в массиве, то начиная с PHP 8.0.0, мы получим сообщение об ошибке E_WARNING. При этом в качестве значение будет возвращено null.

<?php
$fruits = ['apple', 'banana', 'pear'];
echo $fruits[3]; // null

Проверить наличия некоторого ключа в массиве можно с помощью функции array_key_exists:

<?php
$fruits = ['apple', 'banana', 'pear'];
$key = 1;
if (array_key_exists($key, $fruits)) {
  echo "Ключ '$key' имеется в массиве";
} else {
  echo "Ключа '$key' нет в массиве";
}

Добавление в массив нового элемента или изменение существующего осуществляется в PHP так:

<?php
$fruits = ['apple', 'banana', 'pear'];
$fruits[1] = 'lemon';
print_r($fruits); // ['apple', 'lemon', 'pear']
$fruits[] = 'mango'; // это тоже самое, что $fruits[3] = 'mango';
print_r($fruits); // ['apple', 'lemon', 'pear', 'mango']

Здесь мы при добавлении нового элемента в массив не указали ему ключ. В этом случае ключ будет на единицу больше самого большого числового ключа в массиве.

Удаление элемента массива в PHP выполняется с помощью специальной языковой конструкции unset:

<?php
$fruits = ['apple', 'banana', 'pear'];
unset($fruits[0]);
print_r($fruits); // ['banana', 'pear']

С помощью unset вы можете удалить не только отдельный элемент, но и полностью весь массив:

<?php
unset($fruits);
if (!isset($fruits)) {
  echo 'Переменная $fruits не определена.';
}

В PHP массиве могут содержаться данные различных типов:

<?php
$values = [null, 'three', 7, 'seven', true];

Вывод содержимого массива

Вывести все значения массива на экран можно с помощью функции print_r:

<?php
$fruits = ['apple', 'banana', 'pear'];
print_r($fruits);

Но чтобы этот вывод был более наглядным лучше это делать внутри тега <pre>:

<?php
$fruits = ['apple', 'banana', 'pear'];
echo '<pre>';
print_r($fruits);
echo '</pre>';

Вывод содержимого массива с помощью функции print_r в PHP

Ассоциативные массивы

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

<?php
$languages = [
  'en' => 'English',
  'fr' => 'French',
  'es' => 'Spanish',
  'pt' => 'Portuguese'
];
echo $languages['es']; // 'Spanish'

При этом в PHP выполняются следующие преобразования при сохранении ключей:

  • строка '7' будет преобразована в число 7; но например ключ '07' не будет преобразован, так как он не является корректным числом;
  • число 7.5, то есть число с плавающей точкой (float) будет преобразовано к целому числу, в данном случае к 7;
  • true к 1, а false к 0;
  • значение null к пустой строке ''.
<?php
$arr = [
  '95' => 'a',
  '095' => 'b',
  9.5 => 'c',
  true => 'd',
  null => 'e',
];

echo $arr[95]; // a
echo $arr['095']; // b
echo $arr[9]; // c
echo $arr[1]; // d
echo $arr['']; // e

Если несколько элементов в объявлении массива используют одинаковый ключ, то последний перезапишет предыдущие:

<?php
$array = [
  0 => 'a',
  '0' => 'b',
  0.7 => 'c',
  false => 'd',
];
echo '<pre>';
print_r($array);
echo '</pre>';

Так как в этом примере все ключи преобразуются к 0, то каждый следующий элемент будет перезаписывать предыдущий и останется в массиве только один ключ со значением 'd'.

Массив в PHP, у которого элементы имеют одинаковые ключи

В одном массиве могут содержаться ключи различных типов, то есть одновременно int и string:

<?php
$numbers = [
  1 => 'one',
  'b' => 'two',
];

Перебор массивов

Наиболее удобный способ прохождения по массиву в PHP – это использовать конструкцию foreach:

<?php
$languages = [
  'en' => 'English',
  'fr' => 'French',
  'es' => 'Spanish',
  'pt' => 'Portuguese',
];
/*
  $languages – массив, который нужно перебрать
  $key – значение ключа
  $value – значение, соответствующее ключу
*/
echo '<pre>';
foreach ($languages as $key => $value) {
  echo "Ключ '$key' имеет значение '$value'<br>";
}
echo '</pre>';

Если нужно только по значениям:

foreach ($languages as $value) {
  echo "$value
"; }

Если ключи массива составляют последовательность, то перебрать такой массив можно с помощью for:

<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
for ($i = 0; $i < count($temperatures); $i++) {
  echo $temperatures[$i] . '
'; }

Здесь мы с помощью встроенной функции count() получить длину или другими словами размер массива. Узнать длину массива также можно с помощью sizeof().

<?php
$temperatures = [-15, -9, 3, 10, 17, 23, 24, 26, 17, 8, -4, -11];
echo sizeof($temperatures); // 12

Функцию count также можно использовать для получения последнего элемента массива. Но это повторим только возможно если ключи массива составляют числовую последовательность, начинающуюся с 0.

<?php
$animals = ['horses', 'dogs', 'birds'];
echo $animals[count($animals) - 1]; // birds

Функции для работы с массивами

В PHP очень много различных функций для работы с массивами. Рассмотрим некоторые из них.

Сортировка

Сортировка массива в порядке возрастания осуществляется с помощью функции sort, в порядке убывания посредством rsort.

<?php
$fruits = ['lemon', 'orange', 'banana', 'apple'];
sort($fruits); // ['apple', 'banana', 'lemon', 'orange']

Для настройки сортировки можно передать в качестве второго аргумента флаг.

Например:

<?php
$arr = ['10', 11, 100, 'a'];
sort($arr); // ['10', 11, 100, 'a']
sort($arr, SORT_STRING); // ['10', 100, 11, 'a']
sort($arr, SORT_NUMERIC); // ['a', '10', 11, 100]

Для того чтобы ключи сохранили значения, с которыми они связаны, сортировку массива необходимо выполнять с помощью функции asort. Функция asort сортирует в порядке возрастания, для сортировки в порядке убывания используйте arsort. Эти функции сортируют массив соответственно как sort и rsort, но ключи в отличие от них остаются связанными с такими же значениями.

Например, выведем с помощью ассоциативного массива $students имя студента и соответствующий полученный им балл в порядке их возрастания:

<?php
$students = [
  'John' => 47,
  'Bob' => 24,
  'Tom' => 36,
];
asort($students);
echo '<pre>';
print_r($students);
echo '</pre>';

Сортировка массива в PHP, у которого ключи сохранили значения, с которыми они связаны

Массивы в PHP можно сортировать не только по значениям, но и ключам. Для этого используется функция ksort. Для ассоциативного массива $students функция ksort выстроит все элементы в порядке возрастания названий ключей.

<?php
$students = [
  'John' => 47,
  'Bob' => 24,
  'Tom' => 36,
];
ksort($students); // ['Bob' => 24, 'John' => 47, 'Tom' => 36]

Для сортировки в порядке убывания можно использовать krsort:


krsort($students); // ['Tom' => 36, 'John' => 47, 'Bob' => 24]

Перемешивание элементов случайным образом

Если вам нужно перемешать элементы в массиве случайным образом, то можно воспользоваться функцией shuffle:

<?php
$languages = [
  'en' => 'English',
  'fr' => 'French',
  'es' => 'Spanish',
  'pt' => 'Portuguese',
];
shuffle($languages); // ['Portuguese', 'French', 'Spanish', 'English']
shuffle($languages); // ['English', 'French', 'Spanish', 'Portuguese']

При этом как вы видите, изначальные ключи теряются и массив превращается в индексируемый.

Выстраивание элементов в обратном порядке

Если вам необходимо создать новый массив, в котором элементы нужно выстроить в обратном порядке, то используйте array_reverse:

<?php
$languages = [
  'en' => 'English',
  'fr' => 'French',
  'es' => 'Spanish',
  'pt' => 'Portuguese',
];
$languagesReverse = array_reverse($languages);
echo '<pre>';
print_r($languagesReverse);
echo '</pre>';

Создание нового массива в PHP, в котором элементы выстроены в обратном порядке относительно исходного массива

Работа над массивами как с множествами значений

В PHP имеются функции: array_merge, array_intersect и array_diff. Они позволяют работать с массивами как с множествами значений.

1. Объединение одного или несколько массивов вместе выполняется в PHP с помощью функции array_merge:

array_merge(array ...$arrays): array

Например, объединим с помощью array_merge элементы 3 массивов вместе:

<?php
$array1 = ['color' => 'red', 1, 'php', 4];
$array2 = ['price' => 20.8, 1, 'color' => 'green', 3];
$array3 = ['green', 'price' => 30.5, 3, 'php'];

$array = array_merge($array1, $array2, $array3);

echo '<pre>';
print_r($array);
echo '</pre>';

Объединение значений из разных массивов в PHP

Если массивы имеют одинаковые строковые ключи, то более позднее значение этого ключа перезапишет предыдущее. Например, значение 'green' ключа 'color' перезапишет 'red'.

Однако если массивы содержат числовые ключи, то более позднее значение не перезаписывает предыдущее, оно будет просто добавлено в массив. Значения с числовыми ключами в результирующем массиве будут перенумерованы последовательно начиная с нуля.

Функция array_merge, вызванная без аргументов возвращает пустой массив:

<?php
$array = array_merge(); // []

2. Функция array_intersect вычисляет пересечения значений основного массива со значениями других массивов:

// $base – основной массив
// $arrays – другие массивы
array_intersect(array $base, array ...$arrays): array

В качестве результата оно возвращает массив со значениями основного массива, которые имеются во всех других массивах.

Например:

<?php
$base = ['color' => 'red', 1, 'php', 4];
$array1 = ['price' => 20.8, 1, 'color' => 'red', 3];
$array2 = ['green', 'color' => 'red', 3, 'php', 1];

$result = array_intersect($base, $array1, $array2); // ['color' => red, 0 => 1]

3. Функция array_diff вычисляет разницу между массивами:

// $base – основной массив
// $arrays – другие массивы
array_diff(array $base, array ...$arrays): array

В качестве результата оно возвращает массив со значениями основного массива, которых нет ни в одном из других массивов.

Например:

<?php
$base = ['color' => 'red', 1, 'php', 4];
$array1 = [3, 'color' => 'red'];
$array2 = [4, 'php'];

$result = array_diff($base, $array1, $array2); // [0 => 1]

Проверка наличия ключей и значений в массиве

Проверить имеется ли указанное значение в массиве можно с помощью функции in_array:

if (in_array('apple', $fruits)) {
  // значение 'apple' имеется в массиве $fruits
}

Здесь, в первый аргумент необходимо передать искомое значение, а во второй – сам массив. В качестве результата in_array возвращает true или false.

Кроме in_array в PHP имеется ещё функция array_search. Она выполняет тоже самое, но в отличие от in_array возвращает ключ этого значения.

Если нужно проверить наличие не значения, а ключа, то можно воспользоваться функцией array_key_exists:

if (array_key_exists('es', $languages)) {
  // ключ 'es' имеется в массиве $languages
}

Сериализация

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

Сериализация массива в строку выполняется с помощью функции serialize. Для декодирования строки, содержащей сериализованный массив, обратно в исходный массив используется функция unserialize:

// исходный массив
$person = [
  'name' => 'Alexander',
  'age' => 23
];
// сериализуем массив в строковое представление, уникальное для PHP
$personString = serialize($person);
// выведем на экран строку
echo $personString; // 'a:2:{s:4:"name";s:9:"Alexander";s:3:"age";i:23;}'
// преобразуем строку обратно в массив
$personArray = unserialize($personString);
// выведем на экран массив в форматированном виде
echo '<pre>';
print_r($personArray); // array('name' => Alexander, 'age' => 23)
echo '</pre>';

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

Многомерные массивы – это массивы, элементы которого просто содержат другие массивы.

Пример создания двумерного массива:

$software = [
  'os' => ['Windows', 'Linux', 'macOS'],
  'browsers' => ['Firefox', 'Chrome', 'Safari', 'Edge'],
  'code editors' => ['Visual Studio Code', 'Atom', 'Sublime Text'],
];

По сути двумерный массив – это массив массивов. Обращение к элементу массива в этом случае осуществляется с использованием двух квадратных скобок:

echo $software['os'][0]; // 'Windows'
$software['browsers'][3] = 'Opera';

Выведем с помощью функции print_r массив $software в форматированном виде:

echo '<pre>';
print_r($software);
echo '</pre>';

Вывод двумерного PHP-массива в форматированном виде

Основные примеры работы с массивами PHP. Создание, наполнение, извлечение удаление значений.

1

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

Создать массив и заполнить его значениями

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

// или

$array = array();
$array[] = 'яблоко';
$array[] = 'апельсин';
$array[] = 'виноград';

PHP

Можно применить функцию array_fill($start, $size, $value), которая создаст массив с количеством $size элементов со значением $value, начиная с индекса $start.

Данный пример создает массив с тремя элементам «текст», ключи которых будут начинаться с нуля.

$array = array_fill(0, 3, 'текст');
print_r($array);

PHP

Результат:

Array
(
    [0] => текст
    [1] => текст
    [2] => текст
)

Еще вариант – функция explode($delimiter, $string), которая из строки $string создаст массив используя разделитель $delimiter, в данном примере запятая.

$array = explode(',', 'текст 1,текст 2,текст 3');
print_r($array);

PHP

Результат:

Array
(
    [0] => текст 1
    [1] => текст 2
    [2] => текст 3
)

2

Узнать количество элементов в массиве

echo count($array);

// или 
echo sizeof($array);

PHP

Если массив ассоциативный (многомерный), то count() вернёт количество элементов только первого уровня. Чтобы получит количество всех элементов нужно использовать константу COUNT_RECURSIVE.

$array = array(
	array(
		'яблоко',
		'апельсин',
		'виноград'
	),
	array(
		'яблоко',
		'апельсин',
		'виноград'
	)
);

echo count($array);                    // вернет 2
echo count($array, COUNT_RECURSIVE);   // вернет 8

PHP

3

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

Добавить значение в начало массива

array_unshift($array, $value) – добавляет одно или несколько элементов в начало массива.

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

array_unshift($array, 'банан');
print_r($array);

PHP

Результат:

Array
(
    [0] => банан
    [1] => яблоко
    [2] => апельсин
    [3] => виноград
)

Добавить значение в конец массива

array_push($array, $value) – добавляет значение в конец массива.

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

array_push($array, 'банан');

// или
$array[] = 'банан';

print_r($array);

PHP

Результат:

Array
(
    [0] => яблоко
    [1] => апельсин
    [2] => виноград
    [3] => банан
    [4] => банан
)

4

Работа с ключами массива

Поучить первый ключ массива

Функция array_key_first($array) — получает первый ключ массива. Появилась в версии PHP 7.3, для более ранних версий:

if (!function_exists('array_key_first')) {
	function array_key_first(array $arr) {
		foreach($arr as $key => $unused) {
			return $key;
		}
		return null;
	}
}

PHP

$array = array(
	1 => 'яблоко',
	3 => 'апельсин',
	5 => 'виноград'
);

echo array_key_first($array); // 1

PHP

Поучить последний ключ массива

Функция array_key_last($array) — получает последний ключ массива. Появилась в версии PHP 7.3, для более ранних версий:

if (!function_exists('array_key_last')) {
	function array_key_last($array) {
		if (!is_array($array) || empty($array)) {
			return NULL;
		}
		return array_keys($array)[count($array) - 1];
	}
}

PHP

$array = array(
	1 => 'яблоко',
	3 => 'апельсин',
	5 => 'виноград'
);

echo array_key_last($array); // 5

PHP

Переопределить ключи массива

К примеру, после удаления элемента массива сбивается нумерация ключей и нужно назначить новую нумерацию:

$array = array(
	1 => 'яблоко',
	3 => 'апельсин',
	5 => 'виноград'
);

$new = array_values($array);
print_r($new);

PHP

Результат:

Array
(
    [0] => яблоко
    [1] => апельсин
    [2] => апельсин
)

Начало нумерации ключей с единицы:

$array = array(
	1 => 'яблоко',
	3 => 'апельсин',
	5 => 'виноград'
);

$new = array_combine(range(1, count($array)), $array);
print_r($new);

PHP

Результат:

Array
(
    [1] => яблоко
    [2] => апельсин
    [3] => апельсин
)

5

Получение элементов из массива

Получить первый элемент массива

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

reset($array);
$first = current($array);  // яблоко

PHP

Получить последний элемент массива

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

$end = end($array);  // виноград

PHP

Получить часть (срез) массива

array_slice($array, $offset, $length) возвращает часть массива начиная с индекса $offset длиной $length.

  • Если $offset отрицательный, то отчет начинается с конца массива.
  • $length можно не указывать, тогда функция вернет все элементы до конца массива начиная с индекса $offset.
$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

$new = array_slice($array, 0, 2);
print_r($new);

PHP

Результат:

Array
(
    [0] => яблоко
    [1] => апельсин
)

Извлечь первый элемент массива

array_shift($array) – извлекает первый элемент из массива $array и возвращает его значение.

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

$first = array_shift($array); // яблоко

print_r($array);

PHP

Результат:

Array
(
    [0] => апельсин
    [1] => виноград
)

Извлечь последний элемент массива

array_pop($array) – извлекает последний элемент из массива $array и возвращает его значение.

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

$end = array_pop($array); // виноград
print_r($array);

PHP

Результат:

Array
(
    [0] => яблоко
    [1] => апельсин
)

Извлечь часть массива

Чтобы извлечь из массива часть можно применить функции array_slice() и array_diff().

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

$new = array_slice($array, 0, 2);
$array = array_diff($array, $new);

print_r($new);
print_r($array);

PHP

Результат:

Array
(
    [0] => яблоко
    [1] => апельсин
)

Array
(
    [2] => виноград
)

Выбрать все значения из массива

array_values($array) – создает новый массив из исходного $array игнорируя его ключи.

$array = array(
	'key 1' => 'яблоко',
	'key 2' => 'апельсин',
	'key 3' => 'виноград'
);

$new = array_values($array);
print_r($new);

PHP

Результат:

Array
(
    [0] => яблоко
    [1] => апельсин
    [2] => виноград
)

Выбрать все ключи массива

array_keys($array) – создает новый массив состоящий из ключей исходного массива.

$array = array(
	'key 1' => 'яблоко',
	'key 2' => 'апельсин',
	'key 3' => 'виноград'
);

$new = array_keys($array);
print_r($new);

PHP

Результат:

Array
(
    [0] => key 1
    [1] => key 2
    [2] => key 3
)

Выбирать случайные значения из массива

array_rand($array, $count) возвращает случайным образом один или несколько ключей из массива $array. Если $count больше единицы, то результат будет в виде массива.

$array = array(
	3 => 'яблоко',
	1 => 'апельсин',
	5 => 'виноград'
);

echo $array[array_rand($array)];

PHP

6

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

Проверить, есть ли значение в массиве

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

if (in_array('апельсин', $array)) {
	echo 'Найдено значение "апельсин"';
}

// или 
if (array_search('апельсин', $array) !== false) {
	echo 'Найдено значение "апельсин"';
}

PHP

Проверить, есть ли ключ в массиве

$array = array(
	1 => 'яблоко',
	2 => 'апельсин',
	3 => 'виноград'
);

if (array_key_exists(2, $array)) {
	echo 'Найден ключ 2';
}

// или
if (isset($array[2])) {
	echo 'Найден ключ 2';
}

PHP

7

Удаление элементов из массива

unset() – удаляет переменные и элементы массива по ключу.

В первом примере элемент удаляется по ключу, во втором по значению:

$array = array(
	'яблоко',
	'апельсин',
	'виноград'
);

// Удаление по ключу
unset($array[1]);

// Удаление по значению
unset($array[array_search('апельсин', $array)]);

print_r($array);

PHP

Результат:

Array
(
    [0] => яблоко
    [2] => виноград
)

Удаление пустых значений

В PHP нет отдельной функции для удаления пустых значений в массиве, поэтому применяют array_diff() которая возвращает расхождения массивов.

$array = array(
	'яблоко',
	'',
	'виноград'
);

$array = array_diff($array, array(''));
print_r($array);

PHP

Результат:

Array
(
    [0] => яблоко
    [2] => виноград
)

Если требуется удалить значения включая 0, null, array() и т.д. можно применить следующее:

$array = array_diff($array, array('', ' ', null, 0, array()));

PHP

Удалить повторяющиеся значения массива

$array = array(
	'яблоко',
	'яблоко',
	'апельсин',
	'виноград'
);

$array = array_unique($array);
print_r($array);

PHP

Результат:

Array
(
    [0] => яблоко
    [2] => апельсин
    [3] => виноград
)

8

Объединение массивов

Объединить два и более массивов поможет функция array_merge($array_1, $array_2, ...).

$array_1 = array(
	'яблоко',
	'апельсин',
	'виноград'
);

$array_2 = array(
	'помидор',
	'огурец',
);

$new = array_merge($array_1, $array_2);
print_r($new);

PHP

Результат:

Array
(
    [0] => яблоко
    [1] => апельсин
    [2] => виноград
    [3] => помидор
    [4] => огурец
)

9

Разделить массив на части

array_chunk($array, $size) – создает новый многомерный массив из исходного, деля его на равные части.

В данном примере указано $size = 3, поэтому получается четыре подмассива в каждом из которых по три элемента.

$array = array(
	'январь',
	'февраль',
	'март',
	'апрель',
	'май',
	'июнь',
	'июль',
	'август',
	'сентябрь',
	'ноябрь',
	'декабрь',
);

$array = array_chunk($array, 3);
print_r($array);

PHP

Результат:

Array
(
    [0] => Array
        (
            [0] => январь
            [1] => февраль
            [2] => март
        )
    [1] => Array
        (
            [0] => апрель
            [1] => май
            [2] => июнь
        )
    [2] => Array
        (
            [0] => июль
            [1] => август
            [2] => сентябрь
        )
    [3] => Array
        (
            [0] => ноябрь
            [1] => декабрь
        )
)

Если требуется разделить массив на определенное количество частей поможет следующий прием:

$array = array(
	'январь',
	'февраль',
	'март',
	'апрель',
	'май',
	'июнь',
	'июль',
	'август',
	'сентябрь',
	'ноябрь',
	'декабрь',
);

$array = array_chunk($array, ceil(count($array) / 3));
print_r($array);

PHP

Результат:

Array
(
    [0] => Array
        (
            [0] => январь
            [1] => февраль
            [2] => март
            [3] => апрель
        )
    [1] => Array
        (
            [0] => май
            [1] => июнь
            [2] => июль
            [3] => август
        )
    [2] => Array
        (
            [0] => сентябрь
            [1] => ноябрь
            [2] => декабрь
        )
)

Понравилась статья? Поделить с друзьями:
  • Как исправить ошибку e 8210604a на playstation 4
  • Как найти определенного человека в инстаграме
  • Как найти рентабельность гостиницы
  • Как найти радиус кривизны траектории точки
  • Как найти медведя assassins creed 3