Преобразование массивов
Преобразование массивов в текстовые строки (и наоборот)
Иногда необходимо выполнять операции над данными в специальном формате. Например, надо вывести слова предложения в отдельных строках. Одним из вариантов решения данной задачи является добавление перед выводом после каждого слова символа '\n' . Это легко можно осуществить с помощью оператора foreach, если предложение представляет собой массив, а не текстовую строку. РНР как раз позволяет создавать массив, элементами которого являются слова некоторого предложения.
Для того чтобы переписать содержимое текстовой строки в массив, можно воспользоваться функцией:
$arrayname = explode("символ", строка);
Первым аргументом данной функции является символ, который используется для разбиения строки и представления ее в виде массива. Рассмотрим следующий пример:
$string1 = "Это: новый: дом";
$testarray = explode(":", $string1);
print_r($testarray);
Функция explode() используется для разделения строки $string1 символом двоеточия (:) и создания массива $testarray, содержащего подстроки. Результатом ее выполнения будет:
Array
(
[0] => Это
[1] => новый
[2] => дом
)
При этом переменная $string1 не изменяет свое значение.
И наоборот, аналогичным образом массивы можно преобразовывать в строки. Для выполнения этой операции предназначена функция
$resString = implode("символ", $массив);
В результате будет создана строка $resString, состоящая из элементов массива $массив, разделенных символом. Рассмотрим следующий пример:
$arrayIn = array("красный", "синий", "зеленый");
$stringOut = implode(";", $arrayIn);
echo $stringOut;
Результат выполнения функции implode() будет присвоен переменной $stringOut.
Так же как и в случае с функцией explode(), implode() не изменяет значения входных аргументов, а только считывает их. Если какая-то функция будет преобразовывать входные параметры, об этом будет сказано отдельно.
В результате выполнения последнего выражения получим:
красный;синий;зеленый
Между вставленными в строку элементами массива нет пробелов, поскольку они не были указаны в параметрах функции implode(). Следующее выражение позволяет выполнить эту операцию:
$stringOut = implode("; ", $arrayIn);
Таким образом, в результате выполнения этой функции получим:
красный; синий; зеленый
Преобразование переменных в массивы (и наоборот)
Иногда данные элементов массива необходимо сохранить в переменных, которые впоследствии можно использовать в выражениях РНР. Либо может возникнуть потребность в обратной операции — преобразовать переменные в элементы массива. Например, нужно выполнить одну и ту же операцию (прибавление 1) над несколькими переменными. Если преобразовать переменные в массив, с помощью одного оператора foreach можно получить доступ ко всем значениям и выполнить требуемые действия. В противном случае пришлось бы отдельно для каждой переменной писать свою строку кода.
Для решения этих задач в языке РНР предусмотрены функции extract() и compact(). Функция extract() позволяет получать значения элементов массива и присваивать их переменным, именами которых являются соответствующие индексы. Другими словами, значение каждого элемента копируется в переменную с именем индекса. Рассмотрим следующий пример, в котором с помощью функции extract() выводятся все данные массива:
$testarray = array("pink" => "гвоздика", "red" => "роза");
extract($testarray);
echo "Моим любимым красным цветком является $red.\n";
echo "Моим любимым розовым цветком является $pink.";
В результате будет выведено:
Моим любимым красным цветком является роза.
Моим любимым розовым цветком является гвоздика.
Функция compact() предназначена для выполнения обратного действия — преобразования набора переменных в массив. При этом значения переменных копируются в массив. Рассмотрим следующий пример:
$color1 = "красный";
$color2 = "синий";
$а = "фиолетовый";
$Ь = "оранжевый";
$arrayln = array("a", "b");
$arrayOut = compact ("color1", "color2", $arrayIn) ;
В результате получим следующий массив:
$arrayOut[color1] = красный
$arrayOut[color2] = синий
$arrayOut[a] = фиолетовый
$arrayOut[b] = оранжевый
Видно, что имена переменных использовались в качестве индексов.
Следует заметить, что в функции compact() использовались два метода для создания массива:
- Первый состоит в использовании имен переменных напрямую для индексов. Так происходит с переменными $color1 и $color2.
- Второй состоит в использовании массива, содержащего имена переменвых. В предыдущем примере таковым является $arrayIn с переменными $а и $Ь. Функция compact() добавляет эти имена в результирующий массив $arrayOut.
Язык РНР позволяет использовать оба метода. Если имеется несколько переменных, которые необходимо сгруппировать в массив, первый метод является более предпочтительным. В противном случае лучше применять второй метод, объединив сначала имена переменных в некоторый массив, а затем использовать его в качестве аргумента функции compact().
Разбиение и слияние массивов
Часто необходимо объединять или разделять массивы. Предположим, например, что имеются два класса студентов и два соответствующих массива, содержащих их имена. Если нужно было бы объединить оба класса, это же действие пришлось бы выполнять и для массивов.
РНР позволяет разбить массив и создать новый, содержащий подмножество элементов исходного. Общий синтаксис функции, выполняющей это действие, имеет следующий вид:
$subArray = array_slice($массив, n1, n2);
Параметр n1 указывает позицию элемента, с которого начнется разбиение исходного $массива (0 — с первого элемента, 1 — со второго), а n2 — количество элементов нового массива. Например:
$testarray = array("красный", "зеленый", "синий", "розовый");
$subArray = array_slice($testarray , 1, 2);
В результате массив $subArray будет иметь вид:
[0] => зеленый
[1] => синий
Разбиение массива $testarray начинается с позиции номер 1 и содержит два элемента.
По умолчанию отсчет начинается с 0, а не с 1, поэтому первый элемент результирующего массива имеет значение "зеленый", а не "красный".
Аналогичным образом можно объединить различные массивы, используя следующее выражение:
$bigArray = array_merge($массив2, $массив2, ...);
Рассмотрим пример объединения двух массивов:
$array1 = array("красный", "синий");
$array2 = array("зеленый", "желтый");
$bigArray = array_merge($array1, $array2);
В результате будет создан массив $bigArray:
$bigArray[0] = красный
$bigArray[1] = синий
$bigArray[2] = зеленый
$bigArray[3] = желтый
Таким же образом можно объединять массивы не только с числовыми индексами, но и с текстовыми. Однако, если индексы для некоторых элементов совпадают, последний из них заменит первоначальный. Рассмотрим следующий пример:
$array1 = array("color1" => "красный", "color2" => "синий");
$array2 = array("color1" => "зеленый", "color3" => "желтый");
$bigArray = array_merge($arrayl, $array2);
В результате получим:
$bigArray[color1] = зеленый
$bigArray[color2] = синий
$bigArray[color3] = желтый
Если необходимо объединить массивы с одинаковыми индексами, следует воспользоваться функцией array_merge_recursive(), а не array_merge(). В этом случае будет создан многомерный массив, а не заменены исходные значения. Многомерные массивы более подробно рассматриваются в разделе в следующем разделе.
Сравнение массивов
Очень часто необходимо знать, совпадают ли массивы. Для этого надо найти одинаковые и различные элементы. Эта операция может быть выполнена с помощью функции:
$diffArray = array_diff($массив1, $массив2, ...);
В результате выполнения функции array_diff() массив $diffArray будет содержать элементы из $array1, отсутствующие в $аrrау2. При этом в результирующем массиве ключи сохранят свои значения. Рассмотрим следующий пример:
$array1 = аггау("а" => "яблоко", "Ь" => "апельсин", "с" => "банан");
$array2 = array("слива", "апельсин", "банан");
$diffArray = array_diff($array1, $array2);
В результате выполнения этого фрагмента кода получим:
$diffArray[a] = яблоко;
Поскольку элемент со значением "яблоко" находится в массиве $array1, но не в $аrrау2, он записывается в результирующий $diffArray с индексом "а".
Порядок следования аргументов в функции array_diff() является очень важным. Так, если последнюю строку кода в предыдущем примере переписать как
$diffArray = array_diff($array2, $array1);
то результирующий массив $diffArray будет иметь вид:
$diffArray[0] = слива;
Единственным элементом, который находится в массиве $аrrау2, но не в $array1, будет элемент со значением "слива". Именно поэтому он и записывается в $diffArray.
Если необходимо найти элементы, отличающиеся либо своим значением, либо ключом, следует воспользоваться следующей функцией:
$diffArray = array_diff_assoc($array1, $array2);
Подставляя в качестве аргументов функции array_diff_assoc() массивы, которые использовались в предыдущем примере, получим следующий результат:
$diffArray[a] = яблоко
$diffArray[b] = апельсин
$diffArray[с] = банан
В этом случае ни один из элементов массива $array1 не содержится в $аrrау2, поскольку индексы у них различны.
Чтобы найти одинаковые элементы в двух и более массивах, в РНР предусмотрена функция:
$simArray = array_intersect($массив1, $массив2, ...);
Рассмотрим пример использования этой функции для массивов из предыдущих примеров:
$simArray = array_intersect($array1, $array2);
В результате массив $simArray будет иметь такие элементы:
$simArray[b] = апельсин
$simArray[c] = банан
Функция array_intersect() считает элементы одинаковыми, если их значения равны. Для того чтобы учитывать равенство как ключа, так и значения элемента, в языке PНР предназначена функция array_intersect_assoc(), которая имеет следующий синтаксис:
$simArray = array_intersect_assoc($array1 , $array2);
В результирующий массив $simArray будут записаны только те элементы $array1 и $аrrау2, которые имеют одинаковые ключ и значение. Используя в качестве аргумектов все те же массивы, результатом будет пустой массив, поскольку исходные не содержат одинаковых индексов.
Суммирование массивов
Для сложения всех значений массива следует использовать функцию:
$sum = array_sum($array);
Например:
$arrayAdd = array(3, 3, 3);
$sum = array_sum($arrayAdd);
echo $sum;
В результате будет получено значение 9.
Просуммировать можно только числовые массивы. Но, как уже упоминалось в предыдущих разделах, при использовании (в данном случае при попытке их "сложения") текстовые строки автоматически преобразуются в 0.
Удаление повторяющихся элементов
Очень часто необходимо удалить повторяющиеся элементы в массиве. Например, имеется массив с именами покупателей, который нужно вывести на экран без повторений. Это можно осуществить, используя выражение:
$names = array("Мэри", "Салли", "Салли", "Сэм");
$names2 = array_unique($names);
В результате массив $names2 будет иметь такой вид:
$names2[0] => Мэри
$names2[1] => Салли
$names2[3] => Сэм
Как можно увидеть, в результирующем массиве продублированный элемент был удален.
Перестановка ключей и значений в массиве
РНР позволяет менять местами индексы (а точнее, ключи) и значения элементов массива. Пусть, например, имеется следующий массив:
$testarray['rose'] = red
$testarray['iris'] = purple
Для перестановки значений и ключей следует воспользоваться функцией:
$arrayFlipped = array_flip($testarray);
В результате будем иметь:
$testarray['red'] = rose
$testarray['purple'] = iris