-
Урок 7. Массивы в PHP
Июль 18th, 2008 19 КомментариевВведение
Наверняка начинающие программисты задаются вопросом: «Что такое массив? и как с ним работать?». Действительно, поначалу присутствует полная неразбериха и непонимание. В этом уроке я попытаюсь навести порядок в вашей голове, и приведу несколько примеров по работе с массивами в php. В предыдущих уроках мы частично рассматривали работу с массивами, но сейчас я предлагаю резюмировать информацию, и сделать так чтобы она хорошо усвоилась вами.
Массивы
На самом деле массив в PHP – это упорядоченное отображение, которое устанавливает соответствие между значением и ключем. Т.е. это определенный набор значений, у которого имеется свой идентификатор (key) и присвоенное ему значение (value). Вспомните как вы заполняете анкету? Там присутствуют обязательные поля фамилия,имя, отчество, год рождения и т.д.
В примере все становиться ясно, здесь слово фамилия является ключом, в котором содержится ваша фамилия, например Петров.
Пример:
Анкета
- фамилия:Петров
- имя:Алексей
- год рождения:1988
А теперь пример, как можно создать массив в php используя такие же данные. Создать можно двумя способами:
1. С указанием ключа:
1
2
3
4
5<?php
$anketa = array("family"=>"Петров","name"=>"Алексей","year"=>"1988");
?>Теперь при помощи манипуляций с ключами можно получить все данные из массива, если нам необходима только фамилия мы вызываем массив с указанием идентификатора:
1
2
3
4
5<?php
echo $anketa["family"]; //В браузер будет выведена фамилия
?>Или для того чтобы пробежаться по массиву и вывести все его значения используем функцию foreach();
1
2
3
4
5
6
7
8
9
10<?php
$anketa = array("family"=>"Петров","name"=>"Алексей","year"=>"1988");
//Здесь происходит перебор массива и вывод ключа и
//соответствующее ему значение
foreach ($anketa as $k => $v) {
echo "$k - $v<br/>";
}
?>2. Без указания ключа:
1
2
3
4
5<?php
$anketa = array("Петров","Алексей","1988");
?>В данном случае по умолчанию ключами являются числовые значения. Чтобы вызвать имя необходимо выполнить следующее:
1
2
3
4<?php
echo $anketa[1];
?>У первого значения ключ в данном случае будет равен 0, т.е. echo $anketa[0]; выдаст фамилию .
Я думаю этих простых примеров достаточно, давайте обратимся к документации.
Синтаксис
Массив может быть создан языковой конструкцией array(). В качестве параметров она принимает определенное количество разделенных запятыми пар key => value (ключ => значение).
Все что мы с вами разобрали является примерами одномерного массива. Далее рассмотрим примеры многомерных массивов.
Многомерные массивы
Со временем ваши программы станут более сложными, и возможностей простых одномерных массивов окажется недостаточно для хранения необходимой информации. Многомерный массив (массив массивов) предоставляет в распоряжение программиста более эффективные средства для хранения информации, требующей дополнительного структурирования. Создать многомерный массив несложно — просто добавьте дополнительную пару квадратных скобок, чтобы вывести массив в новое измерение .
1
2
3
4
5
6
7
8<?php
$school = array( "class"=>array("9","10","11"),"teacher"=>array("Михайлова И.В.","Иванова Л.П","Радищева О.В"));
//Выведет 9 класс
echo $school['class'][0];
?>Это и будет наш многомерный массив, т.е. массив внутри массива, его состав можно посмотреть командой print_r(массив):
1
2
3
4
5<?php
print_r($school);
?>Вот так вот вроде и всё, но создав или получив массив, нам необходимо с ним работать, т.е. сортировка, перемешивание, пересчет элементов массива и т.д. Все это необходимо знать, т.к. использование таких функций встречается довольно часто. Мы рассмотрим самые необходимые.
Практика
Практика показывает что Вам предстоит довольно часто сталкиваться с массивами: при работе с информацией полученной из файлов или из БД, данные переданные через суперглобальные массивы $_POST и $_GET и других случаях. Помимо функции создания массива array(), существует множество вспомогательных функций для работы с массивами, с ними вы можете ознакомиться самостоятельно в документации.
В предыдущих уроках мы уже сталкивались с массивами, это была гостевая книга, которая читала строки файла в массив, после чего строка разбивалась на части и выводилась в браузер.
В случае с записью наоборот, переданные данные объединялись в строку и записывались в файл. Все это достаточно просто, но я предлагаю дополнить гостевую книгу модулем администрирования. В случае с базой это было бы очень легко организовать, но здесь придется немного поработать головой и использовать различные функции.
Теперь наша гостевая книга ( не забывайте что данный скрипт является основой, и его можно применять где угодно) будет содержать дополнительный модуль. Он будет выводить все сообщения, и напротив каждого будет стоять ссылки, которые будут отвечать за определенные действия ( удаление и редактирование).
Детали
Для того чтобы не вставлять лишний код на страницу советую вам обращаться к предыдущему уроку
index.php
Файл остается без изменений.
add.php
Оставляем без изменений
read.php
Оставляем без изменений
moder.php
Данный файл будет отвечать за редактирование записей. Он состоит из 3-х частей начнем с первой.
Вывод записей
Отображение записей будет происходить так же как и в read.php , но немного будет модернизирован, каждой записи будет присвоен номер, под которым он находиться в массиве.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30////////////////////////
// /Вывод сообщений ///
///////////////////////
else {
//Читаем файл в массив
$data = @file($url);
//Запускаем цикл, чтобы определить номер записи
//и в последующем передовать это значение(см. выше)
for($i=0;$i<=count($data)-1;$i++) {
//Разбиваем строку на переменные
list($name,$mail,$text) = explode("::",$data[$i]);
//Выводим их в браузер
echo "$name [$mail] - $text<br/>";
//Ссылка на удаление [D] , в ней передается 2 переменные методом GET
echo "<a href=\"moder.php?del=1&num=$i\">[D]</a>";
//Ссылка на редактирование [E] ,
//в ней передается 2 переменные методом GET
echo "<a href=\"moder.php?edit=1&num=$i\">[E]</a>";
echo "<br/><br/>";
}
}Обратите внимание что этот фрагмент работает после проверки условий, которые мы рассмотрим ниже. Здесь напротив каждой записи стоят две ссылки [D] и [E] , т.е. delete или edit. Ссылка передает 2 переменные, наличие которых мы будет проверять выше.
Удаление записей
Для того чтобы удалить запись, мы должны знать её порядковый номер в массиве, для этого мы создали ссылку в режиме просмотра сообщений. После перехода по этой ссылке, значения извлекаем из массива $_GET, где $_GET['del'] будет содержать единицу, а $_GET['num'] – переменную $i. Давайте рассмотрим следующий фрагмент:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23////////////////////
//Удаление записи//
///////////////////
//Проверяем наличие переменной
if($_GET['del']) {
//Читаем файл в массив
$data = @file($url);
//Удаление элемента в массиве,
//номер которого передавали вторым параметром $num
$data[$_GET['num']]="";
//Записываем массив обратно
$f = fopen($url,"w");
for($i=0;$i<=sizeof($data);$i++)
{
fputs($f,$data[$i]);
}
fclose($f);
//Выводим сообщение
echo "Запись удалена<br/>";
echo "<a href=\"moder.php\">назад</a>";
}Достаточно все просто, просто стираем значение в массиве, под необходимым номером.
Редактирование
Для того чтобы изменить запись, мы также должны знать её порядковый номер в массиве, для этого мы создали ссылку в режиме просмотра сообщений. После перехода по этой ссылке, значения извлекаем из массива $_GET, где $_GET['edit'] будет содержать единицу, а $_GET['num'] – переменную $i. Редактирование происходит в 2 этапа. Сначала мы выводим выбранную запись, значения которой оказываются в полях ввода input и textarea, после внесенных изменений нажимаем на кнопку, которая передает данные скрипту, выполняющего перезапись в файле.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46/////////////////////
// редактирование ///
////////////////////
if($_GET['edit']){
//Создаем условие, проверяем была ли нажата кнопка
if($_POST['change']) {
//Читаем файл в массив
$data = @file($url);
//Формируем строку и пишем её на старое место в массиве
$data[$_POST['num']] = $_POST['name']."::".$_POST['mail']."::".$_POST['text']."\n";
//Открываем файл и урезаем его до нулевой длины
$f = fopen($url,"w");
for($i=0;$i<=sizeof($data);$i++)
{
//Пишем строки(значения массива)
fputs($f,$data[$i]);
}
fclose($f);
//Выводим сообщение
echo "Запись изменена<br/>";
echo "<a href=\"moder.php\">назад</a>";
}
else {
//Читаем файл в массив
$data = @file($url);
//Преобразуем строку в переменные
list($name,$mail,$text) = explode("::",$data[$_GET['num']]);
//Выводим форму
echo '<form action="moder.php?edit=1" method="post">';
echo 'Имя:<input type="text" name="name" value="'.$name.'"><br/>';
echo 'Эл.почта:<input type="text" name="mail" value="'.$mail.'"><br/>';
echo '<textarea name="text" rows=5 cols=20 wrap="off">'.$text.'</textarea><br/>';
echo '<input type="hidden" name="num" value="'.$_GET['num'].'"';
echo '<input type="submit" name="change" value="изменить"><br/>';
echo '</form>';
}
}Соединяя все фрагменты кода, получаем следующее:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108<?php
$url="gb.txt";
////////////////////
//Удаление записи//
///////////////////
if($_GET['del']) {
//Читаем файл в массив
$data = @file($url);
//Стираем элемент в массиве
//номер которого передавали вторым параметром $num
$data[$_GET['num']]="";
//Записываем массив обратно
$f = fopen($url,"w");
for($i=0;$i<=sizeof($data);$i++)
{
fputs($f,$data[$i]);
}
fclose($f);
//Выводим сообщение
echo "Запись удалена<br/>";
echo "<a href=\"moder.php\">назад</a>";
}
/////////////////////
// редактирование ///
////////////////////
if($_GET['edit']){
//Создаем условие, проверяем была ли нажата кнопка
if($_POST['change']) {
//Читаем файл в массив
$data = @file($url);
$name = $_POST['name'];
$mail = $_POST['mail'] ;
$text = $_POST['text'];
//Формируем строку и пишем её на старое место в массиве
$data[$_POST['num']] = "$name::$mail::$text\n";
//Открываем файл и урезаем его до нулевой длины
$f = fopen($url,"w");
for($i=0;$i<=sizeof($data);$i++)
{
//Пишем строки(значения массива)
fputs($f,$data[$i]);
}
fclose($f);
//Выводим сообщение
echo "Запись изменена<br/>";
echo "<a href=\"moder.php\">назад</a>";
}
else {
//Читаем файл в массив
$data = @file($url);
//Преобразуем строку в переменные
list($name,$mail,$text) = explode("::",$data[$_GET['num']]);
//Выводим форму
echo '<form action="moder.php?edit=1" method="post">';
echo 'Имя:<input type="text" name="name" value="'.$name.'"><br/>';
echo 'Эл.почта:<input type="text" name="mail" value="'.$mail.'"><br/>';
echo '<input type="text" name="text" value="'.$text.'"><br/>';
echo '<input type="hidden" name="num" value="'.$_GET['num'].'">';
echo '<input type="submit" name="change" value="изменить"><br/>';
echo '</form>';
}
}
////////////////////////
// /Вывод сообщений ///
///////////////////////
else {
//Читаем файл в массив
$data = @file($url);
//Запускаем цикл, чтобы определить номер записи
//и в последующем передовать это значение(см. выше)
for($i=0;$i<=count($data)-1;$i++) {
//Разбиваем строку на переменные
list($name,$mail,$text) = explode("::",$data[$i]);
//Выводим их в браузер
echo "$name [$mail] - $text<br/>";
//Ссылка на удаление [D] , в ней передается 2 переменные методом GET
echo "<a href=\"moder.php?del=1&num=$i\">[D]</a>";
//Ссылка на редактирование [E] , в ней передается 2 переменные методом GET
echo "<a href=\"moder.php?edit=1&num=$i\">[E]</a>";
echo "<br/><br/>";
}
}
?>Исходники
Итог
В итоге мы получаем скрипт, который позволяет управлять записями, заметьте что работа с файлам полностью завязана на массивах. Данный урок достаточно простой, изучив который вы поймете как работать с файлами и информацией содержащейся в массивах. Другие всевозможные доски обьявлений, чаты, скрипты для отправки комментариев, форумы, работают на схожем принципе. Если хотите применять данный скрипт, не забудьте установить авторизацию на модуль модерирования. Как это сделать описано в предыдущем уроке: Урок 2. Описание процедуры авторизации . Весь код предоставлен без дизайна, на то оно и программирование, чтобы программировать, если хотите можете сверстать простенький шаблон и использовать где угодно.
Нужен ликбез? Подпишись на RSS!19 Responses to “Урок 7. Массивы в PHP”
Leave a Reply



Июль 19th, 2008 at 00:16
Отличная статья, молодец
Август 5th, 2008 at 20:56
Очень хорошие уроки, но тебе желательно определиться, будет ли «изложение доступным языком» или всё же для программеров, желающих освежить в памяти какой нибудь вопрос. Пока что всё ещё остаются места, подобные обычным программерским книгам.
Привожу конкретный пример.
Вот в этой статье обещается просто рассказать, что такое массив и в самом начале даётся определение:
«массив в PHP – это упорядоченное отображение, которое устанавливает соответствие между значением и ключем.» Зачем же сходу таким казённым языком? После такой фразы у обычного человека как раз начинается та самая каша в голове. Если бы ты начал с примера, а потом сказал, что в PHP фамилия, имя и т.д. – идентификаторы (ключи), им соответствуют их значения…., информация воспринялась бы гладко, без спотыкания о неожиданно введённые термины.
Попробуй дать почитать урок перед публикацией человеку, изучающему PHP, он быстро тебе покажет такие места, где происходит запинка.
P.S. Неплохо бы убрать горизонтальную прокрутку из примеров, с ней неудобно читать.
Август 5th, 2008 at 22:17
2Light
Полностью с вами согласен. Буду исправлятся. Постараюсь найти человека, с минимальными знаниями в PHP, для проверки урока.
Действительно, есть и информация, которая может освежить голову, при написании некоторых уроков, пришлось многое вспомнить. Не буду врать что обращаюсь к некоторым учебникам, по которым сам учился, но все непонятное пытаюсь разжевать как можно мельче
P.S. На днях поменяю тему, там текстовая колонка шире, а следовательно плагин для подсветки кода тоже можно будет сделать шире
Август 6th, 2008 at 14:18
Александр, уроки отличные. И именно уроки, а не статьи на тему, как это зачастую бывает. Так что скорее не исправляться, а оттачивать писательское умение
Главное не останавливаться, и будут и посещения и популярность, и высокие PR и ТИЦ
Август 18th, 2008 at 20:39
Можешь меня взять на тест статей, я только начинаю изучать пхп хотя кое какие знания уже есть
Август 25th, 2008 at 19:43
Уроки интересные! Спасибо!
Не могу понять, как бороться с неопределенными индексами?
Я имею в виду «edit»,»del».
Или определять их в ссылке при первом обращении к moder.php?
Нет ли способа покрасивее?
Август 25th, 2008 at 20:57
Антон напишите на почту мне freshcoder.ru[doggy]gmail[dot]com
Сентябрь 5th, 2008 at 16:07
написал дважды
Сентябрь 5th, 2008 at 19:29
Антон, я читал почту, но почему то не понял что вы имеете ввиду.
Сентябрь 8th, 2008 at 13:06
Я имел в виду, что когда мы передаем по одной ссылке [edit], а по другой [del] и проверяем в (moder.php) то в зависимости от того, по какой ссылке мы пришли вылезает или (undefined index ‘del’) или (undefined index ‘edit’).
Теперь-то я уже разобрался, что надо (isset()) применять
Сентябрь 15th, 2008 at 18:48
Антон их можна записать так if(isset($_GET['edit']))
Но я немогу понять почему после удаления и редактирования комента, появляєтса ошыбка а именно
Undefined offset: 2 в
list($name,$mail,$text) = explode(«::»,$data[$i]);
ето после редактирования а посое удаления такая же самая ошибка толко в цикле for самом
Сентябрь 16th, 2008 at 03:35
2All: а нельзя оставлять комментарии по теме, а не тупые повесил на стенку, автор жжет, +1 и т.д. Деградация интернета блин
Сентябрь 16th, 2008 at 17:01
Уроки конечно очень интересние и описано все доступно!
Но все МИ учимса и хотим узнать что ето за ошыбки чтобы неповторять их в будушем!
Октябрь 2nd, 2008 at 17:47
Спасибо за уроки.
Очень доступно и познавательно. Я долго искал в сети нечто подобное.
а нет ли у вас в уроках описания подобного функционала, но с использованием БД? у самого меня пока не получается адаптировать скрипт под БД.
Май 17th, 2009 at 07:07
срань, любой через гет удалить может
Май 17th, 2009 at 07:11
и удаляется тупо.. раезве потом вместо мессаги пустой строки не будет? юзайте unset
Июль 6th, 2009 at 11:06
НЕ могу понять куда прикрепить этот модуль moder.php. В исходниках он стоит отдельным особняком, при загрузке страницы мы используем для вывода сообщений read.php, а для добавление записи add.php, Так куда прикрутить этот модер.пхп?
Декабрь 26th, 2009 at 19:21
круто!но буду ждать качество.
Январь 11th, 2010 at 20:42
Писец копипастеров развелось, прохода нет… Ты бы афтар с такими уроками шел бы лучше мусор убирать