Для преобразования массивов в 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 только обрабатывает все ветки массива.
Добавление элементов в массив
Если массив существует, в него можно добавлять дополнительные элементы. Это делается напрямую с помощью оператора присваивания (знак равенства) так же, как присвоение значения строке или числу. При этом можно не зада вать ключ добавленного элемента, но в любом случае при обращении к масси ву необходимы квадратные скобки. Добавляя два новых элемента к списку $List, напишем:
$List = "pears";
$List = "tomatoes";
Если ключ не задан, каждый элемент будет добавлен к существующему мас сиву и проиндексирован следующим порядковым номером. Если мы добавим новые элементы к массиву из предыдущего раздела, элементы которого имели индексы 1, 2 и 3, то у груш (pears) будет индекс 4, а у помидоров (tomatoes) 5. Когда вы явно задаете индекс, а значение с ним уже существует, то существо вавшее в этом месте значение будет потеряно и заменено новым:
$List = "pears";
$List = "tomatoes";
Теперь значение элемента с индексом 4 «помидоры», а элемента «апельси ны» (oranges) больше нет. Я бы посоветовал не указывать ключ при добавле нии элементов в массив, если, конечно, вы не хотите специально переписать какиелибо существующие данные. Однако, если в качестве индексов исполь зуются строки, ключи нужно указывать обязательно, чтобы не потерять зна чения.
Мы попробуем добавить в массив новые элементы, переписав сценарий soups.php. Сначала распечатав исходные элементы массива, а затем исходные вместе с добавленными, мы легко увидим произошедшие изменения. Подобно тому как можно узнать длину строки (количество содержащихся в ней символов) с помощью функции strlen () , также нетрудно определить ко личество элементов в массиве с помощью функции count () :
$HowMany = count($Array);
- Откройте файл soups.php в текстовом редакторе.
- После инициализации массива с помощью функции array () добавьте сле дующую запись: $HowMany = count($Soups);
- Добавьте в массив три дополнительных элемента. $Soups["Thursday"] = "Chicken Noodle";
- Пересчитайте элементы в массиве и распечатайте это значение. $HowManyNow = count($Soups);
- Сохраните сценарий (листинг 7.2), загрузите его на сервер и протестируй те в браузере (рис.).
print ("The array contains $HowMany elements.
\n");
Функцией count () будет определено, сколько элементов содержится в мас сиве $ Soups. Присвоив это значение переменной, его можно распечатать.
$Soups["Friday"] = "Tomato";
$Soups["Saturday"] = "Cream of Broccoli";
print ("The array now contains $HowManyNow elements.
\n");
Листинг 7.2 т Можно напрямую добавлять по одному элементу в массив, присваивая каждому элементу значение с помощью соответствующего опера тора. С помощью функции count () удастся узнать, сколько элементов содер жится в массиве.
1
2
3
4
5 6 $Soups = array(
7 "Monday"=>"Clam Chowder",
8 "Tuesday"=>"White Chicken Chili",
9 "Wednesday"=>"Vegetarian");
11 print ("The array contains $HowMany
elements.
\n");
12 $Soups["Thursday"] = "Chicken Noodle";
13 $Soups["Friday"] = "Tomato";
14 $Soups["Saturday"] = "Cream of
Broccoli";
15 $HowManyNow = count($Soups);
16 print ("The array now contains
$HowManyNow elemente.
\n");
17 ?>
18
19
В РНР 4.0 появилась новая функция, позволяющая добавлять один массив к другому. Эту операцию можно также назвать слиянием или сцеплением мас сивов. Функция array_merge () вызывается следующим образом:
$NewArray = array_merge ($OneArray, $TwoArray);
Вы можете переписать страницу soups.php с использованием этой функции, если работаете с сервером, на котором установлен РНР 4.0.
Объединение двух массивов
- Откройте файл soups.php в текстовом редакторе, если он еще не открыт.
- После инициализации массива $Soups сосчитайте его элементы и напеча тайте результат. $HowMany = count($Soups);
- Объедините два массива в один. $TheSoups = array_merge ($Soups, $Soups2);
- Сосчитайте элементы нового массива и напечатайте результат. $HowMany3 = count($TheSoups);
- Закройте РНР и HTMLдокумент. ?>
- Сохраните файл (листинг 7.3), загрузите его на сервер и протестируйте в браузере (рис.).
print ("The $Soups array contains $HowMany elements.
\n");
- Создайте второй массив, сосчитайте его элементы и также напечатайте
результат.
"Thursday"=>"Chicken Noodle",
"Friday"=>"Tomato",
"Saturday"=>"Cream of Broccoli");
$HowMany2 = count($Soups2);
print ("The $Soups2 array contains $HowMany2 elements.
\n");
Проследите, чтобы массивы были расположены именно в этом порядке ($Soups, потом $Soups2), то есть элементы четверга и пятницы должны быть добавлены к элементам понедельника среды, а не наоборот.
print ("The $TheSoups array contains
-$HowMany3 elements.
\n");
Листинг 7.3 т Функция Array_merge () явля ется новой. Это одна из нескольких дополни тельных функций РНР 4.0, предназначенная для работы с массивами. Используя массивы, мож но значительно сэкономить время.
1
2
3
4
5 6 $Soups = array!
7 "Monday"=>"Clam Chowder",
"Tuesday"=>"White Chicken Chili",
8 "Wednesday"=>"Vegetarian"
9);
10 $HowMany = count($Soups);
11 print ("The $Soups array contains $HowMany elements.
\n");
12 $Soups2 = array(
13 "Thursday"=>"Chicken Noodle",
14 "Friday"=>"Tomato",
15 "Saturday"=>"Cream of Broccoli"
16); .
17 $HowMany2 = count($Soups2);
18 print ("The $Soups2 array contains $HowMany2 elements.
\n");
19 $TbeSoupe = array_merge ($Soups, $Soups2);
20 $HowMany3 = count ($TheSoups) ;
21 print ("The $TheSoups array contains .$HowMany3 elements.
\n");
22 ?> "
23
24
Будьте внимательны при добавлении элементов в массив напрямую. Правильно это делается так: $Ar ray = "Add This"; ияи$Аггау = "Add This";, ане правильно вот так: $Аггау = " Add This";. Если вы забыли поставить скобки, то добавленное значение уничтожит существующий массив, превратив его в простую строку или число.
В РНР 4.0 есть несколько новых функций для работы с массивами. Не все они рас смотрены в книге. Однако полная информация по этому вопросу содержится в ру ководстве по языку РНР, которое можно найти на сайте РНР. Будьте внимательны и не используйте новые функции, присущие только РНР 4.0, если на вашем серве ре работает РНР 3.x.
Рассмотрим способы записи значений в массив. Существующий массив может быть изменен явной установкой в нем значений. Это выполняется с помощью присваивания значений массиву.
Операция присваивания значения элементу массива выглядит так же, как операция присваивания значения переменной, за исключением квадратных скобок (), которые добавляются после имени переменной массива. В квадратных скобках указывается индекс/ключ элемента. Если индекс/ключ не указан, 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, потому что массивы являются распространенными и полезными для использования. Например, если вы хотите отправить письмо на более чем один адрес электронной почты, вы можете хранить адреса электронной почты в массиве, а затем делать цикл по массиву, отправляя сообщения на адрес электронной почты, взятый из массива.
Индексированные и ассоциативные массивы
Есть два вида массивов в 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 = "spam@cyberpromo.net"; echo $addresses; // печать "Array"
Можно использовать простое присваивание для инициализации массива в программе:
$addresses = "spam@cyberpromo.net"; $addresses = "abuse@example.com"; $addresses = "root@example.com"; // ...
Мы объявили индексный массив с целыми индексами, начиная с 0.
Ассоциативный массив:
$price["Gasket"] = 15.29; $price["Wheel"] = 75.25; $price["Tire"] = 50.00; // ...
Более простой способ инициализации массива состоит в использовании конструкции Array() , которая строит массив из ее аргументов:
$addresses = array("spam@cyberpromo.net", "abuse@example.com", "root@example.com");
Чтобы создать ассоциативный массив с помощью 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. Жду вас в следующей статье.