В некотых приложениях требуется изменить порядок следования элементов массива. Функция 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
.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться