PHP-4 Эффективная работа


Основные функции работы с массивами
Сортировка массивов
Дополнительные функции работы с массивами

8.1.15. Обращение порядка следования элементов: array_reverse

array array_reverse (array array [, boot preserve_keys] )

Функция array_reverse() принимаете качестве аргумента входной массив и возвращает новый, в котором порядок следования элементов изменен на обратный. При этом, если необязательный аргумент рreserve_keys установлен в truе, ключи элементов сохраняются;

$1nput = array ("php". 4.0, array ("зеленый", "красный"));
Sresult = array_reverse ($input):
$result_keyed = array_reverse ($1nput, TRUE):

В результате и $result, и $result_keyed будут содержать массив array (array ("зеленый", "красный"), 4.0, "php"). Но $result_keyed[0] по-прежнему будет равен «php».

8.1.16. Ужатие массива до скаляра: array_reduce

mixed array_reduce (array Input, mixed callback [, int initial])

Функция array_reduce() итеративно применяет функцию callback (передается по имени) к элементам входного массива с целью последовательного преобразования массива в одно-единственное значение. Если при этом используется дополнительный аргумент initial, он используется в качестве начального значения или как результат работы функции, если исходный массив input оказался пустым.

Вот несколько простых и очевидных применений этой функции:
function rsum($v, $w) {
       $v += $w;
       return $v;
}
function rmul($v, $w) {
       $v *= $w;
       return $v;
}
$a = array (1,. 2, 3, 4, 5);
$x = array();
$b = array_reduce($a, "rsum");
$c = array_reduce($a, "rmul", 10);
$d = array_reduce($x, "rsum", 1);

В результате переменная $b будет содержать число 15, $с — число 1200 (=1 х 2 х 3 х 4 х 5 х 10), a $d - число 1.

8.1.17. Выдавливание начального элемента: array_shift

mixed array_sh1ft (array array)

В отличие от функции array_pop () (раздел 8.1.12) эта функция извлекает не последний элемент массива, а первый, поэтому, на мой взгляд, уместно говорить о «выдавливании» элемента массива, подобно тому как из тюбика выдавливается зубная паста. (Старики, которым за тридцать, еще помнят те времена, когда паста могла «выталкиваться» и через плохо заделанные технологические отверстия в задней части тюбика. Собственно говоря, в этом и заключается отличие двух терминов.)

Функция array_shift ( ) удаляет из массива первый элемент и возвращает его в качестве результате работы функции, а кроме того, сокращает массив на один элемент, сдвигая все его содержимое к началу. Если же а rr ау оказался пустым массивом или объектом, не являющимся массивом, функция возвращает NULL:

$args = array ("-v", "-f"); $opt = array_shtft ($args);

В результате в массиве $args останется один элемент -f, а переменная $opt получит значение-v.

8.1.18. Вырезка фрагмента массива: array_slice

array array_slice (array array.int offset [. int length] )

Функция array_slice () возвращает последовательность элементов массива array, определяемую смещением of fset и количеством элементов length.

Если значение offset больше нуля, формирование фрагмента начинается с указанного смещения относительно начала массива. Если же это значение положительно, выделяемый фрагмент будет начинаться с конца массива.

Если при вызове функции был задан аргумент length, имеющий положительное значение, в состав возвращаемого фрагмента будет включено именно это количество элементов исходного массива. Если же этот аргумент представляет собой отрицательное число, последним элементом фрагмента станет тот, который находится на указанном расстоянии от конца исходного массива. Если же этот аргумент просто не используется, в выходной фрагмент будут включены все элементы от начального смещения и до конца массива.

Вот несколько примеров применения этой функции:
// исходный массив
$input = array ("a", "b", "с", "d", "e");

$output = array_slice    ($input, 2):      // вернет "с", "d", "e"
$output = array_s!ice    ($input, 2, -1);      // вернет ,"c", "d"
$output = array_slice    ($input, -2. 1),:      // вернет "d"
$output = array_slice    ($input, 0. 3);      // вернет "a", "b". "c"

8.1.19. Вырезка с заменой: array_splice

array array_splice (array Input, 1nt offset [, int length [. array replacement]])

Функция array_splice() удаляет из исходного массива фрагмент, определенный аргументами offset и length, и заменяет их элементами массива replacement, если такой массив был передан в качестве аргумента функции.

Если offset имеет положительное значение, начало удаляемого фрагмента отсчитывается от начала массива. Если же аргумент Имеет отрицательное значение, отсчет начинается с конца массива.

Если аргумент length при вызове функции не используется, функция удаляет все элементы, начиная с указанного аргументом-offset и до конца массива. Если же этот аргумент указан и представляет собой отрицательное число, то удаляется указанное число последних элементов массива.

При использовании аргумента replacement удаленные из массива элементы заменяются содержимым указанного массива. Если значения offset и length не приводят к удалению ни одного элемента исходного массива, то элементы замещающего массива вставляются внутрь исходного массива начиная со смещения offset.

8.1.20. Сумма значений массива: array_sum

mixed array_sum (array arr) $а = аrrау(2,4,6,8);
echo "sum(a) = ".array_sum($a)."\n";
// выведет на печать: sum(a) = 20

$b = array("a"=>1.2."b"=>2.3,"c"=>3.4);
echo "sum(b) = ".array_sum($b)."\n";
// выведет на печать: sum(b) = 6.9

8.1.21. Удаление дубликатов: array_unique

array array_unique (array array)

Функция array_unique() принимает в качестве аргумента массив array и возвращает новый массив, в котором нет ни одного повторяющегося значения. Ключи при этом не изменяются:

$input = array ("a" => "зеленый", "красный",
         "b" => "зеленый", "синий", "красный");
Sresult = array_unique ($input);
В результате выполнения этого фрагмента переменная $result будет содержать массив array ("а" => "зеленый", "красный", "синий").

8.1.22. Вдавливание значения: array_unshift

int array_unsh1ft (array array, mixed var [. mixed ...])

Функция array_unshif t() вставляет переданные ей значения в начало массива array. При этом список элементов приписывается «одним кусочком», в результате чего сохраняется порядок следования элементов.

Функция возвращает общее количество элементов в модифицированном массиве:
$queue = array ("p1". "рЗ"):
array_unshift ($queue, "p4". "p5". "p6");

В результате массив $queue будет содержать пять элементов: р4, р5, рб, р1 и рЗ. Операции со стекоподобными структурами выполняются также функциями array_push() (раздел 8.1.13), array_shi ft () (раздел8.1.17),а также аrrау_рор() (раздел 8.1.12).

8.1.23. Список значений массива: array_values

array array_values (array input) Функция array_values() возвращает список, состоящий из значений, содержащихся в массиве:
Sarray = array ("размер" => "XL", "цвет" => "маренго");
array_values ($array); >
// возвращает array ("ХL","маренго")

8.1.24. Обход массива: array_walk

int array_walk (array arr, string func, mixed userdata)

Функция применяет пользовательскую функцию func (передаваемую по имени) к каждому элементу массива arr. Пользовательская функция должна принимать обрабатываемый массив в качестве первого аргумента и ключ очередного элемента в качестве второго аргумента. В случае использования необязательного аргумента userdata этот аргумент без изменений передается в пользовательскую функцию в качестве третьего аргумента.

В случае если функция пользователя требует более двух или трех аргументов, в зависимости от наличия userdata PHP-машина будет генерировать предупреждение при каждом вызове пользовательской функции внутри array_walk.

Если вам необходимо, чтобы пользовательская функция работала непосредственно с элементами исходного массива, первый аргумент пользовательской функции должен передаваться по ссылке. В этом случае все изменения, внесенные в элементы массива внутри функции обработчика, будут непосредственно отражаться на самом массиве. Пример использования функции array_walk() приведен в листинге 8.1.Результат работы этой программы представлен на рис. 8.1.

совет
       Кроме того, следует иметь в виду, что вам потребуется самостоятельно выполнять сброс внутренних счетчиков массива с помощью функции reset() (раздел 8.3.15), поскольку array_walk() не содержит соответствующего кода.

Листинг 8.1.Просмотр массива с помощью array_walk
<HTML>
<ТIТLЕ>Просмотр массива с помощью array walk</title>
<body bgcolor="#FFFFFF">
<hЗ>Просмотр массива с помощью array_walk</h3>
<
? // Формируем массив с исходными данными
$fruits = array ("а"=>"лимон", "б"=>"апельсин",
       "в"=>"банан" , "г"=>"яблоко") ;

// Используем ссылку для работы с входным массивом
// и аргумент $prefix с дополнительными данными
function test_alter (&$iteml, $key, Spreflx) {
$1teml = "$preflx: $iteml";

// Простейшая пользовательская функция
function test_print ($1tem2, $key) {
echo "$key. $item2
\n" ;
echo "<h4>3апуск функции t'est_print</h4>\n";
array_walk (Sfruits, 'test_print');
reset ($fcults):
?>
<h4>Запуск функции test_alter<
/h4> Функция ничего не выводит на печать, но вносит изменения
в содержимое исходно/р,.массиеа.
<?
arcay_walk ($fcuits, 'test_alter', '<b>Фрукт -</b>');
reset ($fruits);
echo "<Н4>И снова запуск test_pr1nt</h4>\n";
arcay_watk ($fruits, 'test_pc1nt');
?>

Рис. 8.1. Использование пользовательского обработчика элементов массива

8.2. Сортировка массивов

8.2.1. Сортировка массива: sort

void sort (array array [, int sort_flags] )

Функция предназначена для сортировки массива. После ее выполнения элементы массива отсортированы в порядке возрастания:

<?php
$fruits = array ("лимон", "апельсий", "банан", "яблоко");
sort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
       echo "fruits [" . $key . "] = ",$val;
В результате выполнения приведенной выше программы массив будет отсортирован в алфавитном порядке:
fruits[0] = апельсин
fruitsl1 = банан
fruits[2] = лимон
fruits[3] = яблоко

Функция предусматривает также использование второго необязательного аргумента, позволяющего модифицировать ее работу. Допустимые значения аргумента sort_flags:

SORT_REGULAR      стандартное сопоставление элементов
SORT_NUMERIC      сравнивать элементы как числа
SORT_STRING      сравнивать элементы как строки
Второй параметр применяется и в некоторых других функциях сортировки.

8.2.2. Обратная сортировка: rsort

void rsort (array array [, int sort_flags] )

Функция осуществляет сортировку массива в обратном направлении: в начале массива помещаются значения с максимальным значением, а в конце — с минимальным.

Так, в результате выполнения фрагмента
$fruits = array ("лимон", "апельсин", "банан", "яблоко");
rsort ($fruits);
reset ($fruits) ;
while (list ($key, $val) = each ($fruits)) {
       echo "$key -> $val\n";
}
исходный массив будет отсортирован следующим образом:
fruits[0] = яблоко
fruits[l] = лимон
fruits[2] = банан
fruits[3] = апельсин

Вы можете при необходимости модифицировать стандартный алгоритм сортировки, используя необязательный аргумент sort_flags в соответствии с описанием функции sort() (раздел 8.2.1).

8.2.3. Сортировка с сохранением индексов: asort

void asort (array array [, int sort_flags] )

Функция сортирует массив таким образом, что сохраняются индексы элементов. Используется преимущественно при сортировке ассоциативных массивов, когда важен порядок следования элементов:

$fruits = array ("d"'=>"лимон", "а"=>"апельсин",
          "b"=>"банан", "с"=>"яблоко");
asort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
       echo "$key = $val\n";
}
В результате на экран будет выведено:
fruits[a] = апельсин
fruits[b] = банан
fruits[d] = лимон
fruitstc] = яблоко

Как видите, фрукты, как и в предыдущей функции, отсортированы в алфавитном порядке, а ассоциативные связи ключей с элементами остались без изменений.Сравните результаты работы функций asort и arsort на рис. 8.2.


Рис. 8.2. Функции asort и arsort сортируют массивы одинаково, но в противоположном направлении

8.2.4. Обратная сортировка с сохранением индексов: arsort

void arsort (array array [, int sort_flags] )

Эта функция производит сортировку массива таким образом, что индексы сохраняют связь с соответствующими им элементами массива. Как правило, функция применяется к ассоциативным массивам, когда важен порядок следования эле- ментов.

Вот пример использования этой функции:
$fruits = array ("d" = >"лимон", "а"=>"апельсин",
          "b"=>"банан", "с"=>"яблоко");
arsort ($fruits) ;
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
       echo "$key = $val\n";
}
В результате будет напечатано следующее:
fruits[c] = яблоко
fruits[d] = лимон
fruits[b] = банан
fruits[a] = апельсин

Как видите, фрукты сортируются в обратном алфавитном порядке, но ключи элементов сохраняются без изменений.

совет
       Вы можете изменить порядок сортировки элементов массива, воспользовавшись флагами, рассмотренными при описании функции sort().

8.2.5. Сортировка по ключам: ksort

int ksort (array array [, int sort_flags] )

Осуществляет сортировку массива по ключам, сохраняя соответствия между ключами и их значениями. Используется преимущественно при работе с ассоциативными массивами:

$fruits = array ("d" = >"лимон", "а" = >"апельсин",
          "b"=>"банан", "с"=>"яблоко");
ksort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
       echo "$key -> $val\n";
}
В результате будет выведено следующее:
fruits[a] = апельсин
fruits[b] = банан
fruits[c] = яблоко
fruits[d] = лимон

8.2.6. Обратная сортировка по ключам: krsort

int krsort (array array [, int sort_flags] )

Осуществляет сортировку массива по ключам в обратном порядке, сохраняя соответствия между ключами и их значениями. Используется преимущественно при работе с ассоциативными массивами:

$fruits = array ("d""=>"лимон", "а"=>"апельсин",
          "b"=>"банан", "с"=>"яблоко");
krsort ($fruits);
reset ($fruits) ;
while (list ($key, $val) = each ($fruits)) {
       echo "$key -> $val\n";
}
В результате выполнения этого примера на экран будет выведено:
fruits[d] = лимон
fruits[c] = яблоко
fruits[b] = банан
fruitsfa] = апельсин
назад
далее

Сайт управляется системой uCoz