Шаг 17 - Функции работы с массивами, часть 2

В предыдущем шаге я в числе прочего описал функцию CURRENT(), возвращающую значение текущего элемента маасива, и совсем забыл отметить, что функция есть POS() - синоним для CURRENT(). Просто алиас.

Теперь продолжим по массивам. Функция EXTRACT() создает переменные на основе ассоциативного массива. Функция имеет три параметра: исходный массив, тип операции (необязателен), строка-префикс (необязательный; для типов операций EXTR_PREFIX_SAME и EXTR_PREFIX_ALL) - для создания переменных с строкой-префиксом в названии, не попадающих под правило, определяемое типом операции.

Теперь подробнее. Но сначала для большей наглядности демонстрационный пример, взятый из мануала и несколько переделанный:

//массив типов операций
$types=array(EXTR_OVERWRITE, EXTR_SKIP, EXTR_PREFIX_SAME, EXTR_PREFIX_ALL);
//массив, над которым будем измываться ;)
$var_array = array ("color" => "blue",
		"size"  => "medium",
		"shape" => "sphere");
foreach($types as $type) {
	//инициализация перед очередным вызовом extract-а
	unset($color,$shape,$wddx_color,$wddx_size,$wddx_shape);
	$size = "large";
	echo "<p>";
	//позвали
	extract ($var_array, $type, "wddx");
	print "$color, $size, $shape; $wddx_color, $wddx_size, $wddx_shape<br>\n";
}

Результат выполнения:

blue, medium, sphere; , , 
blue, large, sphere; , , 
blue, large, sphere; , medium, 
, large, ; blue, medium, sphere

Как Вы, наверное, заметили, тип операции задается константой (допустимые значения от 0 до 3). Перед выполнением EXTRACT()-а проинициализирована одна из создаваемых функцией переменных - $size. Значение 2-го параметра EXTR_OVERVIEW (значение по умолчанию) заставляет функцию перезаписывать значение этой переменной новым значением (из массива).

EXTR_SKIP не "портит" значение $size.

EXTR_PREFIX_SAME также не изменяет $size, но создает одноименную переменную с префиксом, передаваемым в третьем параметре (в этом случае третий параметр обязателен - умолчания нет!), т.е. в данном примере переменную wddx_size.

И наконец, EXTR_PREFIX_ALL, не трогая $size, создает на каждый ключ массива переменную с префиксом.

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

То же касается и случая, когда:

$var_array=array("Кто назвал"=>"даму сэром?");

т.к. в имени переменной не может быть пробелов - ключ для функции неверен.

Мануал предлагает использовать эту функцию для обработки массивов с результатами работы функции группы WDDX_xxxx (от сюда и строка префикса в примере).

К WDDX-группе мы перейдем ближе к финалу рассмотрения возможностей PHP, когда вплотную займемся работой с XML. По описанию на сайте разработчиков WDDX-концепция основана на XML-технологии (DTD) и предназначена для сериализации данных, под которой авторы понимают сохранение и передачу данных между разными скриптовыми технологиями на стороне сервера (например, PHP ;). Необходимоть такого решения обуславливается различиями внутреннего формата данных в разных скриптовых решениях (ColdFusion, Perl, ASP, Java, JavaScript, PHP и пр.).
(Надеюсь, я правильно понял описание...)

Функция KEY() возвращает текущее значение ключа массива (напомню, когда речь идет о текущем значении, имеется в виду внутренний указатель на элемент массива). В качестве параметра передается массив. Если массив неассоциативный, то ключем является индекс.

Функция RANGE() создает массив из диапазона чисел:

foreach(range(10,20) as $k=>$v) {
	echo "$k => $v<br>";
}

Функция SHUFFLE() случайным образом "перемешивает" содержимое массива (правда, для полноценной "случайности" надо проинициализировать псевдослучайную последовательность функцией SRAND(), дав ей на вход уникальное число, например, от функции TIME()).

Вот пример (взят из мануала).

srand(time());
$q=range(10,20);	//Создали массив вида q[0]=10, q[1]=11, q[2]=12 и т.д.
shuffle($q);	//"перемешали" содержимое
foreach($q as $k=>$v) {
	echo "$k => $v<br>";
}

Массив может быть как с числовыми индексами, так и ассоциативный. Индексы остаются по-прежнему в порядке возрастания - перетасовывается только содержимое.

Функции COUNT() и SIZEOF() возвращают количество элементов массива. Если в качестве параметра указана обычная переменная, то обе вернут "1". Если переменная еще не определена, то возвращаемое значение будет "0" (кстати, для подавления Warning-а перед функцией можно поставить знак "@" - подавление сообщения об ошибки или предупреждения). В чем разница между этими функциями, я так и не выяснил.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Константин Платонов - 25.12.2000