Вредоносное ПО (malware) - это назойливые или опасные программы,...
В этой главе:
Массив (array) - это переменная специального типа, хранящая много элементов данных. Маcсив позволяет обратиться отдельно к любому из составляющих его элементов (поскольку внутри массива они хранятся отдельно), а также есть возможность копировать или обрабатывать массив целиком.
Массивы PHP нетипизированы, это означает, что элементы массива могут иметь любой тип, причем разные элементы в массиве могут иметь различные типы. Помимо этого массивы PHP являются динамическими, это означает, что фиксированный размер объявлять не нужно и новые элементы можно добавлять в любое время.
Основные сведения о массивах
Чтобы работать с массивами, вам нужно освоить два новых понятия: элементы и индексы. Элементы - это значения хранящиеся в массиве, значения могут быть абсолютно любого типа. К каждому элементу можно обратиться по его уникальному индексу. В качестве индекса может использоваться целое число или строка.
Массивы можно разделить на два типа: индексные, у которых в качестве значения индекса используется только целое число и ассоциативные, где значением индекса может быть как строка так и число. Часто в ассоциативных массивах индекс называется: «ключ».
Индексные массивы обычно называют просто «массивами», а ассоциативные массивы - «хешами», «ассоциативными» или «словарями».
Создание массива
В PHP есть три способа создания массивов. Первый способ - это создание с помощью специальной функции array(). В качестве аргументов функция принимает любое количество пар ключ => значение (key => value) разделенных запятыми или просто значения, также разделяемые запятыми. Она возвращает массив, который можно присвоить переменной.
Так как указывать ключ не обязательно, значения можно добавлять в массив без его указания. Если ключ не указывается, PHP будет использовать числовые индексы. По умолчанию элементы будут нумероваться, начиная с нуля. Массивы с числовыми индексами позволяют просто добавить элемент, а PHP автоматически будет использовать предыдущее наибольшее значение ключа типа integer, увеличенное на 1.
Также можно указывать ключ для отдельных элементов:
"c", "d"); var_dump($my_array); ?>
Запустив данный пример, вы можете заметить, что последний элемент ("d") был присвоен ключу 8 . Так получилось, потому что самое большое значение ключа целого типа перед ним было 7 .
Теперь рассмотрим создание аccоциативного массива с помощью функции array(). Ассоциативный массив записывается немного по другому: для добавления элемента используется формат ключ => значение.
"30", "Февраль" => "28/29 (29 бывает каждые четыре года)", "Март" => "31", "Апрель" => "30", "Май" => "31", "Июнь" => "30", "Июль" => "31", "Август" => "31", "Сентябрь" => "30", "Октябрь" => "31", "Ноябрь" => "30", "Декабрь" => "31"); ?>
С отступами, которые вы видите в этом примере, легче добавлять элементы в массив, чем когда они записаны в одну строку.
Теперь рассмотрим второй способ создания массива: использование квадратных скобок , вместо специальной функции array():
"bar", "bar" => "foo"); // другой способ создания массива $my_array = ["foo" => "bar", "bar" => "foo"]; ?>
Разницы между этими массивами никакой нет, кроме различия в написании.
Обратите вниманием, в PHP массивы могут содержать ключи типов int и string одновременно, т.е. PHP не делает различия между индексированными и ассоциативными массивами.
"яркое", "колесо" => "круглое", 10 => "дом", -5 => 290]; ?>
Примечание: выбирая имя для массива, будьте внимательны, чтобы не использовать имя, совпадающее с именем другой переменной, так как они разделяют общее пространство имен. Создание переменной с тем же именем, что и у существующего массива, приведет к удалению массива без вывода каких-либо предупреждений.
Третий способ создания массивов будет рассмотрен в разделе «Добавление и удаление элементов массива».
Преобразование индексов
Как упоминалось в самом начале главы, ключ может быть одним из двух типов: string или integer. Поэтому ключи несоответствующие одному из этих типов будут преобразованы:
- Если в качестве ключа выступает строка, которая содержит число, то она будет преобразована к типу integer. Однако, если число является некорректным десятичным целым, например "09", то оно не будет преобразовано в тип integer.
- Вещественное число (float), также будет преобразовано в integer - дробная часть в этом случае отбрасывается. Например, если значение ключа 5.4, оно будет интерпретировано как 5.
- Булев тип (bool) также будет преобразован в integer. Например, если значение ключа true, то оно будет преобразовано в 1, а ключ со значением false соответственно будет преобразован в 0.
- Если используется тип null, он будет преобразован в пустую строку.
- Объекты и массивы не могут быть использованы в качестве ключей.
Если в объявлении массива несколько элементов используют одинаковый ключ, то использоваться будет только последний из них, а все другие будут перезаписаны.
"a", "1" => "b", // ключи преобразуются в число 1 1.5 => "c", true => "d"); var_dump($my_array); ?>
В приведенном примере все ключи будут преобразованы в единицу, основываясь на этом, массив будет содержать всего один элемент, содержание которого будет перезаписано 3 раза, в итоге, его значением станет "d".
Доступ к элементам массива
Доступ к элементам массива осуществляется с помощью квадратных скобок в которых указывается индекс/ключ: array .
"молочный",
2 => "foo");
echo $my_array["Шоколад"], "
";
echo $my_array;
?>
Еще один способ доступа к элементам массива заключается в использовании прямого разыменования массива.
hello world! ?>
Данный пример показывает, что можно обращаться к индексу массива, возвращаемого в качестве результата вызова функции или метода.
Добавление и удаление элементов массива
Теперь, когда вы получили основные понятия о массивах, рассмотрим способы записи значений в массив. Существующий массив может быть изменен явной установкой в нем значений. Это выполняется с помощью присваивания значений массиву.
Операция присваивания значения элементу массива выглядит так же, как операция присваивания значения переменной, за исключением квадратных скобок (), которые добавляются после имени переменной массива. В квадратных скобках указывается индекс/ключ элемента. Если индекс/ключ не указан, PHP автоматически выберет наименьший незанятый числовой индекс.
"ноль",
1 => "один");
$my_arr = "два";
$my_arr = "три";
var_dump($my_arr);
// присваивание без указания индекса/ключа
$my_arr = "четыре";
$my_arr = "пять";
echo "
";
var_dump($my_arr);
?>
Для изменения определенного значения, нужно просто присвоить новое значение уже существующему элементу. Чтобы удалить какой-либо элемент массива с его индексом/ключом или удалить полностью сам массив, используется функция unset():
Примечание: как уже упоминалось выше, если элемент добавляется в массив без указания ключа, PHP автоматически будет использовать предыдущее наибольшее значение ключа типа integer, увеличенное на 1. Если целочисленных индексов в массиве еще нет, то ключом будет 0 (ноль).
Учтите, что наибольшее целое значение ключа не обязательно существует в массиве в данный момент , такое может быть по причине удаления элементов массива. После того как были удалены элементы, переиндексация массива не происходит. Приведем следующий пример, чтобы стало понятнее:
";
print_r($my_arr);
// Добавляем элемент (обратите внимание, что новым ключом будет 3, вместо 0).
$my_arr = 6;
echo "
";
print_r($my_arr);
// Делаем переиндексацию:
$my_arr = array_values($my_arr);
$my_arr = 7;
echo "
";
print_r($my_arr);
?>
В этом примере использовались две новые функции, print_r() и array_values(). Функция array_values() возвращает индексированный массив (заново индексирует возвращаемый массив числовыми индексами), а функция print_r работает наподобие var_dump, но выводит массивы в более удобочитаемом виде.
Теперь мы можем рассмотреть третий способ создания массивов:
В примере был показан третий способ создания массива. Если массив $weekdays еще не был создан, то он будет создан. Однако такой вид создания массива не рекомендуется применять, так как если переменная $weekdays уже была ранее создана и содержит значение, это может привести к неожиданным результатам работы сценария.
Если у вас возникают сомнения по поводу того, является ли переменная массивом, воспользуйтесь функцией is_array . Например, проверку можно выполнить следующим образом:
"; $no = "обычная строка"; echo is_array($no) ? "Массив" : "Не массив"; ?>
Обход массива в цикле
Оператор цикла foreach осуществляет последовательный перебор всех элементов массива. Он работает только с массивами и объектами, а в случае его использования с переменными других типов или неинициализированными переменными будет сгенерирована ошибка. Есть два вида синтаксиса для данного цикла. Первый вид синтаксиса выглядит следующим образом:
Foreach ($array as $value) { инструкции }
Цикл будет перебирать заданный массив - $array (вместо $array подставляется название массива). На каждой итерации значение текущего элемента присваивается переменной $value (можно указать любое другое имя переменной). Оператор цикла foreach очень удобен, поскольку сам выполняет обход и чтение всех элементов массива, пока не будет достигнут последний. Он позволяет не держать постоянно в памяти тот факт, что индексация массивов начинается с нуля, и никогда не выходит за пределы массива, что делает конструкцию цикла очень удобной и помогает избежать распространенных ошибок. Посмотрим, как он работает на примере:
Второй вид синтаксиса foreach, выглядит так:
Foreach ($array as $key => $value) { инструкции }
При использовании данной формы синтаксиса на каждой итерации дополнительно присваивается значение текущего ключа переменной $key (можно указать любое другое имя переменной):
$value) {
echo "[$key] => ", $value, "
";
}
?>
Чтобы можно было напрямую изменять элементы массива внутри цикла, нужно использовать ссылку. В этом случае значение будет присвоено по ссылке.
Примечание: Ссылка на последний элемент массива остается даже после того, как оператор foreach завершил работу. Поэтому рекомендуется удалять ее с помощью функции unset() как показано в примере выше. Давайте посмотрим что будет, если не использовать unset(): "; foreach ($numbers as &$num) { echo $num, " "; } ?> Стоит отметить следующий момент, ссылку можно использовать только если перебираемый массив является переменной. Следующий код не будет работать:
PHP поддерживает скалярные и составные типы данных. В этой статье мы обсудим один из составных типов: массивы. Массив представляет собой набор значений данных, организованных как упорядоченный набор пар ключ-значение.
В этой статье говорится о создании массива, добавлении элементов в массив. Есть много встроенных функций, которые работают с массивами в PHP, потому что массивы являются распространенными и полезными для использования. Например, если вы хотите отправить письмо на более чем один адрес электронной почты, вы можете хранить адреса электронной почты в массиве, а затем делать цикл по массиву, отправляя сообщения на адрес электронной почты, взятый из массива.
Индексированные и ассоциативные массивы
Есть два вида массивов в PHP: индексные и ассоциативные. Ключи индексированного массива — целые числа, начиная с 0. Индексированные массивы используются, когда вам требуется конкретное положение в массиве. Ассоциативные массивы ведут себя как две колонки таблицы. Первый столбец является ключом, который используется для доступа к значению (второму столбцу).
PHP внутренне хранит все массивы в качестве ассоциативных массивов, так что единственное различие между ассоциативными и индексированными массивами является то, что появляются ключи. Некоторые функции предусмотрены в основном для использования с индексированными массивами, поскольку они предполагают, что у вас ключи являются последовательными целыми числами, начиная с 0. В обоих случаях, ключи являются уникальными — то есть, вы не можете иметь два элемента с одинаковым ключом, независимо от того, является ли ключ строкой или целым числом.
В PHP массивы имеют внутренний порядок своих элементов, который не зависит от ключей и значений, и есть функции, которые можно использовать для обхода массивов на основе этого внутреннего порядка.
Определение элементов в массива
Вы можете получить доступ к конкретным значениям из массива, используя имя массива, за которым следует ключ элемента (иногда называемый индекс) в квадратных скобках:
$age["Fred"]; $shows;
Ключ может быть строкой или целым числом. Строковые значения в виде чисел (без ведущих нулей) рассматриваются, как целые числа. Таким образом, $array и $array[‘3’] ссылаются на один и тот же элемент, но $array[’03’] ссылается на другой элемент. Отрицательные числа так же могут быть использованы в качестве ключей, но они не определяют позиции с конца массива, как в Perl.
Не обязательно писать ключ в кавычках. Например, $array[‘Fred’] подобно $arrat. Тем не менее, считается хорошим стилем PHP всегда использовать кавычки. Если индекс без кавычек, то PHP использует значение константы в качестве индекса:
Define("index",5); echo $array; // вернет $array, не $array["index"];
Если вы хотите подставить в индекс число, то нужно делать так:
$age["Clone$number"]; // вернет, например $age["Clone5"];
Однако, не указывайте ключ в кавычках в следующем случае:
// неправильно print "Hello, $person["name"]"; print "Hello, $person["name"]"; // правильно print "Hello, $person";
Хранение данных в массивах
При попытке сохранения значения в массиве — автоматически будет создан массив, если он не существовал ранее, но при попытке извлечь значение из массива, который не был определен — массив не будет создан. Например:
// $addresses не определен до этого момента echo $addresses; // ничего echo $addresses; // ничего $addresses = "[email protected]"; echo $addresses; // печать "Array"
Можно использовать простое присваивание для инициализации массива в программе:
$addresses = "[email protected]"; $addresses = "[email protected]"; $addresses = "[email protected]"; // ...
Мы объявили индексный массив с целыми индексами, начиная с 0.
Ассоциативный массив:
$price["Gasket"] = 15.29; $price["Wheel"] = 75.25; $price["Tire"] = 50.00; // ...
Более простой способ инициализации массива состоит в использовании конструкции Array() , которая строит массив из ее аргументов:
$addresses = array("[email protected]", "[email protected]", "[email protected]");
Чтобы создать ассоциативный массив с помощью Array(), используйте => символ, отделяющий индексы от значений:
$price = array("Gasket" => 15.29, "Wheel" => 75.25, "Tire" => 50.00);
Обратите внимание на использование пробелов и выравнивание. Мы могли бы сгруппировать код, но это будет менее наглядно:
$price = array("Gasket"=>15.29,"Wheel"=>75.25,"Tire"=>50.00);
Чтобы создать пустой массив, нужно вызвать конструкцию Array() без аргументов:
$addresses = Array();
Вы можете указать начальную ключ в массиве, а затем список значений. Значения вводятся в массив, начиная с ключа с последующим увеличением:
$days = array(1 => "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"); // 2 is Tuesday, 3 is Wednesday, etc.
Если начальный индекс является строкой, то последующие индексы становятся целыми числами, начиная с 0. Таким образом, следующий код является, вероятно, ошибкой:
$whoops = array("Friday" => "Black", "Brown", "Green"); // same as $whoops = array("Friday" => "Black", 0 => "Brown", 1 => "Green");
Добавление нового элемента в конец массива
Чтобы вставить несколько значений в конец существующего индексированного массива, используйте синтаксис:
$family = array("Fred", "Wilma"); // $family = "Fred" $family = "Pebbles"; // $family = "Pebbles"
Эта конструкция предполагает, что индексами массива являются числа и присваивает элементу следующий доступный числовой индекс, начиная с 0. Попытка добавить элемент в ассоциативный массив почти всегда является ошибкой программиста, но PHP добавит новые элементы с числовыми индексами (начиная с 0) без выдачи предупреждения:
$person = array("name" => "Fred"); // $person["name"] = "Fred"; $person = "Wilma"; // $person = "Wilma"
На данном этапе мы закончим вступительную часть работы с массивами в PHP. Жду вас в следующей статье.
Дата : 2010-07-09
Первым делом создадим массив. Пусть будет массив отдельных карт одной масти (пики = s). Назовем его var cards .
Var cards = ["8s","9s","Ts","Js","Qs"]; // 5 элементов (карт одной масти с 8 до дамы)
Как видите в нашем массиве 5 элементов, каждый из которых имеет свой уникальный индекс. Напомним еще раз, индексация элементов массива начинается с 0, не забывайте об этом, т.е. в нашем примере первый элемент массива ("8s") равен 0, последний ("Qs") равен 4.
Добавление элемента в конец массива
Зная, что в нашем массиве var cards всего 5 элементов и последний индекс заканчивается 4, то мы можем добавить новый элемент в массив следующим образом:
Var cards = ["8s","9s","Ts","Js","Qs"]; // 5 элементов (карт одной масти с 8 до дамы) cards = "Ks"; //добавили новый элемент в конец массива, теперь в массиве 6 элементов
Сложность такого подхода в том, что если массив содержит много элементов их подсчет может быть очень неудобным. Для таких случаев есть более простое решение - свойство массива length , которое определяет длину массива, т.е. количество элементов в массиве. Посмотрим пример:
Запустить! var cards = ["8s","9s","Ts","Js","Qs"]; // 5 элементов (карт одной масти с 8 до дамы) cards = "Ks"; /* добавляем новый элемент в массив с помощью свойства lenght */ for(i = 0; iВ 4 строке нашего кода мы добавили запись в виде cards;
. Этот код идентичен cards;
, так как свойство length
, как и говорилось выше, определяет количество всех элементов в массиве. Говоря другими словами, нам не нужно считать элементы, вместо этого пишем сам массив, ставим точку и применяем ключевое слово length
. В строке 7 мы также применяем свойство length
- сперва определяем начало отсчета счетчика с 0, далее идет условие, в котором расписываем, если значение счетчика меньше длины массива, то увеличиваем счетчик на единицу и выполняем код в фигурных скобках (в теле цикла), где выводим элементы массива с помощью команды alert(), можно применить document.write(). Иначе говоря все выглядит так:
0 меньше, чем 6? Да, меньше. Увеличиваем счетчик на 1 и выполняем код в теле цикла
1 меньше, чем 6? Да, меньше. Увеличиваем счетчик на 1 и выполняем код в теле цикла
2 меньше, чем 6? Да, меньше. Увеличиваем счетчик на 1 и выполняем код в теле цикла
.....................................................
6 меньше, чем 6? Нет. Цикл прекращается.
Метод push()
Помимо способов описанных выше, еще существует метод push() , с помощью которого мы можем добавить в конец массива любой тип данных, и даже переменную. При этом элементов может быть сразу несколько, которые записываются через запятую в круглых скобках. Рассмотрим пример:
Запустить! var cards = ["8s","9s","Ts","Js","Qs"]; // 5 элементов (карт одной масти с 8 до дамы) cards.push("Ks","As"); /* добавляем новые элементы в массив с помощью метода push() */ for(i = 0; iДобавление элемента в начало массива
Метод unshift()
Если вам необходимо добавить элементы в самом начале массива, используйте метод unshift . Он работает по тому же принципу, что и метод push().
Запустить! var cards = ["8s","9s","Ts","Js","Qs"]; // 5 элементов (карт одной масти с 8 до дамы) cards.unshift("5s","6s","7s"); /* добавляем новые элементы в массив с помощью метода unshift() */ for(i = 0; iРассмотрим способы записи значений в массив. Существующий массив может быть изменен явной установкой в нем значений. Это выполняется с помощью присваивания значений массиву.
Операция присваивания значения элементу массива выглядит так же, как операция присваивания значения переменной, за исключением квадратных скобок (), которые добавляются после имени переменной массива. В квадратных скобках указывается индекс/ключ элемента. Если индекс/ключ не указан, PHP автоматически выберет наименьший незанятый числовой индекс.
"ноль",
1 => "один");
$my_arr = "два";
$my_arr = "три";
var_dump($my_arr);
// присваивание без указания индекса/ключа
$my_arr = "четыре";
$my_arr = "пять";
echo "
";
var_dump($my_arr);
?>
Для изменения определенного значения, нужно просто присвоить новое значение уже существующему элементу. Чтобы удалить какой-либо элемент массива с его индексом/ключом или удалить полностью сам массив, используется функция unset() :
Примечание: как уже упоминалось выше, если элемент добавляется в массив без указания ключа, PHP автоматически будет использовать предыдущее наибольшее значение ключа типа integer , увеличенное на 1. Если целочисленных индексов в массиве еще нет, то ключом будет 0 (ноль).
Учтите, что наибольшее целое значение ключа не обязательно существует в массиве в данный момент , такое может быть по причине удаления элементов массива. После того как были удалены элементы, переиндексация массива не происходит. Приведем следующий пример, чтобы стало понятнее:
";
print_r($my_arr);
// Добавляем элемент (обратите внимание, что новым ключом будет 3, вместо 0).
$my_arr = 6;
echo "
";
print_r($my_arr);
// Делаем переиндексацию:
$my_arr = array_values($my_arr);
$my_arr = 7;
echo "
";
print_r($my_arr);
?>
В этом примере использовались две новые функции, print_r() и array_values() . Функция array_values() возвращает индексированный массив (заново индексирует возвращаемый массив числовыми индексами), а функция print_r работает наподобие var_dump , но выводит массивы в более удобочитаемом виде.
Теперь мы можем рассмотреть третий способ создания массивов:
В примере был показан третий способ создания массива. Если массив $weekdays еще не был создан, то он будет создан. Однако такой вид создания массива не рекомендуется применять, так как если переменная $weekdays уже была ранее создана и содержит значение, это может привести к неожиданным результатам работы сценария.
Если у вас возникают сомнения по поводу того, является ли переменная массивом, воспользуйтесь функцией is_array . Например, проверку можно выполнить следующим образом:
"; $no = "обычная строка"; echo is_array($no) ? "Массив" : "Не массив"; ?>
Для преобразования массивов в php есть множество функций и операторов: Сборник функций для работы с массивами
Есть несколько способов, чтобы добавить массив в массив при помощи php и все они могут пригодиться для отдельных случаев.
«Оператор +»
Это простой, но коварный способ:
$c = $a + $b
Так добавляются только те ключи, которых еще нет в массиве $a. При этом элементы дописываются в конец массива.
То есть если ключ из массива $b отсутствует в массиве $a, то в результирующем массиве добавится элемент с этим ключом.
Если в массиве $a уже есть элемент с таким ключом, то его значение останется без изменений.
Иными словами от перемены мест слагаемых сумма меняется: $a + $b != $b + $a - это стоит запомнить.
А теперь более подробный пример, чтобы проиллюстрировать это:
$arr1 = ["a" => 1, "b" => 2]; $arr2 = ["b" => 3, "c" => 4]; var_export($arr1 + $arr2); //array (// "a" => 1, // "b" => 2, // "c" => 4, //) var_export($arr2 + $arr1); //array (// "b" => 3, // "c" => 4, // "a" => 1, //)
Функция array_merge()
Использовать эту функцию можно следующим образом:
$result = array_merge($arr1, $arr2)
Она сбрасывает числовые индексы и заменяет строковые. Отлично подходит для того, чтобы склеить два или несколько массивов с числовыми индексами:
Если входные массивы имеют одинаковые строковые ключи, тогда каждое последующее значение будет заменять предыдущее. Однако, если массивы имеют одинаковые числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет добавлено в конец массива.
Функция array_merge_recursive
Делает то же самое, что и array_merge только еще и рекурсивно проходит по каждой ветке массива и проделывает то же самое с потомками.
Функция array_replace()
Заменяет элементы массива элементами других переданных массивов.
Функция array_replace_recursive()
То же что и array_replace только обрабатывает все ветки массива. Справка по array_replace_recursive.
Другие функции
Для работы с массивами в php есть еще ряд полезных функций, о существовании которых желательно знать. Прочитать о них можно по ссылке: