-
Урок 7. Массивы в PHP
Июль 18th, 2008 19 КомментариевВведение
Наверняка начинающие программисты задаются вопросом: “Что такое массив? и как с ним работать?”. Действительно, поначалу присутствует полная неразбериха и непонимание. В этом уроке я попытаюсь навести порядок в вашей голове, и приведу несколько примеров по работе с массивами в php. В предыдущих уроках мы частично рассматривали работу с массивами, но сейчас я предлагаю резюмировать информацию, и сделать так чтобы она хорошо усвоилась вами.
Массивы
На самом деле массив в PHP – это упорядоченное отображение, которое устанавливает соответствие между значением и ключем. Т.е. это определенный набор значений, у которого имеется свой идентификатор (key) и присвоенное ему значение (value). Вспомните как вы заполняете анкету? Там присутствуют обязательные поля фамилия,имя, отчество, год рождения и т.д.
В примере все становиться ясно, здесь слово фамилия является ключом, в котором содержится ваша фамилия, например Петров.
Пример:
Анкета
- фамилия:Петров
- имя:Алексей
- год рождения:1988
А теперь пример, как можно создать массив в php используя такие же данные. Создать можно двумя способами:
1. С указанием ключа:
[cc lang="php"]
$anketa = array("family"=>“Петров”,”name”=>”Алексей”,”year”=>”1988″);
?>
[/cc]
Теперь при помощи манипуляций с ключами можно получить все данные из массива, если нам необходима только фамилия мы вызываем массив с указанием идентификатора:
[cc lang="php"]
echo $anketa["family"]; //В браузер будет выведена фамилия
?>
[/cc]
Или для того чтобы пробежаться по массиву и вывести все его значения используем функцию foreach();
[cc lang="php"]
$anketa = array("family"=>“Петров”,”name”=>”Алексей”,”year”=>”1988″);
//Здесь происходит перебор массива и вывод ключа и
//соответствующее ему значение
foreach ($anketa as $k => $v) {
echo “$k – $v
“;
}
?>[/cc]
2. Без указания ключа:
[cc lang="php"]
$anketa = array("Петров","Алексей","1988");
?>
[/cc]
В данном случае по умолчанию ключами являются числовые значения. Чтобы вызвать имя необходимо выполнить следующее:
[cc lang="php"]
echo $anketa[1];
?>[/cc]
У первого значения ключ в данном случае будет равен 0, т.е. echo $anketa[0]; выдаст фамилию .
Я думаю этих простых примеров достаточно, давайте обратимся к документации.
Синтаксис
Массив может быть создан языковой конструкцией array(). В качестве параметров она принимает определенное количество разделенных запятыми пар key => value (ключ => значение).
Все что мы с вами разобрали является примерами одномерного массива. Далее рассмотрим примеры многомерных массивов.
Многомерные массивы
Со временем ваши программы станут более сложными, и возможностей простых одномерных массивов окажется недостаточно для хранения необходимой информации. Многомерный массив (массив массивов) предоставляет в распоряжение программиста более эффективные средства для хранения информации, требующей дополнительного структурирования. Создать многомерный массив несложно — просто добавьте дополнительную пару квадратных скобок, чтобы вывести массив в новое измерение .
[cc lang="php"]
$school = array( "class"=>array(“9″,”10″,”11″),”teacher”=>array(“Михайлова И.В.”,”Иванова Л.П”,”Радищева О.В”));
//Выведет 9 класс
echo $school['class'][0];?>
[/cc]
Это и будет наш многомерный массив, т.е. массив внутри массива, его состав можно посмотреть командой print_r(массив):
[cc lang="php"]
print_r($school);
?>
[/cc]
Вот так вот вроде и всё, но создав или получив массив, нам необходимо с ним работать, т.е. сортировка, перемешивание, пересчет элементов массива и т.д. Все это необходимо знать, т.к. использование таких функций встречается довольно часто. Мы рассмотрим самые необходимые.
Практика
Практика показывает что Вам предстоит довольно часто сталкиваться с массивами: при работе с информацией полученной из файлов или из БД, данные переданные через суперглобальные массивы $_POST и $_GET и других случаях. Помимо функции создания массива array(), существует множество вспомогательных функций для работы с массивами, с ними вы можете ознакомиться самостоятельно в документации.
В предыдущих уроках мы уже сталкивались с массивами, это была гостевая книга, которая читала строки файла в массив, после чего строка разбивалась на части и выводилась в браузер.
В случае с записью наоборот, переданные данные объединялись в строку и записывались в файл. Все это достаточно просто, но я предлагаю дополнить гостевую книгу модулем администрирования. В случае с базой это было бы очень легко организовать, но здесь придется немного поработать головой и использовать различные функции.
Теперь наша гостевая книга ( не забывайте что данный скрипт является основой, и его можно применять где угодно) будет содержать дополнительный модуль. Он будет выводить все сообщения, и напротив каждого будет стоять ссылки, которые будут отвечать за определенные действия ( удаление и редактирование).
Детали
Для того чтобы не вставлять лишний код на страницу советую вам обращаться к предыдущему уроку
index.php
Файл остается без изменений.
add.php
Оставляем без изменений
read.php
Оставляем без изменений
moder.php
Данный файл будет отвечать за редактирование записей. Он состоит из 3-х частей начнем с первой.
Вывод записей
Отображение записей будет происходить так же как и в read.php , но немного будет модернизирован, каждой записи будет присвоен номер, под которым он находиться в массиве.
[cc lang="php"]
////////////////////////
// /Вывод сообщений ///
///////////////////////
else {//Читаем файл в массив
$data = @file($url);//Запускаем цикл, чтобы определить номер записи
//и в последующем передовать это значение(см. выше)
for($i=0;$i<=count($data)-1;$i++) {//Разбиваем строку на переменные
list($name,$mail,$text) = explode("::",$data[$i]);//Выводим их в браузер
echo "$name [$mail] - $text
“;//Ссылка на удаление [D] , в ней передается 2 переменные методом GET
echo “[D]“;//Ссылка на редактирование [E] ,
//в ней передается 2 переменные методом GET
echo “[E]“;
echo “
“;}
}
[/cc]
Обратите внимание что этот фрагмент работает после проверки условий, которые мы рассмотрим ниже. Здесь напротив каждой записи стоят две ссылки [D] и [E] , т.е. delete или edit. Ссылка передает 2 переменные, наличие которых мы будет проверять выше.
Удаление записей
Для того чтобы удалить запись, мы должны знать её порядковый номер в массиве, для этого мы создали ссылку в режиме просмотра сообщений. После перехода по этой ссылке, значения извлекаем из массива $_GET, где $_GET['del'] будет содержать единицу, а $_GET['num'] – переменную $i. Давайте рассмотрим следующий фрагмент:
[cc lang="php"]
////////////////////
//Удаление записи//
/////////////////////Проверяем наличие переменной
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 "Запись удалена
“;
echo “назад“;
}[/cc]
Достаточно все просто, просто стираем значение в массиве, под необходимым номером.
Редактирование
Для того чтобы изменить запись, мы также должны знать её порядковый номер в массиве, для этого мы создали ссылку в режиме просмотра сообщений. После перехода по этой ссылке, значения извлекаем из массива $_GET, где $_GET['edit'] будет содержать единицу, а $_GET['num'] – переменную $i. Редактирование происходит в 2 этапа. Сначала мы выводим выбранную запись, значения которой оказываются в полях ввода input и textarea, после внесенных изменений нажимаем на кнопку, которая передает данные скрипту, выполняющего перезапись в файле.
[cc lang="php"]
/////////////////////
// редактирование ///
////////////////////
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 "Запись изменена
“;
echo “назад“;}
else {
//Читаем файл в массив
$data = @file($url);//Преобразуем строку в переменные
list($name,$mail,$text) = explode(“::”,$data[$_GET['num']]);//Выводим форму
echo ‘
‘;
}
}[/cc]
Соединяя все фрагменты кода, получаем следующее:
[cc lang="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 "Запись удалена
“;
echo “назад“;}
/////////////////////
// редактирование ///
////////////////////
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 "Запись изменена
“;
echo “назад“;}
else {
//Читаем файл в массив
$data = @file($url);//Преобразуем строку в переменные
list($name,$mail,$text) = explode(“::”,$data[$_GET['num']]);//Выводим форму
echo ‘
‘;
}
}////////////////////////
// /Вывод сообщений ///
///////////////////////
else {//Читаем файл в массив
$data = @file($url);//Запускаем цикл, чтобы определить номер записи
//и в последующем передовать это значение(см. выше)
for($i=0;$i<=count($data)-1;$i++) {//Разбиваем строку на переменные
list($name,$mail,$text) = explode("::",$data[$i]);//Выводим их в браузер
echo "$name [$mail] - $text
“;//Ссылка на удаление [D] , в ней передается 2 переменные методом GET
echo “[D]“;//Ссылка на редактирование [E] , в ней передается 2 переменные методом GET
echo “[E]“;
echo “
“;}
}
?>
[/cc]Исходники
Итог
В итоге мы получаем скрипт, который позволяет управлять записями, заметьте что работа с файлам полностью завязана на массивах. Данный урок достаточно простой, изучив который вы поймете как работать с файлами и информацией содержащейся в массивах. Другие всевозможные доски обьявлений, чаты, скрипты для отправки комментариев, форумы, работают на схожем принципе. Если хотите применять данный скрипт, не забудьте установить авторизацию на модуль модерирования. Как это сделать описано в предыдущем уроке: Урок 2. Описание процедуры авторизации . Весь код предоставлен без дизайна, на то оно и программирование, чтобы программировать, если хотите можете сверстать простенький шаблон и использовать где угодно.
Подпишись на RSS, впереди много интересного.19 Responses to “Урок 7. Массивы в PHP”
Leave a Reply




Январь 11th, 2010 at 20:42
Писец копипастеров развелось, прохода нет… Ты бы афтар с такими уроками шел бы лучше мусор убирать
Декабрь 26th, 2009 at 19:21
круто!но буду ждать качество.
Июль 6th, 2009 at 11:06
НЕ могу понять куда прикрепить этот модуль moder.php. В исходниках он стоит отдельным особняком, при загрузке страницы мы используем для вывода сообщений read.php, а для добавление записи add.php, Так куда прикрутить этот модер.пхп?
Май 17th, 2009 at 07:11
и удаляется тупо.. раезве потом вместо мессаги пустой строки не будет? юзайте unset
Май 17th, 2009 at 07:07
срань, любой через гет удалить может
Октябрь 2nd, 2008 at 17:47
Спасибо за уроки.
Очень доступно и познавательно. Я долго искал в сети нечто подобное.
а нет ли у вас в уроках описания подобного функционала, но с использованием БД? у самого меня пока не получается адаптировать скрипт под БД.
Сентябрь 16th, 2008 at 17:01
Уроки конечно очень интересние и описано все доступно!
Но все МИ учимса и хотим узнать что ето за ошыбки чтобы неповторять их в будушем!
Сентябрь 16th, 2008 at 03:35
2All: а нельзя оставлять комментарии по теме, а не тупые повесил на стенку, автор жжет, +1 и т.д. Деградация интернета блин
Сентябрь 15th, 2008 at 18:48
Антон их можна записать так if(isset($_GET['edit']))
Но я немогу понять почему после удаления и редактирования комента, появляєтса ошыбка а именно
Undefined offset: 2 в
list($name,$mail,$text) = explode(“::”,$data[$i]);
ето после редактирования а посое удаления такая же самая ошибка толко в цикле for самом