Преобразование массивов
Преобразование массивов в текстовые строки (и наоборот)Иногда необходимо выполнять операции над данными в специальном формате. Например, надо вывести слова предложения в отдельных строках. Одним из вариантов решения данной задачи является добавление перед выводом после каждого слова символа '\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
|