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

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

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

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

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

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

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

Порядок следования элементов массива. Загрузка массивов из файлов

Порядок следования элементов массива

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

Функция shuffle ()

Как сделать, чтобы на титульной странице постоянно отображались три произвольно выбранных автомобиля, запчастями к которым торгует компания АВС. Ниже представлен сценарий, который отображает на экране три случайно выбранных рисунка, сортируя элементы массива в случайном порядке, а затем отображая первые три из них.

<?php
$pictures = array ('phpstroy3.gif', 'phpstroy4.gif', 'phpstroy5.gif', 'phpstroy6.gif', 'phpstroy7.gif', 'phpstroy8.gif', 'phpstroy9.gif');
shuffle ($pictures);
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС</title>
</head>

<body>
<h2 align="center">Запчасти к автомобилям Nissan</h2>
<table width="100%">
<tr>
<?php
for ($i = 0; $i < 3; $i++)
{
echo '<td align=center><img src="../images/'.$pictures [$i]. '">';

echo '</td>';
}
?>
</tr>
</table>
</body>
</html>

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

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

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

Функция array_reverse ()

Функция array_reverse () принимает массив и создает новый массив, элементы которого расположены в обратном порядке. Например, существует множество способов создания массива, содержащего убывающую последовательность чисел от 10 до 1.

Использование функции range () обычно приводит к созданию возрастающей последовательности. Ее можно заменить на убывающую с помощью функций array_reverse () или rsort (). Либо можно создать такой массив, выбирая по одному элементу из исходного массива в цикле for:

$numbers = array ();
for($i = 0; $i > 0; $i--)
array_push ($numbers, $i);

Цикл for может выполняться в порядке убывания, как показано в этом примере. Начальное значение устанавливается большим, в конце каждого цикла операция декремента -- уменьшает значение счетчика на единицу.

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

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

$numbers = range (1,10);

$numbers = array_reverse ($numbers);

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

Загрузка массивов и з файлов

В разделе Запись в файл. Закрытие файла. Считывание из файла рассматривались вопросы сохранения заказов клиентов. Каждая строка результирующего файла выглядит приблизительно так:

16:52, 28 September 100 фильтров масляных 300 фильтров воздушных 500 свечей зажигания 8260 RUB ул. Гоголя д. 4 а

Для обработки или выполнения этого заказа его можно загрузить в массив.

<?php
//создать короткое имя переменной
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС. Заказы клиентов</title>
</head>

<body class="text_blok">
<h2>Заказы клиентов</h2>
<?php
$orders = file("$DOCUMENT_ROOT/phpstroy/test/orders.txt");
$number_of_orders = count ($orders);
if ($number_of_orders == 0)
{
echo '<p><strong>Нет ожидающих заказов. Пожалуйста, попытайтесь позже.</strong></p>';
}
for ($i=0; $i<$number_of_orders; $i++)
{
echo $orders [$i]. '<br>';
}
?>
</body>
</html>

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

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

В этом сценарии также применена функция count () для подсчета количества элементов в массиве.

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

<?php
//создать короткое имя переменной
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Компания АВС. Заказы клиентов</title>
<link href="../../svd.css" rel="stylesheet" type="text/css">
</head>

<body class="text_blok">
<h2>Заказы клиентов</h2>
<?php
//Считывание всего файла.
//Каждый заказ становится элементом массива
$orders = file("$DOCUMENT_ROOT/phpstroy/test/orders.txt");
//Подсчет заказов, хранящихся в массиве
$number_of_orders = count ($orders);
if ($number_of_orders == 0)
{
echo '<p><strong>Нет ожидающих заказов. Пожалуйста, попытайтесь позже.</strong></p>';}
echo "<table border=1>\n";
echo '<tr><th bgcolor = \"#CCCCFF\">Дата заказа</th>
<th bgcolor = \"#CCCCFF\">Фильтр масляный</th>
<th bgcolor = \"#CCCCFF\">Фильтр воздушный</th>
<th bgcolor = \"#CCCCFF\">Свечи зажигания</th>
<th bgcolor = \"#CCCCFF\">Всего</th>
<th bgcolor = \"#CCCCFF\">Адрес</th>
</tr>'
;

for ($i=0; $i<$number_of_orders; $i++)
{
//Разбиение строк
$line = explode ("\t", $orders[$i]);
//Сохранение только количество заказанных товаров
$line [1] = intval ($line[1]);
$line [2] = intval ($line[2]);
$line [3] = intval ($line[3]);
//Вывод заказа
echo "<tr><td>$line[0]</td>
<td align=right>$line[1]</td>
<td align=right>$line[2]</td>
<td align=right>$line[3]</td>
<td align=right>$line[4]</td>
<td>$line[5]</td>
</tr>"
;
}
echo "</table>";
?>
</body>
</html>

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

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

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

array explode (string separator, string string [, int limit])

При сохранении данных в качестве разделителя используется символ табуляции:

explode ("\t", $orders[$i])

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

16:52, 28 September 100 фильтров масляных 300 фильтров воздушных 500 свечей зажигания 8260 RUB ул. Гоголя д. 4 а

разбивается на части:

"16:52, 28 September", "100 фильтров масляных", "300 фильтров воздушных", "500 свечей зажигания", " 8260 RUB", "ул. Гоголя д. 4 а".

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

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

Существует ряд способов возможного извлечения чисел из этих строк. В данном случае использовалась функция inval (). Эта функция преобразует тип string в тип integer. Преобразование в данном примере выполняется достаточно рационально, оно игнорирует такие фрагменты строки, как метка, которые не могут быть преобразованы в integer.