|
Я думаю, что предыдущие уроки работы с массивами вы прошли и уже думаете, когда же они закончатся. Конечно же, несмотря на довольно серьёзный объём, такое многообразие возможностей в PHP будет полезно, не в первых ваших скриптах, так со временем. Последний урок по работе с массивами и последние функции для изучения.
Strtr - Strtr - Комплексная замена в строке.
- Синтаксис: string strtr(string str, string from, string to), string strtr(string str, array from)
Первый пример синтаксиса вернёт строку, в которой будут заменены все необходимые символы «FROM» на «TO». Если же отправляемый элемент будет длиннее заменяемого – лишние символы просто проигнорируются. Второй пример так же заменяет строки, но при этом функция пытается заменить сначало наибольшие фрагменты исходной строки и не выполняет замену в уже модифицированных частях строки. Таким бразом, теперь мы можем выполнить несколько замен сразу: $Subs = array( "" => "Larry", "" => date("d.m.Y") ); $st="Привет, <name>! Сейчас <time"; echo strtr($st,$Subs);
А вот как можно "отменить" действие функции HtmlSpecialChars(): $Trans=array_flip(get_html_translation_table()); $st=strtr($st, $Trans);
В результате мы из строки, в которой все спецсимволы заменены на их HTML-эквиваленты, получим исходную строку.
Работа с несколькими массивамиarray_diff
- array_diff - Определение исключительного пересечения массивов.
- Синтаксис: array array_diff(array arr1, array arr2 [, array ...])
Данная функция возвращает массив, который содержит значения, имеющиеся только в массиве arr1 ( и не имеющиеся в любых других). При этом индексы не сохраняются.
$arr1 = array("a" => "green", "red", "blue"); $arr2 = array("b" => "green", "yellow", "red"); $result = array_diff($arr1, $arr2); // $result = array("blue")
array_intersect - array_intersect - Определение включительного пересечения массивов.
- Синтаксис: array array_intersect(array arr1, array arr2 [, array ...])
Функция array_intersect() возвращает массив, который содержит значения массива arr1, имеющиеся во всех остальных массивах. При этом индексы не сохраняются.
$arr1 = array("a" => "green", "red", "blue"); $arr2 = array("b" => "green", "yellow", "red"); $result = array_intersect($arr1, $arr2); // $result = array("a" => "green", "red")
array_merge - array_merge - Слияние массивов.
- Синтаксис: array array_merge(array arr1, array arr2 [, array ...])
Функция array_merge() призвана устранить все недостатки, присущие оператору + для слияния массивов. А именно, она сливает массивы, перечисленные в ее аргументах, в оди большой массив и возвращает результат. Если в массивах встречаются одинаковые ключи, в результат помещается пара ключ=>значение из того массива, который расположен правее в списке аргументов. Однако это не затрагивает числовые ключи: элементы с такими ключами помещаются в конец результирующего массива в любом случае.
$L1=array(10,20,30); $L2=array(100,200,300); $L=array_merge($L1, $L2); // теперь $L===array(10,20,30,100,200,300);
array_merge_recursive - array_merge_recursive - Объединение сложных массивов.
- Синтаксис: array array_merge_recursive(array arr1, array arr2 [, array ...])
Функция array_merge_recursive() сильно напоминает функцию array_merge() с тем дополнением, что она может работать с многомерными и древовидными массивами, а элементы с одинаковыми строковыми индексами превращаются в подмассивы. Для числовых индексов поведение функции аналогично array_merge().
$arr1 = array("color" => array("favorite" =>"red"), 5); $arr2 = array(10, "color" => array("favorite" =>"green"), "blue"); $result = array_merge_recursive($arr1, $arr2); // $result = array("color" => array ( // "favorite" => array("red", "green"), // "blue"), 5, 10)
Получение и удаление части массиваarray_slice
- array_slice - Получение части массива.
- Синтаксис: array array_slice(array arr, int offset [, int len])
Эта функция возвращает часть ассоциативного массива arr, начиная с элемента со смещением (номером) offset от начала и длиной len (если последний параметр не задан, до конца массива).
Параметры offset и len задаются по точно таким же правилам, как и аналогичные параметры в функции substr(). А именно, если offset>0, то последовательность будет начинаться с элемента, имеющего позицию offset от начала массива, а если <0, то отсчет производится от конца массива. Надо отметить, что первый элемент имеет нулевую позицию, а последний (-1). Если указать length>0, то это число возвращаемых в массиве элементов, а если length<0, то это позиция последнего возвращаемого элемента в массиве arr от его конца.
$input = array("a", "b", "c", "e"); $output = array_slice($input, 2); // "c", "d", "e" $output = array_slice($input, 2, -1); // "c", "d" $output = array_slice($input, -2, 1); // "d" $output = array_slice($input, 0, 3); // "a", "b", "c" array_splice - array_splice - Удаляет часть массива или заменяет ее частью другого массива.
- Синтаксис: array array_splice(array arr, int offset [, int len] [, int repl])
Эта функция, также как и array_slice(), возвращает подмассив arr начиная с индекса offset максимальной длины len, но, вместе с тем, она делает и другое полезное действие. А именно, она заменяет только что указанные элементы на то, что находится в массиве repl (или просто удаляет, если repl не указан). Если offset>0, то последовательность будет начинаться с элемента, имеющего позицию offset от начала массива, а если <0, то отсчет производится от конца массива. Надо отметить, что первый элемент имеет нулевую позицию, а последний (-1). Если указать length>0, то это число возвращаемых в массиве элементов, а если length<0, то это позиция последнего возвращаемого элемента в массиве arr от его конца.
$input = array("red", "green", "blue", "yellow"); array_splice($input, 2); // Теперь $input===array("red", "green") array_splice($input, 1, -1);
// Теперь $input===array("red", "yellow") array_splice($input, -1, 1, array("black", "maroon"));
// Теперь $input===array("red", "green", "blue","black", "maroon") array_splice($input, 1, count($input), "orange"); // Теперь $input===array("red", "orange")
Последний пример показывает, что в качестве параметра repl мы можем указать и обычное, строковое значение, а не массив из одного элемента.
Вставка и удаление элементовarray_pad
- array_pad - Добавляет в массив несколько элементов.
- Синтаксис: array array_pad(array input, int pad_size, mixed pad_value)
Функция array_pad() возвращает копию массива input, в который были добавлены элементы с значениями pad_value, так, что число элементов в получившемся массиве будет равно pad_size. Если pad_size>0, то элементы будут добавлены справа, а если <0 - то слева. В случае, если значение pad_sizeменьше элементов в исходном массиве input, то никакого добавления не произойдет, и функция вернет исходный массив input.
$arr = array(12, 10, 4); $result = array_pad($arr, 5, 0); // $result = array(12, 10, 4, 0, 0); $result = array_pad($arr, -7, -1); // $result = array(-1, -1, -1, -1, 12, 10, 4)
$result = array_pad($arr, 2, "noop"); // не добавит
array_pop - array_pop - Извлекает и удаляет последние элементы массива.
- Синтаксис: mixed array_pop(array arr);
Функция array_pop() снимает элемент с "вершины" стека (то есть берет последний элемент списка) и возвращает его, удалив после этого его из arr. С помощью этой функции мы можем строить конструкции, напоминающие стек. Если массив arr был пуст, функция возвращает пустую строку.
$stack = array("orange", "apple", "raspberry"); $fruits = array_pop($stack); // $fruit = "raspberry" // $stack = array("orange", "apple") array_push - array_push - Добавляет элементы в конец массива.
- Синтаксис: int array_push(array arr, mixed var1 [, mixed var2, ..])
Эта функция добавляет к массиву arr элементы var1,var2 и т.д. Она присваивает им числовые индексы - точно так же, как это происходит для стандартных []. Если вам нужно добавить всего один элемент, наверное, проще будет воспользоваться этим оператором:
- array_push($Arr,1000); // вызываем функцию
- $Arr[]=100; // то же самое, но короче
Обратите внимание, что функция array_push() воспринимает массив, как стек, и добавляет элементы всегда в его конец. array_shift - array_shift - Извлекает и удаляет первый элемент массива.
- Синтаксис: mixed array_shift(array arr)
Эта функция извлекает первый элемент массива arr и возвращает его. Она сильно напоминает array_pop(), но только получает начальный, а не конечный элемент, а также производит довольно сильную "встряску" всего массива: ведь при извлечении первого элемента приходится корректировать все числовые индексы у всех оставшихся элементов, т.к. все последующие элементы массива сдвигаются на одну позицию вперед.
$ar = array("-v", "-f"); $opt = array(_shift($arr); // теперь $arr = array("-f"), а $opt = "-v" array_unshift - array_unshift - Добавляет элементы в начало массива.
- Синтаксис: int array_unshift(list arr, mixed var1 [,mixed var2, ...])
Функция очень похожа на array_push, но добавляет перечисленные элементы не в конец, а в начало массива. При этом порядок следования var1, var2 и т.д. остается тем же, т.е. элементы как бы "вдвигаются" в список слева. Новым элементам списка, как обычно, назначаются числовые индексы, начиная с 0; при этом все ключи старых элементов массива, которые также были числовыми, изменяются (чаще всего они увеличиваются на число вставляемых значений). Функция возвращает новый размер массива.
$A = array(10,"a"=>20,30); array_unshift($A,"!","?"); // теперь $A===array(0=>"!", 1=>"?", 2=>10, a=>20, 3=>30) array_unique - array_unique - Создает массив только из уникальных значений.
- Синтаксис: array array_unique(array arr)
Функция array_unique() возвращает массив, составленный из всех уникальных значений массива arr вместе с их ключами, путем удаления всех дублирующих значений. В результирующий массив помещаются первые встретившиеся пары ключ=>значение. Индексы сохраняются.
$input = array("a" => "green", "red", "b" => "green", "blue", "red"); $result = array_unique($input); // теперь $result===("a"=>"green", "red", "blue");
Переменные и массивыList
- List - Заносит элементы массива в переменные.
Синтаксис: list() - языковая конструкция (наподобие array()). Она присваивает перечисленным переменным значения элементов массива, причем первой переменной присваивается первый элемент массива, второй переменной - второй элемент и т.д.
Compact - Compact - Упаковывает в массив переменные из текущего контекста.
- Синтаксис: array compact(mixed varname1 [, mixed $varname2, ...])
Функция compact() упаковывает в массив переменные из текущего контекста (глобального или контекста функции), заданные своими именами в varname1, $varname2 и т.д. При этом в массиве образуются пары с ключами, равными содержимому varnameN, и значениями соответствующих переменных. Число аргументов может быть неопределенное. Если в аргументе указано имя несуществующей переменной, он пропускается. Действие этой функции противоположно функции extract(). $a="Test string"; $b="Some text"; $A=compact("a","b"); // теперь $A===array("a"=>"Test string", "b"=>"Some text")
Почему же тогда параметры функции обозначены как mixed? Дело в том, что они могут быть не только строками, но и списками строк. В этом случае функция последнего перебирает все элементы этого списка, и упаковывает те переменные из текущего контекста, имена которых она встретила. Более того - эти списки могут, в свою очередь, также содержать списки строк, и т.д. Правда, последнее используется достаточно редко.
$a="Test"; $b="Text"; $c="CCC"; $d="DDD"; $List=array("b",array("c","d")); $A=compact("a",$List); // теперь $A===array("a"=>"Test", "b"=>"Text", "c"=>"CCC", "d"=>"DDD")
Extract - Extract - экспорт элементов массива в переменные.
- Синтаксис: void extract(array arr [, int extract_type] [, string prefix])
Эта функция производит действия, прямо противоположные compact(). А именно, она получает в параметрах массив arr и превращает каждую его пару ключ=>значение в переменную текущего контекста.
Параметр extract_type предписывает, что делать, если в текущем контексте уже существует переменная с таким же именем, как очередной ключ в arr. Он может быть равен одной из констант, перечисленных в следующей таблице:
По умолчанию подразумевается EXTR_OVERWRITE, т.е. переменные перезаписываются.
// Сделать все переменные окружения глобальными extract($HTTP_ENV_VARS); // То же самое, но с префиксом E_ extract($HTTP_ENV_VARS, EXTR_PREFIX_ALL, "E_"); echo $E_COMSPEC; // Выводит переменную окружения COMSPEC
Параметр prefix имеет смысл указать только тогда, когда вы применяете режимы EXTR_PREFIX_SAME или EXTR_PREFIX_ALL. |