Многомерные массивы. Наверняка начинающие программисты задаются вопросом: “Что такое массив?
Введение
Наверняка начинающие программисты задаются вопросом: “ Что такое массив? и как с ним работать?”. Действительно, поначалу присутствует полная неразбериха и непонимание. В этом уроке я попытаюсь навести порядок в вашей голове, и приведу несколько примеров по работе с массивами в 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, но немного будет модернизирован, каждой записи будет присвоен номер, под которым он находиться в массиве.
//////////////////////// // /Вывод сообщений /// /////////////////////// 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>'; } }
| Соединяя все фрагменты кода, получаем следующее:
<?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/>";
}
} ?>
Не нашли, что искали? Воспользуйтесь поиском:
|