Вы находитесь на странице: 1из 5

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 22. АССОЦИАТИВНЫЕ МАССИВЫ. ОПЕРАЦИИ НАД МАССИВАМИ.


СПИСКИ И СТРОКИ.

Доступ по ключу
Предположим у нас есть следующие массивы:
- ассоциативный массив $goods;
- двумерный ассоциативный массив $cars;
- массив-список $todo;
- двумерный массив-список $word_list;
К элементу любого из них (в общем как и к любому массиву в PHP) возможен
доступ по их ключу. Конечно, если Вы знаете искомый ключ элемента.
Осуществляется это следующим образом:
- echo $goods[‘fruits’]; //Выведет элемент с ключом fruits
- echo $cars[‘BMW’][‘Color’]; //Выведет элемент с ключами BMW и Colors
- echo $todo[2]; //Выведет 3-й элемент массива (да, именно третий, т. к. нумерация
элементов в массивах-списках начинается с 0)
- echo $word_list[‘A’][‘4’]; //Выведет 5-й элемент массива с ключом А массива
$word_list
Операция присваивания производится аналогично такой же операции у
обычных переменных, в т. ч. и при работе со ссылочными переменными:
- $goods[‘Vegetables’] = ‘Tomatoes’; //Присвоит массиву элемент с ключом Vegetables
и значением Tomatoes
- $BMWEngine = &$cars[‘BMW’][‘Engine’]; //Создание ссылки на элемент массива $cars
с ключами BMW и Engine

Функция count()
В одном из уроков Вы уже сталкивались с этой функцией и узнали, что она
позволяет вычислить количество элементов в массиве:
$arr_num = count($array); //Присваивает $arr_num значение, равное количеству
элементов массива $array.
Интересный момент – функция работает не только с массивами, но и с
обычными переменными, в т. ч. и с объектами, но для них она всегда возвращает
значение равное 1.

Слияние массивов
Представим, что у Вас есть 2 массива, которые Вам необходимо объединить
в один:
$fruits = [“Яблоки” => “Гольден”, “Виноград” => “Изабелла”];
$vegetables = [“Огурцы” => “Короткоплодные”, “Томаты” => “Розовые”];
Так, PHP позволяет воспользоваться оператором + для подобных действий:
$food = $fruits + $vegetables;
Результатом этих действий станет новый массив $food, который будет
содержать элементы массивов в порядке их добавления, т. е. сначала в нем будут
идти элементы из массива $fruits, а затем – из $vegetables. Таким образом, правило
о перестановке слагаемых в случае массивов не действует и $fruits + $vegetables !+
$vegetables + $fruits.
Посмотрим в листинге 22.1. подтверждение данного правила:

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Листинг 22.1. Перестановка слагаемых при слиянии массивов


оператором +

$fruits = ['Яблоки' => 'Гольден', 'Виноград' => 'Изабелла'];


$vegetables = ['Огурцы' => 'Короткоплодные', 'Томаты' => 'Розовые'];
$fv = $fruits + $vegetables;
$vf = $vegetables + $fruits;
echo "<p>Результат fruits + vegetables:</p>";
foreach($fv as $k => $v)
echo "<p>{$k}: $v</p>";
echo "<hr>";
echo "<p>Результат vegetables + fruits:</p>";
foreach($vf as $k => $v)
echo "<p>{$k}: $v</p>";
echo "<hr>";

Кроме того, с оператором + нужно быть особо внимательным при слиянии


массивов-списков.
Так, для массивов-списков оператор + не учитывает наличие элементов с
одинаковыми ключами и, соответственно, при слиянии массивов выберет только те
элементы, которые стоят первыми при операции слияния:
Листинг 22.2. Слияние массивов списков.

$list_array1 = ['first_element', 'second_element', 'third_element'];


$list_array2 = ['fourth_element', 'fifth_element'];
$list_array3 = ['sixth_element'];
$list_array = $list_array1 + $list_array2 + $list_array3;
foreach($list_array as $v)
echo "<p>{$v}</p>";

Обновление элементов
Помимо такого нюанса, как слияние массивов, может озадачить поведение
оператора +=, который, казалось бы, должен позволять обновлять существующие
массивы без создания новых. Однако такого не происходит.
Для подобной операции подойдет функция array_merge($main_array, $add_array),
существующая в PHP как раз для таких целей. В ней указываются 2 параметра:
- $main_array – массив, который надо обновить;
- $add_array – массив, данные из которого должны обновить $main_array.
Результат работы обоих операторов показан в листинге 27.3.
Листинг 22.3. Обновление элементов

$assoc_arr = ['key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'];
$add_arr = ['key2' => 'value4'];

//Обновление элементов оператором +=


$assoc_arr += $add_arr;
echo "<p><b>Действие оператора +=</b><p>";

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

foreach($assoc_arr as $k => $v)


echo "<p>$k : $v";
echo "<hr>";

//Обновление элементов функцией array_merge()


$assoc_arr = array_merge($assoc_arr, $add_arr);
echo "<p><b>Действие функции array_merge()</b><p>";
foreach($assoc_arr as $k => $v)
echo "<p>$k : $v";
echo "<hr>";

Перебор массивов
В PHP для массивов-списков и для ассоциативных массивов существуют свои
способы перебора. Для этого используются либо циклы for(), либо, для
ассоциативных массивов – цикл foreach(). Но, стоит заметить, цикл foreach()
позволяет перебрать ассоциативный массив только в прямом порядке.
Рассмотрим все эти способы на практических примерах в листинге 22.4.
Листинг 22.4. Способы перебора массивов.

//Перебор массивов-списков
$list_array = [];
for($i = 0; $i <= 10; $i++)
$list_array[] = $i * ($i / 2) * ($i + 5);

//Прямой перебор
echo "<p><b>Прямой перебор массива-списка list_array:</b></p>";
for($i = 0; $i < count($list_array); $i++)
echo "<p>list_array[$i]: $list_array[$i]</p>";
echo "<hr>";

//Обратный перебор
echo "<p><b>Обратный перебор массива-списка list_array:</b></p>";
for($i = count($list_array) - 1; $i >= 0; $i--)
echo "<p>list_array[$i]: $list_array[$i]</p>";
echo "<hr>";

//Перебор ассоциативного массива


$assoc_array = [];
for($i = 0, $j = 'A'; $i <= 9; $i++, $j++)
$assoc_array[$j] = $j."...".(++$j);

//Прямой перебор
echo "<p><b>Прямой перебор ассоциативного массива assoc_array:</b></p>";
for(reset($assoc_array); ($key = key($assoc_array)); next($assoc_array))
echo "<p>assoc_array[$key] => {$assoc_array[$key]}";
echo "<hr>";

3
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

//Обратный перебор
echo "<p><b>Обратный перебор ассоциативного массива assoc_array:</b></p>";
for(end($assoc_array); ($key = key($assoc_array)); prev($assoc_array))
echo "<p>assoc_array[$key] => {$assoc_array[$key]}";
echo "<hr>";

//Прямой перебор ассоциативного массива с помощью цикла foreach


echo "<p><b>Прямой перебор ассоциативного массива assoc_array с помощью цикла
foreach:</b></p>";
foreach($assoc_array as $k => $v)
echo "<p>assoc_array[$k] => $v";

Массивы-списки и строки
В связи с тем, что в PHP очень часто приходится работать со строками,
существуют специальные функции, позволяющие разбивать строки на отдельные
фрагменты, а также, наоборот, собирать из массивов строки.
Функция для разбиения называется explode():
list explode(string $symb, string $str [, int $limit])
Функция возвращает массив-список. В параметры функции входят следующие
элементы:
- $symb – строковый формат, содержащий символ разбиения строки,
например, «/»;
- $str – строка, которую требуется разбить на фрагменты;
- $limit – параметр, позволяющий установить количество участков разреза –
при указании параметра, функция пройдет только $limit участков строки и сделает
($limit - 1) разрезов. Параметр может принимать отрицательные значения, что будет
означать прохождение с конца строки.
Функция implode() позволяет «сшить» массив-список обратно в строку. У этой
функции есть функция-синоним join():
string implode(string $glue, list $list)
string join(string $glue, list $list)
В этих функциях действуют следующие параметры:
- $glue – строковый параметр, означающий строку, которая будет
использоваться в качестве соединителя в новой строке;
- $list – массив-список, содержащий строковые элементы, которые необходимо
«сшить» в строку.
Отдельно стоит отметить, что для этих функций допустимо использовать
ассоциативные массивы. В этом случае функция будет воспринимать их, как
массивы-списки, без учета ассоциативных ключей.
Рассмотрим, как действуют эти функции в листинге 27.5.
Листинг 22.5. Функции взаимодействия массивов и строк.

//Функция explode()
$string_to_list = "Буря мглою небо кроет...";
$list = explode(" ", $string_to_list);

4
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

echo "<p><b>Результат действия функции explode() для строки


{$string_to_list}:</b></p>";
foreach($list as $v)
echo "<p>$v<p>";
echo "<hr>";

//Функция implode()
$array_to_str = ['A' => 'У', 'B' => 'попа', 'C' => 'была', 'D' => 'собака'];
$str1 = implode(" ", $array_to_str);
echo "<p><b>Результатом действия функции implode() для массива
array_to_str:</b></p>";
foreach($array_to_str as $k => $v)
echo "<p>{$k}: $v</p>";
echo "<p><b>является строка str1:</b> $str1</p>";
echo "<hr>";

//Функция join()
$str2 = join(" ", $array_to_str);
echo "<p><b>Результатом действия функции join() для массива array_to_str:</b></p>";
foreach($array_to_str as $k => $v)
echo "<p>{$k}: $v</p>";
echo "<p><b>является строка str2:</b> $str2</p>";