программирование на PHP
Bullet (black) Email иконка RSS иконка
  • Урок 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/>";

    }

    }
    ?>

    Исходники

    gbook0.2.zip

    Итог

    В итоге мы получаем скрипт, который позволяет управлять записями, заметьте что работа с файлам полностью завязана на массивах. Данный урок достаточно простой, изучив который вы поймете как работать с файлами и информацией содержащейся в массивах. Другие всевозможные доски обьявлений, чаты, скрипты для отправки комментариев, форумы, работают на схожем принципе. Если хотите применять данный скрипт, не забудьте установить авторизацию на модуль модерирования. Как это сделать описано в предыдущем уроке: Урок 2. Описание процедуры авторизации . Весь код предоставлен без дизайна, на то оно и программирование, чтобы программировать, если хотите можете сверстать простенький шаблон и использовать где угодно.

    19 Responses to “Урок 7. Массивы в PHP”

    1. 1
      ViallsNo Gravatar Says:

      Отличная статья, молодец :)

    2. 2
      LightNo Gravatar Says:

      Очень хорошие уроки, но тебе желательно определиться, будет ли «изложение доступным языком» или всё же для программеров, желающих освежить в памяти какой нибудь вопрос. Пока что всё ещё остаются места, подобные обычным программерским книгам.
      Привожу конкретный пример.
      Вот в этой статье обещается просто рассказать, что такое массив и в самом начале даётся определение:
      «массив в PHP – это упорядоченное отображение, которое устанавливает соответствие между значением и ключем.» Зачем же сходу таким казённым языком? После такой фразы у обычного человека как раз начинается та самая каша в голове. Если бы ты начал с примера, а потом сказал, что в PHP фамилия, имя и т.д. – идентификаторы (ключи), им соответствуют их значения…., информация воспринялась бы гладко, без спотыкания о неожиданно введённые термины.
      Попробуй дать почитать урок перед публикацией человеку, изучающему PHP, он быстро тебе покажет такие места, где происходит запинка.

      P.S. Неплохо бы убрать горизонтальную прокрутку из примеров, с ней неудобно читать.

    3. 3
      АлександрNo Gravatar Says:

      2Light
      Полностью с вами согласен. Буду исправлятся. Постараюсь найти человека, с минимальными знаниями в PHP, для проверки урока.

      Действительно, есть и информация, которая может освежить голову, при написании некоторых уроков, пришлось многое вспомнить. Не буду врать что обращаюсь к некоторым учебникам, по которым сам учился, но все непонятное пытаюсь разжевать как можно мельче :)

      P.S. На днях поменяю тему, там текстовая колонка шире, а следовательно плагин для подсветки кода тоже можно будет сделать шире ;)

    4. 4
      LightNo Gravatar Says:

      Александр, уроки отличные. И именно уроки, а не статьи на тему, как это зачастую бывает. Так что скорее не исправляться, а оттачивать писательское умение :)
      Главное не останавливаться, и будут и посещения и популярность, и высокие PR и ТИЦ ;)

    5. 5
      GlamNo Gravatar Says:

      Можешь меня взять на тест статей, я только начинаю изучать пхп хотя кое какие знания уже есть ;)

    6. 6
      АнтонNo Gravatar Says:

      Уроки интересные! Спасибо!
      Не могу понять, как бороться с неопределенными индексами?
      Я имею в виду «edit»,»del».
      Или определять их в ссылке при первом обращении к moder.php?
      Нет ли способа покрасивее?

    7. 7
      АлександрNo Gravatar Says:

      Антон напишите на почту мне freshcoder.ru[doggy]gmail[dot]com

    8. 8
      АнтонNo Gravatar Says:

      написал дважды

    9. 9
      АлександрNo Gravatar Says:

      Антон, я читал почту, но почему то не понял что вы имеете ввиду.

    10. 10
      АнтонNo Gravatar Says:

      Я имел в виду, что когда мы передаем по одной ссылке [edit], а по другой [del] и проверяем в (moder.php) то в зависимости от того, по какой ссылке мы пришли вылезает или (undefined index ‘del’) или (undefined index ‘edit’).
      Теперь-то я уже разобрался, что надо (isset()) применять :)

    11. 11
      SergioNo Gravatar Says:

      Антон их можна записать так if(isset($_GET['edit']))
      Но я немогу понять почему после удаления и редактирования комента, появляєтса ошыбка а именно
      Undefined offset: 2 в
      list($name,$mail,$text) = explode(«::»,$data[$i]);
      ето после редактирования а посое удаления такая же самая ошибка толко в цикле for самом

    12. 12
      No Gravatar Says:

      2All: а нельзя оставлять комментарии по теме, а не тупые повесил на стенку, автор жжет, +1 и т.д. Деградация интернета блин

    13. 13
      SergioNo Gravatar Says:

      Уроки конечно очень интересние и описано все доступно!
      Но все МИ учимса и хотим узнать что ето за ошыбки чтобы неповторять их в будушем!

    14. 14
      JettieNo Gravatar Says:

      Спасибо за уроки.
      Очень доступно и познавательно. Я долго искал в сети нечто подобное.

      а нет ли у вас в уроках описания подобного функционала, но с использованием БД? у самого меня пока не получается адаптировать скрипт под БД.

    15. 15
      правдаNo Gravatar Says:

      срань, любой через гет удалить может

    16. 16
      правдаNo Gravatar Says:

      и удаляется тупо.. раезве потом вместо мессаги пустой строки не будет? юзайте unset

    17. 17
      mityaNo Gravatar Says:

      НЕ могу понять куда прикрепить этот модуль moder.php. В исходниках он стоит отдельным особняком, при загрузке страницы мы используем для вывода сообщений read.php, а для добавление записи add.php, Так куда прикрутить этот модер.пхп?

    18. 18
      neadminNo Gravatar Says:

      круто!но буду ждать качество.

    19. 19
      LakmusNo Gravatar Says:

      Писец копипастеров развелось, прохода нет… Ты бы афтар с такими уроками шел бы лучше мусор убирать

    Leave a Reply


freshcoder.ru © 2008 • При использовании материалов активная ссылка на сайт обязательна.