Сортировка массивов
Суть и назначение массива - упорядоченного набора данных, каждый элемент которого имеет индекс или ключ. Инструкция array. Косвенный и прямой перебор массива. Массивы и строки. Добавление элементов в массив. Основы работы с файлами. Сортировка массивов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 25.09.2012 |
Размер файла | 244,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Списки и ассоциативные массивы
Массив -- это упорядоченный набор данных. Каждый элемент массива имеет индекс или ключ. Индекс (ключ) служит для однозначной идентификации элемента внутри массива. В одном массиве не может быть двух элементов с одинаковыми индексами.
Пример 1:
$zver[]="Ежик";
$zver[]="Барашек";
$zver[]="Мышка";
$zver[]="Хомяк";
$zver[]="Собака";
for($i=0; $i<count($zver) ; $i++ )
echo "$i -- $zver[$i] <br>";
Массивы, индексами которых являются числа, начинающиеся с нуля без пропусков, называются списками.
Массивы, индексами которых являются строки, называются ассоциативными. Индексы ассоциативных массивов называются ключами.
Пример 2:
$People["Иванов"] = "Иван Иванович";
$Реорlе["Сидоров"] = "Николай Петрович";
$Реорlе["Петров"] = "Петр Александрович";
echo $Реорlе["Сидоров"];
Инструкция array
Инструкция array () служит специально для создания массивов.
· $A = array() создает пустой массив
· $A = array("Иванов"=>"Иван","Петров"=>"Петр") создает ассоциативный массив с двумя элементами.
· $A = array("Иванов","Петров") создает список с двумя элементами, индексы нумеруются с нуля.
Инструкцию array() удобно использовать для создания многомерных массивов. Cоздадим массив, элементами которого являются ассоциативные массивы с ключами "name", "age", "email", "hobby", "gorod", "avto". Для доступа к конкретному элементу используется двойной ключ.
Пример 3:
$student=array(
"АВСЮКЕВИЧ"=>array("name"=>"АННА","age"=>"22","email"=>"anik@mail.ru","hobby"=>"СЛУЖЕБНОЕ СОБАКОВОДСТВО","gorod"=>"СЛУЦК","avto"=>"peugeot"),
"АЛЕКСЕЕВА"=>array("name"=>"МАРИНА","age"=>"21","email"=>"marik@google.com","hobby"=>"ПЕНИЕ","gorod"=>"СТОЛБЦЫ","avto"=>"renault"),
"АЛЬХОВИК"=>array("name"=>"ТАТЬЯНА","age"=>"21","email"=>"tanik@tut.by","hobby"=>"ГОРНЫЙ СЛАЛОМ","gorod"=>"МИОРЫ","avto"=>"citroen"),
"АРЖАНОВА"=>array("name"=>"ЕКАТЕРИНА","age"=>"22","email"=>"katik@yandex.ru","hobby"=>"БУЛОЧКИ","gorod"=>"ВЕРХНЕДВИНСК","avto"=>"honda"),
"ВОРОЖУН"=>array("name"=>"АННА","age"=>"22","email"=>"anik@inbox.ru","hobby"=>"СКАУТИНГ","gorod"=>"ПОЛОЦК","avto"=>"opel"),
"ВОРОНОВ"=>array("name"=>"ОЛЕГ","age"=>"21","email"=>"oleg@telegraf.by","hobby"=>"ХАКИНГ","gorod"=>"ЛИДА","avto"=>"audi"),
"ГУСТИНОВИЧ"=>array("name"=>"ЕЛЕНА","age"=>"23","email"=>"lenik@mail.ru","hobby"=>"СЛУЖЕБНОЕ ОВОЩЕВОДСТВО","gorod"=>"ЛУНИНЕЦ","avto"=>"fiat"),
"ДЕМЯН"=>array("name"=>"АНАСТАСИЯ","age"=>"20","email"=>"nastik@yandex.ru","hobby"=>"КОМПЬЮТЕРНЫЕ ИГРЫ","gorod"=>"ПИНСК","avto"=>"skoda"),
"ДУШЕВСКАЯ"=>array("name"=>"ОЛЬГА","age"=>"22","email"=>"olik@tut.by","hobby"=>"СЛУЖЕБНОЕ ПЧЕЛОВОДСТВО","gorod"=>"БЕШЕНКОВИЧИ","avto"=>"subaru")
echo "{$student["ГУСТИНОВИЧ"]["name"]} "." {$student["ГУСТИНОВИЧ"]["gorod"]}<br><br>";
Перебор массива
файл массив индекс ключ
Для перебора массивов в РНР можно использовать два метода: косвенный перебор и прямой перебор.
Принцип косвенного перебора заключается в том, что сначала вычисляется очередной индекс (ключ), а затем по этому индексу косвенно находится значение элемента массива. Например:
$Реорlе[0]="Коля";
$People[1]="Витя";
$Реор1е[2]="Дима";
for($i=0; $i<count($People); $i++)
echo "$People[$i] <br>";
Выполнить перебор ассоциативного массива поможет следующий цикл:
Пример 4:
for(Reset($student);($k = key($student)); Next($student))
echo "$k = $student[$k] <br>";
Функция Reset() устанавливает текущий элемент массива $student на первую позицию, как бы «перематывает» массив на начало. Функция кеу() возвращает ключ текущего элемента. Если в массиве нет больше элементов, то эта функция возвратит 0, и цикл прекратит свою работу. Функция Next() перемещает текущий элемент на одну позицию вперед, то есть переходит к следующему элементу массива.
В теле цикла можно также использовать функцию current(), которая возвращает значение текущего элемента. С использованием этой функции вышеприведенный цикл можно переписать так:
for(Reset($student); ($k = key($student)); Next($student))
echo "$k =".current($student)."<br>";
В РНР имеется возможность перебора такого ассоциативного массива с конца в начало. Для этого нужно использовать функции End() и Prev() вместо функций Reset() и Next(). Первая из них устанавливает текущий элемент в конец массива, а вторая перемещает текущий элемент на одну позицию назад, то есть переходит к предыдущему элементу:
for(End($student); ($k = key($student)); Prev($student))
echo "$k = {$student [$k]} <br>";
Принцип прямого перебора заключается в том, чтобы при каждой итерации цикла одновременно получать и ключ, и значение текущего элемента массива. Для прямого перебора в РНР используется цикл foreach ($student as $key => $value), который позволяет обойти массив поэлементно, при этом в переменной $key находится ключ текущего элемента, а в $value - его значение.
Пример 5:
foreach ($student as $key => $value)
echo "$key = $value<br>";
Пример 6 - обход двумерного массива двумя вложенными циклами:
foreach($student as $key => $value)
{
echo "$key:";
foreach($value as $k=>$v)
{
if ($k!="name")
echo ",";
echo " $k = $v";
}
echo "<br>------------------------------------------------------------<br>";
}
Пример 7 - вывод двумерного массива в таблицу:
<table border=1 align=center>
<tr align=center>
<td>Фамилия</td>
<td>Имя</td>
<td>Возраст</td>
<td>Электронный адрес</td>
<td>Любимое занятие</td>
<td>Город</td>
<td>Автомобиль</td>
</tr>
<?php
foreach($student as $key => $value)
{
echo "<tr><td>$key</td>";
foreach($value as $k=>$v)
echo "<td>$v</td>";
echo "</tr>";
}
?>
</table>
Массивы и строки. Добавление элементов в массив
Очень часто на практике приходится преобразовывать строку с разделителями в массив и наоборот. Для этого используются функции explode() и join().
Функция explode() имеет следующий синтаксис: list explode(string $token, string $str [, int $limit]). Функция получает строку, заданную в ее втором аргументе, и пытается найти в ней подстроки, равные первому аргументу. Затем по месту вхождения этих подстрок строка "разрезается" на части, помещаемые в массив-список, который и возвращается. Если задан параметр $limit, то учитываются только первые $limit участков "разреза". Таким образом, возвращается список из не более чем $limit элементов:
Пример 8:
$st = "3233221|Ежиков Арсений|1992-03-11|Текст|в|котором|зачем-то|много|палок - типа комментарий";
$person = explode("|", $st, 4); // Мы знаем, что там только 4 поля.
echo "получен массив-список:<br>";
for($i=0; $i<count($person); $i++)
echo "$i: {$person[$i]}<br>";
Функция join() производит обратное действие: string join(string $glue, string join (string $glue, list $List). Она берет ассоциативный массив (обычно это список) $List, заданный во втором параметре, и "склеивает" его значения при помощи "строки-клея" $glue из первого параметра. Примечательно, что вместо списка во втором аргументе можно передавать любой ассоциативный массив -- в этом случае будут рассматриваться только его значения.
Пример 8(продолжение):
$stroka=join(" --- ", $person);
echo "Обратно с новыми разделителями:<br>$stroka";
Используя функцию array_push (), которая добавляет элементы в конец массива, можно реализовать добавление ассоциативных массивов $Record в двумерный массив $Collection
Пример 9:
$Collection=array(array("name"=>"Имя","fam"=>"Фамилия"));
$Record=array("name"=>"Арсений","fam"=>"Ежиков");
array_push($Collection,$Record);
foreach ($Collection as $key => $value)
echo "$key = $value<br>";
echo "<br>";
foreach($Collection as $key => $value)
{
echo "$key:";
foreach($value as $k=>$v)
{
if ($k!="name")
echo ",";
echo " $k = $v";
}
echo "<br>------------------------------------------------------------<br>";
}
Основы работы с файлами
Работа с файлом осуществляется в три этапа:
· Открытие файла.
· Обработка файла (чтение или запись).
· Закрытие файла.
Функция открытия файла возвращает целое число -- идентификатор (дескриптор) файла. Дальнейшее обращение к файлу осуществляется через дескриптор, а не по имени.
Функция fopen($filename, $mode) открывает файл (или URL) и возвращает его идентификатор. Эта функция принимает два параметра -- имя файла $filename и режим $mode, в котором необходимо открыть файл. В качестве имени файла можно указывать как абсолютный, так и относительный пути. При указании относительного пути используют каталоги «..» (две точки ) -- родительский каталог и «.» (точка) -- текущий каталог:
· ./ array, txt -- файл находится в текущем каталоге;
· ../array.txt --файл в родительском каталоге;
· ../command/array. txt -- файл в подкаталоге command родительского каталога.
Режимы открытия файла
Функция fopen() возвращает false, если ей не удалось открыть файл: например, указанный файл не существует. Было бы удобно одним вызовом анализировать возвращаемое значение и, если оно равно false, завершать работу сценария с выводом подходящего сообщения. Существует конструкция, позволяющая это сделать: <вызов_функции> or die("сообщение об ошибке"). Если вызов функции неуспешен (функция возвратила false), будет выведено сообщение об ошибке и работа сценария будет завершена.
Функция file(string $filename) читает файл целиком в список, каждый элемент которого в результате ее работы содержит одну строку, прочитанную из файла. Используя функции file() и join(), можно прочитать весь файл в одну строку:
$s = join (" ", file("file.txt"));
echo $s;
Функция -- feof() возвращает true, если достигнут конец файла.
Текстовые файлы удобно читать и записывать по одной строке за раз. Для построчного чтения в РНР предусмотрена функция fgets(int $f, int $ length), которая читает из файла $f строку длиной $length символов. Символ новой строки также включается в результат. Если строка занимает больше чем $length-1 символов, то возвращаются только первые $length-1 символов строки. Если строка занимает менее $length-1 символов, то возвращаются все символы до конца строки (т. е. до символа \n).
Пример 10:
$f = fopen ("file.txt", "rt") or die("Ошибка");
while(!feof($f))
{ $File[]= fgets ($f,100); }
fclose($f);
for($i=0; $i<count($File); $i++)
echo "$File[$i] <br>";
Для записи в файл одной строки в текстовом режиме служит функция fputs(int $f, string $s), которая записывает строку $s в текстовый файл с идентификатором $f.
После завершения работы сценария интерпретатор РНР сам закроет все открытые сценарием файлы, однако закрывать файлы все же рекомендуется. Во-первых, это экономит память. Во-вторых, позволяет избежать потери записанных в файл данных в результате сбоя. Для закрытия файла предназначена функция fclose($f).
Пример 11 - запись в файл данных из формы:
<?php
if(!isset($_REQUEST["doGo"]))
{
?>
<form action=rec.php method=POST>
<table>
<?php
$Form_Fields=array("prep_fam"=>"Фамилия","name"=>"Имя","prep_age"=>"Возраст","prep_email"=>"Электронный адрес","prep_hobby"=>"Любимое занятие","prep_gorod"=>"Город","prep_avto"=>"Автомобиль");
foreach($Form_Fields as $key=>$value)
echo "<tr><td>$value:</td><td> <input type=text name=$key size=50></td>";
?>
</table>
<input type=submit name="doGo" value="Add to file">
</form>
<?php
}
else
{
$Record_String=join("//",$_REQUEST);
$Record_String=str_replace("//Add to file","\r\n",$Record_String);
$f = fopen ("data.txt", "at") or die("Ошибка");
fputs($f, $Record_String);
fclose($f);
}
?>
Пример 12 -чтение данных из файла в массив:
<?php
$Collection=array(array("prep_fam"=>"Фамилия","name"=>"Имя","prep_age"=>"Возраст","prep_email"=>"Электронный адрес","prep_hobby"=>"Любимое занятие","prep_gorod"=>"Город","prep_avto"=>"Автомобиль"));
$f = fopen("data.txt","rt") or die("Ошибка!\n");
while (!feof($f))
{
$string = fgets ($f, 255);
$person = explode("//", $string);
$Record=array("prep_fam"=>$person[0],"name"=>$person[1],"prep_age"=>$person[2],"prep_email"=>$person[3],"prep_hobby"=>$person[4],"prep_gorod"=>$person[5],"prep_avto"=>$person[6]);
array_push($Collection,$Record);
}
echo "<table border=2>";
foreach($Collection as $key => $value)
{
echo "<tr>";
foreach($value as $k=>$v)
{
echo "<td> $v</td>";
}
echo "</tr>";
}
echo "</table>";
?>
Сортировка массивов
Для сортировки массивов в РНР предназначено много различных функций, основные из них:
· asort() и arsort() -- сортировка по значениям;
· ksort() -- сортировка по ключам;
· sort() -- сортировка списка;
· array_reverce() -- «переворачивание» массива;
· shuffle() -- перемешивание списка.
Пример 12
<?php
$FIO = array(
"ЛЕСНОЙ"=>"ПЕТР",
"ПЛЮШКИН"=>"АЛЕКСАНДР",
"ШИШКИН"=> "ЕВГЕНИЙ",
"ЕЖИКОВ"=>"КОНСТАНТИН",
"ГРИБНОЙ"=>"НИКОЛАЙ",
"МИШКИН"=>"ЕГОР",
"БЕЛКИН"=>"ВЯЧЕСЛАВ",
);
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
asort($FIO);
echo "------------<br>";
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
echo "------------<br>";
arsort($FIO);
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
ksort($FIO);
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
echo "------------<br>";
krsort($FIO);
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
echo "------------<br>";
Если вам нужно отсортировать список, то удобнее всего использовать функцию sort (). Данная функция разрывает пары ключ=>значение, поэтому ее нужно использовать только для списков.
$FIO = array(
0=>"ПЕТР",
1=>"АЛЕКСАНДР",
2=> "ЕВГЕНИЙ",
3=>"КОНСТАНТИН",
4=>"НИКОЛАЙ",
5=>"ЕГОР",
6=>"ВЯЧЕСЛАВ",
);
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
echo "------------<br>";
sort($FIO);
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
echo "------------<br>";
Функция shuffle() «перемешивает» список, то есть значения результирующего списка будут размещены в случайном порядке. Данная функция полностью изменяет массив, поэтому ее можно использовать только для списков.
Перед вызовом этой функции нужно инициализировать генератор случайных чисел, иначе при каждом новом вызове функции shuffle() результат перемешивания будет один и тот же (при перемешивании одного и того же массива). Для инициализации генератора случайных чисел используется функция mt_srand():
mt_srand(time()* 100000);
shuffle ($FIO) ;
foreach($FIO as $key=>$value)
echo "$key----$value<br>";
Задания
1. Разработать форму для ввода записи со следующими полями: "stN_fam", "stN_name", "stN_age", "stN_email", "stN_hobby", "stN_gorod", " stN_avto", где N - номер варианта.
2. Самостоятельно изучить пункт «Сортировка массивов».
3. На базе примеров 11 и 12 разработать следующий проект:
· Загружается форма «выберите действие», на которой с помощью переключателей пользователь выбирает вариант «добавить запись» или «показать записи».
· Для случая «добавить запись» загружается форма соответствующей структуры с кнопкой Add to file, по нажатии на которую введенная запись добавляется в файл и загружается форма «выберите действие».
· Для случая «показать записи» все записи из файла выводятся в браузере в таблицу. Снизу находится гиперссылка, позволяющая перейти к форме «выберите действие».
Размещено на Allbest.ru
Подобные документы
Изучение понятия и основных видов массивов. Ввод массива с клавиатуры и вывод на экран. Сортировка массивов. Метод простых обменов (пузырьковая сортировка). Сортировка простым выбором и простым включением. Решение задач с использованием массивов Паскаля.
курсовая работа [82,1 K], добавлен 18.03.2013Иерархическая структура производного типа данных в языке Паскаль. Определение массива как упорядоченного набора фиксированного количества некоторых значений. Сортировка одномерных и двумерных массивов методом простых обменов, простым выбором и включением.
курсовая работа [48,8 K], добавлен 27.11.2010Широкое использование компьютерных и информационных технологий. Концепции типов данных. Алгоритмы сортировки одномерных массивов. Описание двумерного массива Паскаля. Методы доступа к элементам массивов. Индексные, динамические и гетерогенные массивы.
курсовая работа [66,3 K], добавлен 07.12.2010Структура программного комплекса. Ввод информации из заданного файла. Создание набора данных. Добавление элементов в конец набора данных. Просмотр всех элементов набора данных. Копирование информации из НД в заданный файл. Сортировка массива по номерам.
курсовая работа [630,5 K], добавлен 01.06.2014Разработка и реализация типовых алгоритмов обработки одномерных массивов на языке Delphi. Максимальный и минимальный элемент массива. Значение и расположение элементов массива. Элементы массива, находящиеся перед максимальным или минимальным элементом.
лабораторная работа [12,8 K], добавлен 02.12.2014Одномерные числовые массивы, образование элементами целочисленного массива невозрастающей последовательности. Программное нахождение суммы элементов каждой возможной строки матрицы и формирование массива из найденных сумм, вывод массива-результата.
лабораторная работа [12,8 K], добавлен 09.01.2011Алгоритм по обработке массивов таким образом, чтобы группы, состоящие из трех или более подряд стоящих нулей, были переписаны в начало массива. Сортировка полученных массивов методом всплывающего пузырька. Вывод на дисплей монитора обновленной матрицы.
курсовая работа [300,1 K], добавлен 30.08.2011Реализация различных методов сортировки. Алгоритмические языки программирования. Обработка большого числа единообразно организованных данных. Алгоритмы сортировки массивов. Анализ проблем реализации и использования различных видов сортировок массивов.
курсовая работа [640,3 K], добавлен 07.07.2011Понятие и функциональные возможности индексных массивов, принципы их формирования. Особенности использования функции array, range. Ассоциативные массивы, исследование их преимуществ и недостатков, этапы создания. Просмотр массива с помощью цикла.
презентация [144,3 K], добавлен 21.06.2014Структура программного комплекса. Создание набора данных. Описание модуля funkcii.tpu. Копирование информации из НД в заданный файл. Сортировка массива по номерам. Просмотр элементов и вычисление среднего, минимума и максимума из заданного диапазона.
курсовая работа [626,6 K], добавлен 18.06.2014