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

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

Функция shuffle ()

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

front_page.php — использование РНР для создания динамической титульной страницы

<?php
$pictures = array ('stroypage3.gif', 'stroypage4.gif', 'stroypage5.gif', 'stroypage6.gif', 'stroypage7.gif', 'stroypage8.gif', 'stroypage9.gif', 'stroypage10.gif','stroypage11.gif');
shuffle ($pictures);

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<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 а

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

vieworders.php — использование РНР для отображения заказов

<?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>';
}
?>

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

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

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

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

vieworders2.php — использование РНР для разделения, форматирования и отображения заказов

<?php
//создать короткое имя переменной
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<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.

назадвверхвперед
Rambler's Top100