Сегодня: Четверг
5-е Марта
2026-го года.
Сейчас: 20:20
 

N1

N1  
  "; for($j=0;$j<7;$j++){echo "";}echo "";} echo "
Тут находиться копия текста из книги Джанет`a Валейд`a. с использованием на практике сценариев.

Глава 4 Глава 5 Глава 6 Глава 7 Глава 8 Глава 9

Глава 6

Объединение данных с помощью массивов

В этой главе...

Создание массивов
Присваивание значений элементам массивов
Сортировка массивов
Обработка значений в массивах
Создание многомерных массивов

 

Массивы представляют собой составные переменные, позволяющие объединять данные под одним именем. Например, в одной переменной $FordInfо можно хранить такую информацию о машине, как название модели, цвет или стоимость. При этом массивы можно легко обрабатывать, получать к ним доступ или изменять информацию. Например, в РНР предусмотрено несколько методов сортировки данных в массивах.

В этой главе предлагается описание методов создания, изменения, копирования и использования массивов.

Создание массивов и работа с ними

Массивы являются важным элементом программирования на языке РНР. В этом разделе описывается, как создавать, изменять и удалять массивы.

Создание массивов

Для создания переменной в РНР ей можно присвоить значение. Аналогично, чтобы создать массив, необходимо присвоить ему соответствующие значения. Например, пусть $customers — переменная, которая ранее не использовалась в сценарии. Тогда для создания массива с именем $customers воспользуемся выражением
$customers[1] = "Сэм Смит"

Теперь $customers — имя массива с единственным значением " Сэм Смит". Рассмотрим следующий фрагмент кода:
$customers[2] = "Сью Джонс";
$customers[3] = "Мэри Хуанг";

Код PHP Результат выполнения кода

<? $customers[1] = "Sem Smitt";
$customers[2] = "Su Jons";
$customers[3] = "Merry Huang";
echo $customers[1],"<br>"; ?>

"; ?>

Теперь массив $customers содержит три значения: "Сэм Смит", "Сью Джонс" и "Мэри Хуанг".

Массив можно рассматривать как набор пар ключ-значение (key/value), т.е.
$arrayname['ключ1'] = значение1;
$arrayname['ключ2'] = значение2;
$arrayname['ключЗ'] = значениеЗ;
и т.д. по всем элементам массива.

Ключ (key) также называют индексом (index).

В качестве индекса в массивах могут использоваться числа или строки. В массиве $customers индексами являются 1, 2 и 3. Однако можно использовать и текстовые строки. Рассмотрим пример создания массива, в котором индексами являются прописные буквы некоторых штатов:
$capitals['СА'] = "Сакраменто";
$capitals['TX'] = "Остин";
$capitals['OR'] = "Салем";

Для создания массива можно также использовать сокращенную запись, а не писать отдельное выражение для каждого значения индекса. Одним из возможных вариантов является
$streets[] = "ул. Вязов";
$streets[] = "ул. Дубов";
$streets[] = "7-ая авеню";

В таком случае создается массив с автоматической нумерацией индексов — числами, начиная с 0. Например, для отображения первого элемента массива можно воспользоваться следующим выражением:
echo "$streets[0] " ;

Код Результат
<?
$streets[] = "ул. Вязов";
$streets[] = "ул. Дубов";
$streets[] = "7-ая авеню";
echo "$streets[0] " ;
?>
Отсчет значений индекса массивов начинается с 0, если только специально не присвоить другое значение. Одной из часто совершаемых ошибок является использование в качестве первого значения индекса массива 1, а не 0.

Еще более сокращенной записью создания массива является
$streets = аггау("ул. Вязов", "ул. Дубов", "7-ая авеню");

Код Результат
<? $streets = array("ул. Вязов", "ул. Дубов", "7-ая авеню");
echo $streets[1],"<br>" ;
?>
 " ; ?>

В результате выполнения этого оператора создается массив, аналогичный созданному в предыдущем примере. Если, например, необходимо, чтобы отсчет в массиве начинался с 12, а не с 0, можно воспользоваться выражением
$streets = array(12 => "ул. Вязов", "ул. Дубов", "7-ая авеню");

В результате будет создан следующий массив:
$streets[12] = "ул. Вязов";
$streets[13] = "ул. Дубов";
$streets[14] = "7-ая авеню";

Аналогичным образом можно создавать массивы с текстовыми индексами. Например, с помощью следующего выражения можно создать массив сокращенных названий штатов:
$capitals = array("CA" => "Сакраменто",
"ТХ" => "Остин",
"OR" => "Салем"));

Код Результат
<? $capitals = array("CA" => "Сакраменто",
"ТХ" => "Остин",
"OR" => "Салем");
echo $capitals[CA]; ?>
"Сакраменто", "TX" => "Остин", "OR" => "Салем"); echo @$capitals[CA]; ?>
Обратите внимание на структуру этого выражения. РНР не учитывает пробелы и перевод строки. Все выражение можно было бы написать в одну длинную строку. Однако приведенная выше структура позволяет программистам облечить анализ кода сценария, который стоит создавать настолько прозрачным и четмм,насколько это возможно. При тестировании кода сценария вы с удовольствием сможете оценить затраченные усилия.

РНР также позволяет создавать массивы, значения которых будут находиться в некотором промежутке. Например:
$years = range(2001, 2010);

В результате будет создан следующий массив:
$years[0] = 2001
$years[l] = 2002
$years[8] = 2009
$years[9] = 2010

Код Результат
<?
$years = range(2001, 2010);
echo $years[0],"<br>",$years[1],"<br>",
$years[2],"<br>",$years[3],"<br>",$years[4],"<br>",
$years[5],"<br>",$years[6],"<br>",
$years[7],"<br>",$years[8],"<br>",
$years[9],"<br>";
?>
",$years[1],"
",$years[2],"
",$years[3],"
",$years[4],"
",$years[5],"
",$years[6],"
",$years[7],"
",$years[8],"
",$years[9],"
"; ?>

Можно также воспользоваться выражением
$reverse_letters = range("z", "a");
и в результате будет создан массив из 26 элементов:
$reverse_letters[0] = z
$reverse_letters[1] = у
$reverse_letters[24] = b
$reverse_letters[25] = a

Вывод элементов массивов

Для просмотра структуры и значений элементов массива можно воспользоваться одной из двух функций: var_dump () или print_r (). Однако функция print_r () не так полезна. Рассмотрим следующее выражение для вывода массива $customers:
print_r($customers) ;

В результате получим:

 

Таким образом, выводятся только индекс и значение каждого элемента массива. Для получения более подробной информации о массиве следует использовать функцию var_dump ():
var_dump($customers) ;

В результате получим следующее:

  

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

Код Результат
<?
$age = 2; $pokupatel[namee]="Eldorado";
$pokupatel[agee] = 21;
var_dump($pokupatel)
?>

Целочисленный тип элемента массива определяется ключевым слова int. В данном примере элемент с индексом agee имеет значение 21

Необходимо помнить, что в таком виде информация о массиве возвращается интерпретатором РНР. Однако при использовании РНР для Web результат выполнения функций print_r () и var_dump () будет отображаться с помщью HTML, т.е. будет выведен в одну длинную строку. Для форматирования выводимой в браузер информации о массивах следует воспользоваться соответствующими HTML-дескрипторами, например:
<?
echo "<pre>";
var_dump($customers);
echo "</pre>","это использовался тег &lt;pre&gt; ";
?>
"; var_dump($customers); echo "","это использовался тег <pre> "; ?> 

Задачка: C помощью PHP создать таблицу 5х7.

"; for($i = 0; $i < 5; $i++) { echo "";} echo ""; echo "
<? echo "<table border=1px >";echo "<tr>";
for($i = 0; $i < 5; $i++)
{ echo "<td>&nbsp;</td>";}
echo "</tr>"; echo "</table>"; ?>
Таблица 5х1
";echo "
 
"; ?>
<?
echo "<table border=1px>";
for($i = 0;$i<5;$i++)
{
echo "<tr>";
for($j=0;$j<7;$j++)
{
echo "<td>$i,$j</td>";
}
echo "</tr>";
}
echo "</table>";
?>
Таблица 5х7
"; for($i = 0;$i<5;$i++){echo "
$i,$j
"; ?>

Изменение массивов

Массивы можно изменять таким же образом, как и переменные. РНР позволяет изменять значения, добавлять или удалять элементы и производить сортировку. Например, если имеется массив $capitals, значение его элемента можно легко изменить следующим образом:
$capitals['ТХ'] = "Биг Спрингс";

<?
$capitals['ТХ'] = "Биг Спрингс";
var_dump ( $capitals) ;
?>

Это выражение присваивает элементу с индексом ТХ новое значение "Биг Спрингс",хотя жители Остина (Austin) могут возразить (Остин— столица штата Техас). Для создания нового элемента массива $capitals можно воспользоваться следующим кодом:
$capitals['RI'] = "Провиденс";

Это выражение добавляет новый элемент, не изменяя существующие.

Предположим, имеется созданный ранее массив, в котором индексами являются целые числа:
$customers[1] = Сэм Смит
$customers[2] = Сью Джонс
$customers[3] = Мэри Хуанг

При использовании выражения
$customers[] = "Хуан Лопес";
массив $customers будет уже состоять из четырех элементов:

<?
var_dump( $customers);
$customers[] = "Huan Loopes";
echo "<br>";
var_dump ($customers) ;
?>
 
 ";var_dump ($customers) ;?> 

РНР позволяет легко копировать существующий массив в новый, например:
$customerCopy = $customers;

Удаление значений из массива

Иногда необходимо полностью удалить значение из массива. Например, предположим,что имеется массив
$colors = array("красный", "зеленый", "синий", "розовый", "желтый"));
который содержит пять значений. А теперь предположим, что вам больше не нравится розовый цвет и вы хотите от него избавиться. Этого можно добиться таким образом:
$colors[3] = "";

<?
$colors = array("красный", "зеленый", "синий", "розовый", "желтый");
$colors[3] = "";
echo "<pre>";
var_dump($colors) ;
echo "</pre>";
?>
"; var_dump($colors) ; echo "";?>

Однако это выражение присваивает элементу $colors [3] пустое значение, но не удаляет его. Массив $colors все еще содержит пять элементов, значение одного из которых — пустая строка. Для того чтобы полностью удалить его из массива, необходимо воспользоваться следующим выражением:
unset($colors[ 3 ] )

<?
unset($colors[ 3 ] ) ;
echo "<pre>";
var_dump($colors) ;
echo "</pre>";
?>
"; var_dump($colors) ; echo ""; ?>

Теперь массив $colors содержит четыре значения.

Следует заметить, что при удалении элемента с индексом 3 все остальные остались неизмененными.

После того как массив создан, он не перестает существовать до тех пор, пока его специально не удалить. При этом удаление его элементов по отдельности не влечет за собой удаление массива как такового, точно так же, как извлечение всей одежды из шкафа не говорит о ее исчезновении. Для того чтобы удалить массив, необходимо использовать выражение
unset($colors);

<? //удаление массива
unset($colors);
var_dump($colors) ?>

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

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

Язык РНР предоставляет широкие возможности при сортировке массивов. Например,чтобы изменить порядок следования элементов массива с числами в качестве индексов, следует воспользоваться функцией sort ():
sort($имя_массива);

Это выражение сортирует элементы массива по значению и присваивает им новые индексы в порядке следования. При этом сначала идут значения, начинающиеся с чисел, потом — с прописных и строчных букв. Например, рассмотрим массив $streets:

<?
var_dump($streets);
?>
 

Использование выражения
sort($streets);
приведет к следующему:

<?
sort($streets);
var_dump($streets);
?>
  

 

Если же использовать функцию sort () для сортировки массива, индексами которого являются текстовые строки, РНР преобразует их в числа.

Поэтому для таких целей необходимо воспользоваться функцией asort ():
asort($capitals);

Это выражение сортирует значения столиц по значению, при этом не изменяя индексы массива. Рассмотрим массив $capitals, созданный в предыдущем разделе:

<?
unset($capitals['ТХ'] ) ;
$capitals['ТХ'] = "Остин";
var_dump($capitals)
?>
  

При использовании выражения:
asort($capitals);
получим следующее:

<?
asort($capitals);
echo"<pre>";
var_dump($capitals);
echo"</pre>";
?>
"; var_dump($capitals);echo""; ?>

Заметим, что порядок следования индексов массива изменяется в соответствии со значениями. Теперь столицы расположены в алфавитном порядке. Если бы в качестве индексов массива использовались числа, то они бы тоже поменяли свой порядок. Например, пусть имеется массив

<?
$capitalss[1] = "Sakromento";
$capitalss[2] ="Ostin";
$capitalss[3] = "Salem";
echo"<pre>";
var_dump($capitalss);
echo "</pre>";
?>
"; var_dump($capitalss); echo ""; ?>

Результатом выполнения функции asort () будет

<?
asort($capitalss);
echo"<pre>";
var_dump($capitalss);
echo"</pre>";
?>
"; var_dump($capitalss); echo""; ?>

Вряд ли эта функция будет полезна для массивов с числовыми индексами.

Язык РНР предоставляет также и другие возможности для сортировки массивов различными способами. В табл.6.1 представлены необходимые для этого функции.
Таблица 6.1 Сортировка массивов

Сортировка массивов Описание
sort ($имя_массива) Сортирует значения элементов массива по возрастанию, присваивая им при этом новые числовые индексы
asort ($имя_масстша) Сортирует значения элементов массива по возрастанию, не изменяя при этом индексы
rsort ($имя_массива) Сортирует значения элементов массива по убыванию, присваивая при этом новые числовые индексы
arsort ($имя_массива) Сортирует значения элементов массива по убыванию, не изменяя при этом индексы
ksort ($имя_массива) Сортирует индексы элементов массива по возрастанию
krsort ($иш_массива) Сортирует индексы элементов массива по убыванию
usort ($имя_массива, имя_функции) Пользовательская сортировка, определяемая функцией имя_функции (функции рассматриваются в главе 8)
natsort ($имя_массива) Сортирует смешанные значения (текстовые и числовые) элементов массива и устанавливает "естественный" порядок. Например, массив со значениями dayl, day5, day11, day2 будет отсортирован следующим образом: day1,day2, day5, day11. В то время как результатом выполнения функции sort () будет: dayl, day11, day2, day5

Использование массивов в выражениях

Массивы можно использовать в выражениях точно так же, как и переменные. Этот раздел как раз и посвящен этому вопросу.

Значения отдельных элементов массива можно легко получать путем прямого доступа к ним, как, например, в следующем выражении:
$CAcapital = $capitals['СА'];
echo $CAcapital;

Результатом выполнения будет

Если попытаться получить доступ к несуществующему элементу массива, РНР выдаст сообщение об ошибке

$CAcapital = $capitals['CAx']; [07-Nov-2013 21:43:46] PHP Notice: Undefined index: CAx in C:\Site\localhost\www\ss1_2.php on line 444

Поскольку в массиве $capitals нет элемента с индексом САх, будет выведено следующее:
Notice: Undefined index: CAx in d:\testarray.php on line 9 (Предупреждение: Неизвестный ключ: САх в файле d:\testarray.php в строке 9)

При этом сообщение об ошибке не прекращает выполнения последующих строк кода сценария. Но поскольку переменной $CAcapital не было присвоено никакого значения, при использовании функции echo будет выводиться пустая строка. Для предотвращения сообщения об ошибке необходимо использовать символ @:
@$CAcapital = $capitals['САх'];

Использование массивов в операторе echo

Для вывода элементов массива с помощью функции echo следует воспользоваться выражением
echo $capitals[ ' ТХ' ] ;

В результате получим:

Если необходимо поместить массив в длинную строку в двойных кавычках, его название нужно заключить в фигурные скобки:
echo "Столица штата Техас — {$capitals['ТХ']}";

Результатом выполнения этого выражения будет следующее:

Использование массивов в функции list

РНР позволяет получать значения и индексы нескольких элементов массива одновременно. С помощью функции list () можно копировать значения массивов в переменные.Пусть, например, имеется массив
$shoeInfo = array("мокасины", "черные", 22.00);

Информацию о нем можно получить, используя функцию print_r ():

Результатом выполнения будет следующее:

<?
$shoeInfo = array("мокасины", "черные", 22.00);
print_r($shoeInfo)
?>

Следующий пример иллюстрирует использование функции list() :

<? list($first, $second) = $shoeInfo;
echo $second, " ",$first; ?>

В результате РНР создаст две переменные, $first и $second, которым будут присвоены значения первых двух элементов массива $shoeInfо, что эквивалентно выполнению операторов:
$first = $shoelnfo[0] ;
$second = $shoe!nfo[l];

Значение третьего элемента массива, $shoeInfo, не будет скопировано, поскольку функция list () содержит только два аргумента. В результате функция echo выведет
черные мокасины

В некоторых случаях необходимо получить индекс элемента массива, а не его значение. Для этих целей предназначена функция key (). Предположим, что первым элементом массива является
$shoeInfo['style'] = "мокасины"

В следующем выражении с помощью echo выводятся индекс и значение первого элемента массива $shoeInfо:

Код PHP Результат выполнения
<? $shoeInfoo['стиль'] = "мокасины";
$value = $shoeInfoo['стиль'];
$key = key($shoeInfoo);
echo "$key: $value"; ?>

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

Премещение по массивам

Часто необходимо производить различные операции над каждым элементом массива. Например, нужно вывести все значения, сохранить их в базе данных или прибавить к каждому элементу число 6. Формально выражаясь, процесс перебора всех элементов массива является итеративным, т.е. состоящим из итераций, или проходом (traversing). В данном разделе описаны два таких способа.

    Перебор вручную. Использование указателя для перехода от одного элемента массива к другому;
С помощью оператора foreach. Поэлементный автоматический проход по массиву от его начала до конца.

Перебор элементов массива вручную

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

    current ($имя_массива). Возвращает текущее значение элемента массива, не перемещая указатель.
next ($имя_массива). Перемещает указатель вперед на один элемент.
    previous ($имя_массива). Перемещает указатель назад на один элемент.
    end ($имя_массива). Перемещает указатель в конец массива.
    reset ($имя_массива). Перемещает указатель в начало массива.

С помощью следующего выражения осуществляется проход по всем элементам массива, содержащего названия столиц штатов:

Код Результат выполнения
<? $value = current($capitals);
echo "$value<br>";
$value = next($capitals);
echo "$value<br>";
$value = next($capitals);
echo "$value<br>"; ?>
"; $value = next($capitals); echo "$value
"; $value = next($capitals); echo "$value
"; ?>

Поскольку указатель ранее не перемещался, по умолчанию он установлен на первый элемент массива. Если же положение указателя изменялось в предыдущих строках кода или нет уверенности, что отсчет начнется с первого элемента, то следует предварительно воспользоваться функцией reset ():
reset($capitals);

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

Этот метод достаточно гибок. Можно просто перемещаться по массиву в произвольном порядке и обрабатывать его элементы. Можно перемещаться назад, непосредственно перейти в конец, пропускать элементы, используя подряд два выражения next, или применять любой другой полезный прием. Однако, если необходимо пройти поэлементно массив от начала до конца, язык РНР позволяет использовать более простой метод, а именно оператор fоreach, который выполняет те же действия намного эффективнее. Этот оператор рассматривается в следующем разделе.

Использование оператора foreach для прохода по массиву

Оператор foreach осуществляет поэлементный проход по массиву и позволяет выполнить набор инструкций со значениями и индексами. Общий синтаксис имеет вид:
foreach{$имя_массива as $ключ => $значение)
{
набор операторов;
}

Параметрами выражения foreach являются следующие.

    $имя_массива. Имя массива.
$ключ. Имя переменной, которой будут присваиваться значения индексов элементов массива. Этот параметр является необязательным, т.е. без его использования сохранится только значение элемента массива в переменной $значение.
    $значение. Имя переменной, которой будут присваиваться значения элементов массива

Рассмотрим следующий пример, в котором оператор foreach используется для вывода численности населения по штатам:

Код В результате
<? $state_population = array ("CA" => 34501130,
"WY" => 494423,
"OR" => 3472867);
ksort($state_population);
foreach($state_population as $state => $population)
{
$population = number_format($population);
echo "$state: $population.<br>";
}?>
34501130, "WY" => 494423, "OR" => 3472867); ksort($state_population); foreach($state_population as $state => $population) { $population = number_format($population); echo "$state: $population.
"; }?>

Можно воспользоваться и следующей строкой кода:
foreach($state_population as $population)

<?
foreach($state_population as $population)
{ $population = number_format($population);
echo "$population.<br>";
}
?>
"; } ?>

Однако в этом случае мы будем иметь доступ только к значениям (численности населения) массива, но не к индексам.

При использовании оператора foreach указатель автоматически перемещается в начало, т.е. нет необходимости использовать функцию reset ()

Oпределение размера массива

Для получения информации о структуре и значениях массива можно использовать функцию var_dump () или print_r () (см. выше раздел "Вывод элементов массивов"). Но иногда необходимо просто знать размер массива. Для этого в языке РНР предусмотрены две функции: count () и sizeof (). Их общий синтаксис имеет следующий вид:
$n = count($имя_массива);
$n = sizeof($имя_массива);

В результате выполнения переменной $n будет присвоено значение количества элементов в массиве.

Преобразование массивов в текстовые строки (и наоборот)

Иногда необходимо выполнять операции над данными в специальном формате. Например, надо вывести слова предложения в отдельных строках. Одним из вариантов решения данной задачи является добавление перед выводом после каждого слова символа '\n'. Это легко можно осуществить с помощью оператора foreach, если предложение представляет собой массив, а не текстовую строку. РНР как раз позволяет создавать массив, элементами которого являются слова некоторого предложения.

Для того чтобы переписать содержимое текстовой строки в массив, можно воспользоваться функцией
$arrayname = explode("символ", строка);

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

Код Результат
<? $string1 = "Это: новый: дом";
$testarray = explode(":", $string1);
echo "<pre>";
print_r($testarray);
echo "</pre>"; ?>
"; print_r($testarray); echo ""; ?>

Функция explode () используется для разделения строки $string1 символом двоеточия (:) и создания массива $testarray, содержащего подстроки.

При этом переменная $string1 не изменяет свое значение.

И наоборот, аналогичным образом массивы можно преобразовывать в строки. Для выполнения этой операции предназначена функция
$resString = implode("символ", $массива);

В результате будет создана строка $resString, состоящая из элементов массива $массива, разделенных символом. Рассмотрим следующий пример:

Код В результате
<?
$arrayln = array("красный", "синий", "зеленый");
$stringOut = implode(",", $arrayln);
echo $stringOut;
?>

Результат выполнения функции implode () будет присвоен переменной $stringOut. Так же как и в случае с функцией explode (), implode () не изменяет значения входных аргументов, а только считывает их. Если какая-то функция будет преобразовывать входные параметры, об этом будет сказано отдельно.

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

<?
$stringOut = implode(", ", $arrayIn);
echo $stringOut;
?>

Преобразование переменных в массивы (и наоборот)

Иногда данные элементов массива необходимо сохранить в переменных, которые впоследствии можно использовать в выражениях РНР. Либо может возникнуть потребность в обратной операции — преобразовать переменные в элементы массива. Например, нужно выполнить одну и ту же операцию (прибавление 1) над несколькими переменными. Если преобразовать переменные в массив, с помощью одного оператора foreach можно получить доступ ко всем значениям и выполнить требуемые действия. В противном случае пришлось бы отдельно для каждой переменной писать свою строку кода.

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

Пример кода Результат выполнения
<?
$testarray = array("pink" => "гвоздика", "red" => "роза");
extract($testarray);
echo "<pre>","Моим любимым красным цветком является $red.\n";
echo "Моим любимым розовым цветком является $pink.","</pre>";
?>
"гвоздика", "red" => "роза"); extract($testarray); echo "
","Моим любимым красным цветком является $red.\n"; 
echo "Моим любимым розовым цветком является $pink.","
"; ?>

Функция compact () предназначена для выполнения обратного действия — преобразования набора переменных в массив. При этом значения переменных копируются в массив. Рассмотрим следующий пример:

<?
$color1 = "красный";
$color2 = "синий";
$a = "фиолетовый";
$b = "оранжевый";
$arrayIn = array("a", "b");
$arrayOut = compact("color1", "color2", $arrayIn) ;
echo "<pre>";
var_dump($arrayOut); echo "</pre>";
?>
"; var_dump($arrayOut); echo ""; ?>

Видно, что имена переменных использовались в качестве индексов.

Следует заметить, что в функции compact () использовались два метода для создания массива.

    Первый состоит в использовании имен переменных напрямую для индексов. Так происходит с переменными $color1 и $color2.
Второй состоит в использовании массива, содержащего имена переменвых. В предыдущем примере таковым является $arrayIn с переменными и $b. Функция compact () добавляет эти имена в результирующий массив $arrayOut.

Язык РНР позволяет использовать оба метода. Если имеется несколько переменных, которые необходимо сгруппировать в массив, первый метод является более предпочтительным. В противном случае лучше применять второй метод, объединив сначала имена переменных в некоторый массив, а затем использовать его в качестве аргумента функции compact ().

Разбиение и слияние массивов

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

РНР позволяет разбить массив и создать новый, содержащий подмножество элементов исходного. Общий синтаксис функции, выполняющей это действие, имеет следующий вид:
$subArray = array_slice($массив, nl, n2) ;

Параметр n1 указывает позицию элемента, с которого начнется разбиение исходного $массива (0 — с первого элемента, 1 — со второго), а n2 — количество элементов нового массива. Например:

Код В результате массив $subArray будет иметь вид
<?
$testarray = array("красный", "зеленый", "синий", "розовый");
$subArray = array_slice($testarray, 1, 2);
echo "<pre>"; var_dump($subArray);
echo "</pre>";
?>
"; var_dump($subArray); echo ""; ?>

Разбиение массива $testarray начинается с позиции номер 1 и содержит два элемента.

По умолчанию отсчет начинается с 0, а не с 1, поэтому первый элемент результирующего массива имеет значение " зеленый", а не " красный"

Аналогичным образом можно объединить различные массивы, используя следующее выражение:
$bigArray = array_merge($массив2, $массив2, ...);

Рассмотрим пример объединения двух массивов:

<?
$array1 = array("красный", "синий");
$array2 = array("зеленый", "желтый");
$bigArray = array_merge($array1, $array2);
echo "<pre>"; var_dump($bigArray); echo "</pre>";
?>
"; var_dump($bigArray); echo ""; ?>

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

<?
$array1 = array("color1" => "красный", "color2" => "синий");
$array2 = array("color1" => "зеленый", "color3" => "желтый");
$bigArray = array_merge($array1, $array2);
echo "<pre>"; var_dump($bigArray); echo "</pre>";
?>
"красный", "color2" => "синий"); $array2 = array("color1" => "зеленый", "color3" => "желтый"); $bigArray = array_merge($array1, $array2); echo "
"; var_dump($bigArray); echo "
"; ?>
Если необходимо объединить массивы с одинаковыми индексами, следует воспользоваться функцией array_merge_recursive(), а не array_merge (). В этом случае будет создан многомерный массив, а не заменены исходные значения. Многомерные массивы более подробно рассматриваются в разделе "Многомерные массивы" далее в этой главе.

Сравнение массивов

Очень часто необходимо знать, совпадают ли массивы. Для этого надо найти одинаковые и различные элементы. Эта операция может быть выполнена с помощью функции
$diffArray = array_diff($массив1, $массив2, ...);

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

<?
$array1 = array("а" => "яблоко", "b" => "апельсин", "c" => "банан");
$array2 = array("слива", "апельсин", "банан");
$diffArray = array_diff($array1, $array2);
echo "<pre>"; var_dump($diffArray); echo "</pre>";
?>
"яблоко", "b" => "апельсин", "c" => "банан"); $array2 = array("слива", "апельсин", "банан"); $diffArray = array_diff($array1, $array2); echo "
"; var_dump($diffArray); echo "
"; ?>

Поскольку элемент со значением "яблоко" находится в массиве $array1, но не в $аrrау2, он записывается в результирующий $diffArray с индексом "а".

Порядок следования аргументов в функции array_diff () является очень важным. Так, если последнюю строку кода в предыдущем примере переписать как
$diffArray = array_diff($array2, $array1);
то результирующий массив $diffArray будет иметь вид:

<?
$diffArray = array_diff($array2,$array1);
echo "<pre>"; var_dump($diffArray); echo "</pre>";
?>
"; var_dump($diffArray); echo ""; ?>

Единственным элементом, который находится в массиве $аггау2, но не в $array1, будет элемент со значением "слива". Именно поэтому он и записывается в $diffArray

Если необходимо найти элементы, отличающиеся либо своим значением, либо ключом, следует воспользоваться следующей функцией:
$diffArray = array_diff_assoc($array1, $array2);

Подставляя в качестве аргументов функции array_diff_assoc () массивы, которые использовались в предыдущем примере, получим следующий результат:

<?
$diffArray = array_diff_assoc($array2,$array1);
echo "<pre>"; var_dump($diffArray); echo "</pre>";
?>
"; var_dump($diffArray); echo ""; ?>

В этом случае ни один из элементов массива $array1 не содержится в $аrrау2, поскольку индексы у них различны.

Чтобы найти одинаковые элементы в двух и более массивах, в РНР предусмотрена функция
$simArray = array_intersect($массив1, $массив2, ...);

Рассмотрим пример использования этой функции для массивов из предыдущих примеров:

<?
$simArray = array_intersect($array1,$array2);
echo "<pre>"; var_dump($simArray); echo "</pre>";
?>
"; var_dump($simArray); echo ""; ?>

Функция array_intersect() считает элементы одинаковыми, если их значения равны. Для того чтобы учитывать равенство как ключа, так и значения элемента, в языке PНР предназначена функция array_intersect_assoc (), которая имеет следующий синтаксис:
$simArray = array_intersect_assoc($arrayl, $array2);

<?
$simArray = array_intersect_assoc($array1,$array2);
echo "<pre>"; var_dump($simArray); echo "</pre>";
?>
"; var_dump($simArray); echo ""; ?>

В результирующий массив $simArray будут записаны только те элементы $array1 и $аrrау2, которые имеют одинаковые ключ и значение. Используя в качестве аргумектов все те же массивы, результатом будет пустой массив, поскольку исходные не содержат одинаковых индексов.

Другие операции с массивами

В этом разделе мы рассмотрим другие операции над массивами.

    Суммирование массивов.
Удаление повторяющихся элементов.
Перестановка ключей и значений в массиве.

Суммирование массивов

Для сложения всех значений массива следует использовать функцию
$sum = array_sum($array);

Например:

<?
$arrayAdd = array(3, 3, 3);
$sum = array_sum($arrayAdd);
echo $sum;
?>

В результате будет получено значение 9.

Просуммировать можно только числовые массивы. Но, как уже упоминалось в главе 5, при использовании (в данном случае при попытке их "сложения") текстовые строки автоматически преобразуются в 0.

Удаление повторяющихся элементов

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

<?
$names = array("Мэри", "Салли", "Салли", "Сэм");
$names2 = array_unique($names);
echo "<pre>";
var_dump($names2);
echo"</pre>";
?>
";var_dump($names2);echo""; ?>

Как можно увидеть, в результирующем массиве продублированный элемент был удален.

Перестановка ключей и значений в массиве

РНР позволяет менять местами индексы (а точнее, ключи) и значения элементов массива. Пусть, например, имеется следующий массив:
$testarray['rose'] = red
$testarray['iris'] = purple

Для перестановки значений и ключей следует воспользоваться функцией
$arrayFlipped = array_flip($testarray);

В результате будем иметь:

<?
unset($testarray);
//var_dump($testarray);
$testarray['rose'] = red;
$testarray['iris'] = purple;
$arrayFlipped = array_flip($testarray);
echo"<pre>";
var_dump($arrayFlipped);
echo"</pre>";
?>
"; var_dump($arrayFlipped); echo""; ?>

Многомерные массивы

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

    лук (onion) — 0,50;
яблоко (apple) — 2,50;
апельсин (orange) — 2,00;
    бекон (bacon) — 3,50;
    картофель (potato) — 1,00;
    ветчина (ham) — 5,00.

Ее можно сохранить в одномерном массиве следующим образом
$foodPrices['onion'] = 0.50;
$foodPrices['apple'] = 2.50;
$foodPrices['orange'] = 2.00;
$foodPrices['bacon'] =3.50;
SfoodPrices['potato'] = 1.00;
$foodPrices['ham'] = 5.00;

Тогда в любой момент можно просмотреть информацию о ценах на продукты путем прямого доступа к элементам массива $foodPrices. Но представим, что список товаров содержит 3000 наименований. В этом случае необходимо будет просмотреть 3000 элементов массива, чтобы найти информацию о конкретном продукте, например о луке (onion) или ветчине (ham).

Однако список товаров можно разделить на три группы: овощи (vegetable), фрукты (fiuit) и мясные изделия (meat). И тогда необходимо будет просматривать информацию о продуктах только в рамках одной категории, а не весь список, что является более эффективным. Это можно осуществить, используя многомерные массивы:
Таблица 6.10

<?
$foodPrices['vegetable']['onion'] = 0.50;
$foodPrices ['vegetable']['potato'] = 1.00;
$foodPrices['fruit']['apple'] = 2.50;
$foodPrices['fruit']['orange'] = 2.00;
$foodPrices['meat']['bacon'] = 3.50;
$foodPrices['meat']['ham'] = 5.00;
echo "<pre>";
print_r($foodPrices);
echo "</pre>";
?>
"; print_r($foodPrices); echo ""; ?>

Такой массив называется многомерным (multidimensional), поскольку представляет собой массив массивов. В таблице 6.10, справа показана структура массива $foodPrices. В таблице видно, что массив $foodPrices содержит три пары ключ-значение. При этом значение каждого элемента с ключами vegetable, fruit и meat — массив с двумя элементами. Например, элелмент с ключом meat — это массив с двумя парами ключ-значение: bacon-3.50 и ham-5.00.

Массив $foodPrices является двумерным. Язык РНР также позволяет работать с четырех-, пяти-, шестимерными или массивами большей размерности. Однако их использование может внести большую путаницу в код сценария.

Создание многомерных массивов

РНР позволяет создавать многомерные массивы точно так же, как и одномерные. Например, можно воспользоваться прямым присваиванием значений элементам массива:
$foodPrices['vegetable']['potato'] = 1.00;
$foodPrices['fruit']['apple'] = 2.50;

Можно также воспользоваться сокращенной записью:
transportation['car'][] = "Форд";
transportation['car'][] = "Джип";

По умолчанию в качестве индексов будут использоваться целые числа, начиная с 0:
transportation[car][0] = Форд;
transportation[саг][1] = Джип;

Создать многомерный массив можно с помощью выражения array:

<?
$foodPrices1 =
array(
"vegetable" => array("potato" =>1.00, "onion" => .50),
"fruit" => array("apple" => 2.50, "orange" => 2.00)
);
echo "<pre>";
print_r($foodPrices1) ;
echo "</pre>";
?>
array("potato" =>1.00, "onion" => .50), "fruit" => array("apple" => 2.50, "orange" => 2.00) ); echo "
";
		print_r($foodPrices1) ;
		echo "
"; ?>

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

Вывод многомерных массивов

Для вывода информации о многомерном массиве можно воспользоваться теми же функциями, что и для одномерного, — print_r () или var_dump ().

Использование многомерных массивов в выражениях

Для получение значений элементов многомерного массива используются те же процедуры, что и для одномерного. Рассмотрим пример, в котором доступ к элементам осуществляется напрямую:
$hamPrice = $foodPrices['meat']['ham'];

Для вывода значений можно использовать функцию echo:

<?
echo $foodPrices['meat']['ham']
?>

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

<?
echo "Ветчина стоит \${$foodPrices['meat']['ham']}";
?>

Заметим, что перед первым символом $ стоит символ \. Он используется для того, чтобы РНР интерпретировал $ не как символ начала имени переменной, а буквально.

Ранее в этой главе приводилось описание различных функций для преобразования текстовых строк в массивы (и наоборот), массивов в отдельные переменные и осуществления других операций. Многие из этих операций не имеет смысла использовать для многомерных массивов, так как они будут работать некорректно. Однако это можно осуществить для отдельных элементов, которые сами по себе являются массивами. Рассмотрим, например, функцию implode (), которая преобразует массив в текстовую строку. Ее нельзя напрямую использовать для многомерного массива, поскольку его значения— массивы. Но, как уже упоминалось, эту операцию можно выполнить для отдельных элементов:

<?
$resString = implode(" _:_ ", $foodPrices['vegetable']);
echo $resString ;
?>

Это выражение преобразует элементы массива $foodPrices['vegetable'] в строку,в которой в качестве символа-разделителя используется " _:_ ". Результат работы функции в таблице справа от кода.

Проход по многомерному массиву

Проход по многомерному массиву можно осуществить с помощью функции foreach (ее описание см. выше). Поскольку двумерный массив, такой как $foodPrices, содержит в качестве элементов два массива, для прохода необходимо дважды использовать оператор foreach: один внутри другого. (Использование оператора внутри другого называется вложением (nesting).)

Нижеприведенный фрагмент кода позволяет вывести значения элементов многомерюго массива.

<?
foreach ($foodPrices as $category )
{
foreach ($category as $food =>$price )
{
$f_price =sprintf("%010.2f",$price);
echo "$food: \$$f_price \n";
}
}
?>
$price )
		{
		$f_price =sprintf("%010.2f",$price);	
		echo "$food: \$$f_price \n"; 
		}
	}
	?>

Рассмотрим поэтапно, как интерпретируется использование выражения foreach.

  1. Обрабатывается первая пара индекс-значение массива $foodPrices, и значение элемента записывается в переменную $category (которая сама по себе является массивом).
  2. Обрабатывается первый элемент массива $category: его индекс сохраняется в переменной $food, а значение — в $price.
  3. Значение переменной $price преобразуется в денежный формат.
  4. Выводятся в одну строку наименование продукта и его цена.
  5. Обрабатывается следующий элемент массива $category.
  6. Формат переменной $price преобразуется в денежный, и выводится последующая строка с наименованием продукта и его цены.
  7. По достижении конца массива $category заканчивается внутренний цикл выражения foreach.
  8. Обрабатывается следующий элемент массива $foodPrices во внешнем цикле foreach, в котором значение присваивается переменной $category.
  9. Шаги 1-8 повторяются до тех пор, пока не будет достигнут конец массива $category. Таким образом, будут завершены внутренние и внешние циклы выражения foreach.

Другими словами, внешний цикл foreach начинается с первого элемента с индексом vegetable и значением-массивом, которое присваивается переменной $category. В свою очередь, внутренний цикл foreach предназначен для прохода по всем элементам массива $category и заканчивается по достижении последнего элемента. Затем осуществляется переход во внешний цикл foreach, где обрабатывается вторая пара индекс-значение массива $foodPrices, и т.д. до конца.

Массивы, встроенные в PHP

В языке РНР имеется несколько встроенных массивов, которые можно использовать при написании сценариев. При этом в них содержится различная полезная информация. Например, данные об используемом сервере (заголовках, настраиваемых путях и размещении сценариев) сохраняются в массиве $_SERVER. Так, информация об имени текущего запущенного сценария содержится в переменной $_SERVER['PHP_SELF'].

<?
print_r($_SERVER['PHP_SELF']);
?>

Использование суперглобальных массивов

На данный момент два набора встроенных массивов содержат одну и ту же информацию.Одни из них были включены в РНР 4.1.0 и назывались суперглобальными (superglobal) или автоглобальными (autoglobals), поскольку могли использоваться в любом фрагменте кода, даже внутри функций. (Функции и использование переменных внутри них описываются в главе 8.) Более ранние версии массивов с длинными именами, такими как <$HTTP_SERVER_VARS, предварительно необходимо было объявить глобальными, чтобы иметь возможность использовать их в функциях (подробнее об этом — в главе 8). В общем случае рекомендуется использовать новые версии массивов, имена которых начинаются с символа подчеркивания (_). К старым версиям необходимо прибегать только в тех случаях, когда использование версий РНР ниже 4.1.0 неизбежно.

Обновленный конфигурационный файл php.ini, используемый в РНР 5, позволяет предотвратить автоматическое создание старых массивов с длинными именами. Вряд ли есть необходимость их использования, однако некоторые старые сценарии все еще могут их использовать. Следующая строка в файле php.ini позволяет управлять этими установками:
register_long_arrays = On

На данный момент по умолчанию это значение равно On. Если старые сценарии не используются, это значение стоит изменить на Off.

И хотя в данный момент это значение по умолчанию равно On, в будущем ситуация может измениться, и это значение станет равным Off. Если, например, запускается сценарий и выдается ошибка в строке кода, содержащей переменную типа $HTTP_GET_VARS, то следует проверить настройки в файле php.ini, чтобы иметь возможность использовать массивы с длинными именами. Если это значение равно Off, значит, данные массивы не были созданы вообще и их использование запрещено.

Список встроенных массивов и их краткое описание представлены в табл. 6.2. Детальное описание возможностей специальных массивов приведено в соответствующих главах данной книги. Например, встроенные массивы, содержащие информацию о данных формы, описываются в главе 10.
Таблица 6.2. Встроенные массивы

Массив Описание
$GLOBALS Содержит все глобальные переменные. Например, если переменной $testvar присваивается значение 1, к ней можно получить доступ следующим образом:
$GLOBALS [' testvar' ]
$_POST Содержит все переменные формы, переданные с помощью метода POST: method = "post"
$HTTP_POST_VARS То же, что и $_POST
$_GET Содержит все переменные, переданные с предыдущей страницы как часть URL-адреса, а также переменные формы, переданные с помощью метода GET: method = "get"
$HTTP_GET_VARS То же, что и $_GET
$_COOKIE Содержит все переменные cookie
$HTTP_COOKIE_VARS То же, что и $_COOKIE
$_SESSION Содержит все переменные сеанса
$HTTP_SESSION_VARS То же, что и $_SESSION
$_REQUEST Содержит все переменные, которые содержатся в массивах $_POST, $_GET и $SESSION
$_FILES Содержит имена всех загруженных файлов
$HTTP_FILES_VARS То же, что и $_FILES
$_SERVER Содержит информацию об используемом сервере. Поскольку Web-серверы бывают разные, то и информация может быть различной
$HTTP_SERVER_VARS ТО же, ЧТО И $_SERVER
$_ENV Содержит информацию об операционной системе: имя, системный диск, путь к временному каталогу. Очевидно, что эта информация зависит от используемой операционной системы
$HTTP_ENV_VARS То же, что и $_ENV

Использование массивов $_SERVER И $_ENV

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

<?
foreach($_SERVER as $key => $value)
{
echo "Ключ = $key, Значение = $value\n";
}
?>
"; echo "" ; echo ""; echo ""; echo ""; foreach($_SERVER as $key => $value) { echo "" ; echo ""; echo ""; echo ""; } echo "
"; echo "Ключ"; echo ""; echo "Значение"; echo "
"; echo "$key"; echo ""; echo "$value"; echo "
"; ?>

Элемент с ключом DOCUMENT_ROOT содержит путь к каталогу, в котором Web-сервер Apache ищет требуемые Web-страницы. Элемент с индексом PHP_SELF содержит имя сценария, который выполняется в данный момент.

Для просмотра информации в массиве $_ENV можно также воспользоваться функцией phpinfо() с аргументом 16:

<?
//phpinfo(16);
?>
Результат выполнение этого кода на отдельной странице

 

Встроенные массивы можно использовать только тогда, когда включен режим track-vars. По умолчанию он включен начиная с версии РНР 4.0.3, кроме тех случаев, когда администратор намеренно не выключает его при установке РНР. Однако это происходит редко. Но если есть подозрение, что режим track-vars отключен, это следует проверить с помощью функции phpinfо(). И, если это так, необходимо переустановить модуль РНР.

Использование переменных $argv и $argc

н
е

в
с
ё

т
а
к

п
р
о
с
т
о

Иногда информацию для сценария необходимо передать извне. Одним из возможных способов является передача данных посредством командной строки при запуске сценария. Однако для Web такой метод используется редко, в отличие от запуска РНР CLI из командной строки. Пусть, например, необходимо написать программу, суммирующую два числа, значения которых нужно передать при запуске сценария. Это можно осуществить с помощью следующей команды:
php add.php 2 3

В этом выражении add.php — имя сценария, а 2 и 3 — числа, которые необходимо сложить. Эти значения можно получить в сценарии, используя массив $argv. В нем содержится следующая информация:
$argv[0] = add.php
$argv[l] = 2
$argv[2] = 3

Таким образом, массив $argv содержит по крайней мере одно значение — имя сценария,

Затем в сценарии можно воспользоваться операцией суммирования двух чисел:
$sum = $argv[1]+$argv[2];
echo $sum;

В результате получим значение
5

Можно воспользоваться также и переменной $argc. Она используется для подсчета количества элементов в массиве $argv. Минимальное значение переменной $argc — 1, которое соответствует имени сценария. В предыдущем примере ее значение равно 3.

<?
var_dump( $_SERVER['argv']);
//php add.php 2 3;
?>

 

 

 

 

 

 

 

Глава 4 Глава 5 Глава 6 Глава 7 Глава 8 Глава 9


Февраль 2026 г
ПнВтСрЧтПтСбВс
05      1
062345678
079101112131415
0816171819202122
09232425262728 
Март 2026 г
ПнВтСрЧтПтСбВс
09      1
102345678
119101112131415
1216171819202122
1323242526272829
143031     
Апрель 2026 г
ПнВтСрЧтПтСбВс
14  12345
156789101112
1613141516171819
1720212223242526
1827282930   
End
fenita la comedia c 2026 End