ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

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

Манипуляции с массивами. Перемещение внутри массива

Манипуляции с массивами

Мы рассмотрели около половины функции обработки массивов. Рассмотрим еще несколько полезных функций при работе с массивами.

Перемещение внутри массива: функции each (), current (), reset (), end (), next (), prev ()

Ранее упоминалось, что каждый массив имеет внутренний указатель, который указывает на текущий элемент массива. Мы касались этого указателя при использовании функции each (), но его можно использовать и манипулировать им непосредственно.

При создании нового массива текущий указатель инициализируется таким образом, что он указывает на первый элемент массива. Вызов функции current($array_name) возвращает первый элемент.

Вызов функции next () или each () перемещает указатель вперед на один элемент. Вызов функции each ($array_name) возвращает текущий элемент, прежде чем переместить указатель. Функция next () ведет несколько иначе — в результате вызова функции next ($array_name) сначала перемещается указатель, а только после этого возникает новый текущий элемент.

Мы уже видели, что функция reset () возвращает указатель на первый элемент массива. Аналогично, вызов функции end ($array_name) перемещает указатель в конец массива. Функции reset () и end () возвращают, соответственно, первый и последний элементы массива.

Для перемещения в массиве в обратном направлении можно воспользоваться функциями end () и prev (). Функция prev () является обратной по отношению к функции next (). Она перемещает текущий указатель на один элемент назад, а затем возвращает новый текущий элемент.

Например, следующий фрагмент кода отображает элементы массива в обратном порядке:

<?php
$value = end ($array);

while ($value)

{

echo "$value<br>";

$value = prev ($array);

}
?>

Например, если массив $array объявлен следующим образом:

$array = array (1, 2, 3);

В окне веб-браузера это будет выглядеть ТАК.

Используя функции each (), current (), reset (), end (), next (), pos (), prev () вы можете написать свой код, позволяющий перемещаться в массиве в любом порядке.

Применение функции к каждому элементу массива: функция array_walk ()

Иногда требуется выполнить одинаковые действия над каждым элементом массива. Делать это позволяет функция array_walk ().

Функция имеет следующий прототип:

bool array_walk (array arr, string funs, [mixed userdata])

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

Нетрудно убедиться, что функция array_walk () принимает три параметра. Первый параметр arr — это массив, подлежащий обработке. Второй параметр, funs, представляет собой имя определяемой пользовательской функции, которая будет применяться к каждому элементу массива. Третий параметр, userdata, является необязательным. В тех случаях, когда он используется, он передается определяемой пользователем функции в качестве параметра.

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

Следующий фрагмент кода отображает каждый элемент с новой строки, вызывая определяемую пользователем функцию myprint () для каждого элемента массива $arry:

<?php
$array = array (1,2,3);
function myprint ($value)
{
echo "$value<br>";
}
array_walk ($array, 'myprint');
?>

В окне веб-браузера это будет выглядеть ТАК.

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

yourfunction (value, key, userdata)

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

Иногда наряду со значением того или иного элемента массива интерес вызвать и его ключ. Созданная нами функция просто игнорировать и ключ, и параметр userdata, как это имеет место myprint ().

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

<?php
$array = array (1,2,3);

function my_multiply (&$value, $key, $factor)
{
$value *= $factor;
echo "$value<br>";
}
array_walk (&$array, 'my_multiply', 3);

?>

В окне веб-браузера это будет выглядеть ТАК.

В этом примере мы определяем функцию my_multiply (), которая будет умножать каждый элемент массива на заданный коэффициент. В данном случае нам необходимо использовать третий параметр функции array_walk () с тем, чтобы передать его в функцию my_multiply () и использовать как коэффициент умножения. Поскольку нам нужен этот параметр, функцию my_multiply ()необходимо определить так, чтобы она принимала три параметра — значение элемента массива ($value), ключ элемента массива ($key) и коэффициента умножения ($factor). В данном случае ключ нам не нужен.

Обратите внимание на то, что мы передаем в функцию параметр $value. Символ амперсада & перед именем переменной в определении функции my_multiply () означает, что $value будет передаваться по ссылке. Передача по ссылке позволяет функции изменять содержимое массива.

Подсчет элементов в массиве: функции count (), sizeof (), array_count_values ()

В приведенном ранее примере для подсчета количества элементов в массиве закзов использовалась функция count (). Функция sizeof () служит тем же целям. Обе функции возвращают количество элементов в переданном им массиве. Так, значение счетчика количества элементов будет равно 1 для обычной склярной переменной и 0 при передаче пустого массива, либо переменной, которая не установлена.

Функция array_count_values () сложнее.

Если вызвать array_count_values (), то эта функция подсчитает, сколько раз каждое уникальное значение встречается в массиве $array. Она возвращает массив с описательными индексами, содержащий таблицу частоты использования элементов. Этот массив содержит в качестве ключей все уникальные значения массива $array. Каждый ключ имеет числовое значение, указывающее, сколько раз соответствующий ключ встречается в массиве $array.

Например, следующий код:

$array = array (4, 5, 1, 2, 3, 1, 2, 1);
$ac = array_count_values ($array);

создает массив $ac, который содержит:

Ключ Значение
4 1
5 1
1 3
2 2
3 1

Этот результат показывает, что ключи 4, 5 и 3 встречается в массиве $array по одному разу, 1 — три раза, 2 — дважды.

Преобразование массива в склярные переменные: функция extract ()

Массив с содержательными индексами, содержащий некотое число пар ключ-значение, с помощью функции extract () можно преобразовать в набор склярных переменных. Эта функция имеет следующий прототип:

extract (array var_array [, int extract_type] [, string prefix]);

Функция extract () предназначена для создания склярных переменных, имеющих те же имена, что и ключи массива. Переменным присваиваются значения, равные значениям, которые хранятся в массиве.

Например:

$array = array ('key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' );

extract ($array);

echo "$key1 $key2 $key3";

Массив содержал три элемента с ключами key1, key2, key3. Благодаря использованию функции extract (), были созданы склярные переменные $key1, $key2, $key3. Как видно из вывода, значениями переменных $key1, $key2, $key3 являются value1, value2, value3.

Функция extract () принимает два необязательных параметра: extract_type и prefix. Переменная extract_type задает функции extract () способ обработки конфликтных ситуаций. Такие ситуации возникают, когда переменная с таким же именем, как и у ключа, уже существует. По умолчанию значение существующей переменной заменяется новым.

Значение Описание
EXTR_OVERWRITE Переписывает существующие переменную в случае конфликта
EXTR_SKIP Пропускает элемент в случае конфликта
EXTR_PREFIX_SAME В случае конфликта создает переменную с именем $prefix_key. В этом случае необходимо передать в функцию параметр prifix.
EXTR_PREFIX_ALL Предваряет имена имена всех переменных префиксом prefix. В этом случае необходимо передать в функцию параметр prefix.
EXTR_PREFIX_INVALID Предваряет префиксом prefix те имена переменных, которые в противном случае окажутся недопустимыми (например, числовые имена переменных). В этом случае необходимо передать в функцию параметр prefix.
EXTR_IF_EXISTS Извлекает только те переменные, которые уже существуют (т.е. заполняет значениями из массива только существующие переменные). Этот параметр появился в версии 4.2.0, и он может оказаться полезной, например, для преобразования массива $_REQUEST в набор переменных.
EXTR_PREF_IF_EXISTS Создает префиксную версию в тех случаях, когда существует непрефиксная версия. Этот параметр появился в версии 4.2.0.
EXTR_REFS Извлекает переменные как ссылки. Этот параметр появился в версии 4.2.0.

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

$array = array ('key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' );

extract ($array, EXTR_PREFIX_ALL, 'my_prefix');

echo "$my_prefix_key1 $my_prefix_key2 $my_prefix_key3";

Обратите внимание, что для того, чтобы функция extract () извлекала элемент, ключ элемента должен быть допустимым именем переменной, т.е ключи, которые начинаются с цифр или содержат пробелы, пропускаются.