Массивы в php
Добавить в избранное
Ранее мы рассмотрели, как в переменные можно сохранить одиночное значение, например, одно число или одну строку. Но кроме того, мы можем сохранить в переменную набор значений. И для этого используются массивы.
Есть несколько способов определения массивов. Первый способ представляет использование функции array():
$numbers = array();
В данном случае определяется пустой массив $numbers.
Второй способ представляет использование квадратных скобок []:
$numbers = [];
При определении массива мы сразу можем передать ему начальные данные. Если применяются квадратные скобки, то элементы массива передаются внутри скобок:
$numbers = [1, 2, 3, 4];
Аналогичное определение массива с помощью функции array():
$numbers = array(1, 2, 3, 4);
В качестве элементов массива могут выступать объекты любого типа.
Для обращения к элементам массива применяются ключи. Ключ может представлять число или строку или одновременно и числа, и строки.
Для обычных массивов ключ представляет число. Числовые ключи еще называют индексами. Нумерация индексов начинается с нуля, то есть первый элемент массива имеет индекс 0, второй элемент - индекс 1 и так далее.
Например, обратимся к третьему элементу массива:
$numbers = [1, 4, 9, 16];
echo $numbers[2]; // 9
?>
Поскольку нумерация индексов начинается с нуля, то чтобы обратиться к третьему элементу, надо использовать индекс 2.
Таким образом мы получаем значение элемента массива. Но также мы можем его изменить:
$numbers = [1, 4, 9, 16];
$numbers[1] = 6;
echo $numbers[1]; // 6
?>
При этом нужно учитывать количество элементов массива. Так, мы не можем обратиться к элементу с несуществующим индексом:
$numbers = [1, 4, 9, 16];
echo $numbers[4];
?>
В данном случае в массиве $numbers всего 4 элемента, поэтому индексом последнего элемента будет 3. Таким образом, элемента с индексом 4 в массиве не существует, и при попытке получить его значение echo $numbers[4] PHP нам покажет предупреждение.
Тем не менее если мы хотим установить элемент по еще не существующему индексу, мы можем это сделать:
$numbers = [1, 4, 9, 16];
$numbers[5] = 76;
echo $numbers[5];
?>
Здесь устанавливается элемент с индексом 5. После установки мы можем получать его значение. При этом элемента с индексом 4 по прежнему не существует.
Для добавления нового элемента в массив мы можем, как в примере выше, просто установить новый элемент по еще не установленному индексу. Но есть и другой способ:
$numbers = [1, 4, 9, 16];
$numbers[] = 25;
echo $numbers[4];
?>
При таком способе новый элемент добавляется в конец массив, соответственно здесь, чтобы получить новый элемент, надо использовать индекс 4.
Чтобы получить полное наглядное представление о том, как в конкретном массиве сопоставляются ключи и значения элементов, можно использовать функцию print_r, в которую в качестве параметра передается массив:
$numbers = [1, 4, 9, 16];
$numbers[] = 25;
print_r($numbers);
?>
Вывод скрипта:
Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
Также следует отметить, что необязательно как-то специально инициализровать переменную массива - мы можем по ходу добавлять элементы в массив:
$numbers[] = 20;
$numbers[] = 120;
$numbers[] = 720;
print_r($numbers); // Array ( [0] => 20 [1] => 120 [2] => 720 )
?>
Оператор =>
Оператор => позволяет сопоставить ключ с определенным значением. Хотя при определении массива выше нам не требовался подобный оператор, тем не менее мы можем его применять. Например, следующий массив:
Будет аналогичен следующему массиву:
$numbers = [0=>1, 1=>4, 2=>9, 3=>16];
// $numbers = array(0=>1, 1=>4, 2=>9, 3=>16);
Каждый элемент определяется в следующем формате: ключ => значение
В дальнейшем мы также можем обращаться к элементам этого массива.
Этот оператор может понадобится, если мы хотим переопределить порядок индексов. Так, по умолчанию нумеация индексов начинается с нуля и каждый следующий элемент имеет индекс предыдущего элемента + 1. Оператор => же позволяет определить свои индексы вручную для элементов, необязательно с нуля и необязательно по порядку:
echo $numbers[2]; // 4
Также мы можем задать индекс лишь для одного элемента, тогда для последующих элементов индекс автоматически будет увеличиваться на единиицу:
print_r($numbers);
В данном случае индексация начинается с числа 4 - это индекс элемента 16. Тогда для элемента 25 индексом будет число 5 и так далее.
Результат:
Array ( [4] => 16 [5] => 25 [6] => 36 [7] => 49 [8] => 64 )
Перебор массива
Для перебора массива мы можем применять стандартный метод for:
$users = ["Tom", "Sam", "Bob", "Alice"];
$num = count($users);
for($i=0; $i < $num; $i++) {
echo "$users[$i] <br>";
}
?>
В данном случае мы не определяем вручную индексы элементов, поэтому индексация начинается с нуля с увеличением на единиицу для последующего элемента. Поэтому мы можем в цикле через переменную $i передавать индекс, начиная с нуля. Единственная трудность может заключаться в том, как определить индекс конечного элемента, чтобы установить потолок для переменной $i. В этом случае мы можем с помощью встроенной функции count() получить длину массива. Эта функция в качестве параметра принимает массив и возвращает его длину.
Результат работы скрипта:
Tom
Sam
Bob
Alice
Цикл foreach
Тем не менее выше использованный способ перебора не поможет, если индексы определяются вручную и отличаются они от соседних индексов не на единицу, а на произвольную величину. В этом случае мы можем использовать специальный цикл - foreach:
$users = [1 => "Tom", 4 => "Sam", 5 => "Bob", 21 => "Alice"];
$num = count($users);
foreach($users as $element) {
echo "$element <br>";
}
?>
В цикле foreach из массива последовательно извлекаются все элементы, и их значение помещается в переменную, указанную после ключевого слова as. В данном случае в переменную $element по очереди помещаются все четыре значения из массива $users. Когда будет извлечен последний элемент из массива, цикл завершается.
В итоге мы получим тот же результат:
Tom
Sam
Bob
Alice
Цикл foreach позволяет извлекать не только значения, но и ключи элементов:
$users = [1 => "Tom", 4 => "Sam", 5 => "Bob", 21 => "Alice"];
$num = count($users);
foreach($users as $key => $value) {
echo "$key - $value <br>";
}
?>
Здесь при переборе элементов цикла в переменную $key будет передаваться ключ элемента, а в переменную $value - его значение.
Результат работы скрипта:
1 - Tom
4 - Sam
5 - Bob
21 - Alice
Ассоциативные массивы
Ассоциативные массивы представляют подвид массивов, в которых, в отличие от обычных массивов, в качестве ключа применяются строки.
При создании ассоциативного массива мы явным образом указываем ключ элемента, после которого идет оператор => и значение элемента. Например, создание ассоциативного массива с помощью функции array():
$words = array("red" => "красный", "blue" => "синий", "green" => "зеленый");
Здесь создается массив $words из трех элементов. Например, первый элемент имеет ключ "red", а значение - "красный".
Создание аналогичного массива с помощью квадратных скобок:
$words = ["red" => "красный", "blue" => "синий", "green" => "зеленый"];
Используя ключ, также как и в обычных массивах, можно обратиться к элементу массива, например, получить или изменить его значение:
$countries = ["Germany" => "Berlin", "France" => "Paris", "Spain" => "Madrid"];
echo $countries["Spain"]; // Madrid
echo "<br>";
$countries["Spain"] = "Barcelona";
echo $countries["Spain"]; // Barcelona
?>
Результат работы скрипта:
Madrid
Barcelona
Для добавления элемента с новым ключом в ассоциативный массив достаточно определить элемент с этим ключом:
$countries["Italy"] = "Rome"; // определяем новый элемент с ключом "Italy"
echo $countries["Italy"]; // Rome
Также необязательно инициализировать переменную массива при ее определении. Можно, как с обычными массивами, добавлять элементы по ходу:
$countries["Germany"] ="Berlin";
$countries["France"] ="Paris";
$countries["Spain"] ="Madrid";
$countries["Italy"] = "Rome";
echo $countries["Italy"]; // Rome
?>
Для перебора ассоциативного массива применяется цикл foreach:
$words = ["red" => "красный", "blue" => "синий", "green" => "зеленый"];
foreach($words as $english => $russian) {
echo "$english : $russian <br>";
}
?>
Результат перебора массива:
red : красный
blue : синий
green : зеленый
Смешанные массивы
PHP позволяет использовать в одном массиве числовые и строковые индексы:
echo $data[1]; // Tom
echo "<br>";
echo $data["id132"]; // Sam
Многомерные массивы
В предыдущих примерах рассматривались только одномерные массивы, где значения элементов представляли числа, строки. Но в PHP массивы могут также быть многомерными, то есть такими, где элемент массива сам является массивом.
Например, создадим многомерный массив с помощью функции array():
$families = array(array("Tom", "Alice"), array("Bob", "Kate"));
Сокращенное определение:
$families = [["Tom", "Alice"], ["Bob", "Kate"]];
Выше определенный многомерный массив $families является двухмерным (частный случай многомерного массива), который можно представить в виде таблицы:
Tom
Alice
Bob
Kate
Для элементов данного массива не установлены явным образом ключи, поэтому каждый ключ элемента представляет числовой индекс, которые по умолчанию начинаются с нуля. Поэтому чтобы обратиться к первому элементу массива, надо использовать индекс 0 - $families[0]:
print_r($families[0]); // Array ( [0] => Tom [1] => Alice )
Но поскольку элементами массива $families являются вложенные массивы, то чтобы обратиться к элементам внутри этих вложенных массивов, нам необходимо использовать второй индекс - $families[0][0]:
echo $families[0][0] . "<br>"; //Tom
echo $families[0][1] . "<br>"; //Alice
echo $families[1][0] . "<br>"; //Bob
echo $families[1][1]; //Kate
То есть выражение $families[0] представляет обращение к первому элементу массива $families - к вложенному массиву ["Tom", "Alice"], а выражение $families[0][0]представляет обращение к первому элементу вложенного массива, то есть, в данном случае к элементу "Tom".
Перебор многомерного массива:
<html>
<head>
<title>mirjs.uz</title>
<meta charset="utf-8" />
</head>
<body>
<table>
<?php
$families = [["Tom", "Alice"], ["Bob", "Kate"], ["Sam", "Mary"]];
foreach ($families as $family) {
echo "<tr>";
foreach ($family as $user) {
echo "<td> $user </td>";
}
echo "</tr>";
}
?>
</table>
</body>
</html>
Для перебора применяется цикл foreach. Цикл проходит по всем элементам массива $families, передавая каждый элемент в переменную $family:
foreach ($families as $family)
Однако каждый элемент массива $families, который передается в переменную $family, сам является массивом. И чтобы получить элементы из вложенного массива, применяется вложенный цикл:
foreach ($family as $user)
В итоге при переборе циклом сформируется таблица.
Также можно определять многомерные ассоциативные массивы:
$phones = array(
"apple"=> array("iPhone 12", "iPhone X", "iPhone 12 Pro") ,
"samsumg"=>array("Samsung Galaxy S20", "Samsung Galaxy S20 Ultra"),
"nokia" => array("Nokia 8.3", "Nokia 3.4"));
foreach ($phones as $brand => $items) {
echo "<h3> $brand </h3>";
echo "<ul>";
foreach ($items as $key => $value) {
echo "<li> $value </li>";
}
echo "</ul>";
}
?>
И при выводе мы получим 3 списка:
Чтобы обратиться к элементу данного, также надо указать ключи в квадратных скобках. Например, обратимся к первому элементу в первом массиве. Так как ключ первого массива - "apple", а ключ первого элемента в первом массиве - число 0 (так как мы явным образом не указали ключи):
echo $phones["apple"][0];
Подобным образом можно получить второй элемент третьего массива:
echo $phones["nokia"][1];
Допустим, вложенные массивы также представляют ассоциативные массивы:
$gadgets = array(
"phones" => array("apple" => "iPhone 12",
"samsumg" => "Samsung S20",
"nokia" => "Nokia 8.3"),
"tablets" => array("lenovo" => "Lenovo Yoga Smart Tab",
"samsung" => "Samsung Galaxy Tab S5",
"apple" => "Apple iPad Pro"));
foreach ($gadgets as $gadget => $items) {
echo "<h3> $gadget </h3>";
echo "<ul>";
foreach ($items as $key => $value) {
echo "<li> $key : $value </li>";
}
echo "</ul>";
}
?>
Получение и изменение элемента в этом массиве:
$gadgets["phones"]["nokia"] = "Nokia 9";
// выведем это значение
echo $gadgets["phones"]["nokia"];
Выше для инициализации массива применялась функция array(), но также можно использовать и сокращенный вариант с квадратными скобками:
"phones" => ["apple" => "iPhone 12",
"samsumg" => "Samsung S20",
"nokia" => "Nokia 8.2"],
"tablets" => ["lenovo" => "Lenovo Yoga Smart Tab",
"samsung" => "Samsung Galaxy Tab S5",
"apple" => "Apple iPad Pro"]
];
статья взята с сайта: