САМОУЧИТЕЛЬ PHP 4

Переменные и массивы


array compact(mixed $vn1 [, mixed $vn2, …])

Функция compact(), впервые появившаяся в PHP версии 4, упаковывает в массив переменные из текущего контекста (глобального или контекста функции), заданные своими именами в $vn1, $vn2

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

$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";

$Lst=array("b",array("c","d"));



$A=compact("a",$Lst);

// òåïåðü $A===array("a"=>"Test", "b"=>"Text", "c"=>"CCC", "d"=>"DDD")

void extract(array $Arr [, int $type] [, string $prefix])

Эта функция производит действия, прямо противоположные compact().

А именно, она получает в параметрах массив $Arr

и превращает каждую его пару ключ=>значение в переменную текущего контекста.

Параметр $type предписывает, что делать, если в текущем контексте уже существует переменная с таким же именем, как очередной ключ в $Arr. Он может быть равен одной из констант, перечисленных в табл. 13.1

Таблица 13.1. Поведение функции extract в случае совпадения переменных

Константа

Действие

EXTR_OVERWRITE

Переписывать существующую переменную (по умолчанию)

EXTR_SKIP

Не перезаписывать переменную, если она уже существует

EXTR_PREFIX_SAME

В случае совпадения имен создавать переменную с именем, предваренным префиксом из $prefix. Надо сказать, что на практике этот режим должен быть совершенно бесполезен

EXTR_PREFIX_ALL

Всегда предварять имена создаваемых переменных префиксом $prefix

<
По умолчанию подразумевается 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.

Вообще

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

<table width=100%>

<?foreach($Book as $Entry) { extract($Entry)?>

  <tr>

    <td>Èìÿ: <?=$name?></td>  <!-- вместо $Entry['name'] -->

    <td>Àäðåñ: <?=$url?></td> <!-- вместо $Entry['url']  -->

  </tr>

  <tr><td colspan=3><?=$text?></td></tr>

  <tr><td colspan=3><hr></td></tr>

<?}?>

</table>

Здесь вы должны загодя позаботиться, чтобы ключи $Entry ненароком не затерли нужные переменные. Этого можно добиться, например, назвав все важные переменные с прописной буквы (например, $Book и $Entry), а все ключи — с маленькой, как и было сделано немного выше.


Содержание раздела