Отправляет email-рассылки с помощью сервиса Sendsay

PHP за чашкой кофе

  Все выпуски  

PHP за чашкой кофе Чашечка десятая — массивы


Информационный Канал Subscribe.Ru

PHP за чашкой кофе

Чашечка десятая — массивы

PHP за чашкой кофе

Добрый день!

Для начала не могу не заметить: у нашей рассылки юбилей (пусть маленький)! Вы читаете десятый выпуск рассылки!
Приношу свои извинения за то, что рассылка не выходила так долго: я был просто завален всяческой работой и времени совершенно не хватало. С другой стороны «лучше поздно, чем никогда», ведь так?

Сегодня я решил устроить небольшой подсчёт. Статистика, как говорят, знает всё, вот я и решил посмотреть, что же знает статистика? Итак, за время существования нашей рассылки…

  • посетителями на сайте было просмотрено около двадцати тысяч страниц (информация взята из логов сервера),
  • на рассылку подписалось примерно 3300 человек (две тысячи на Subscribe.Ru, тысяча с небольшим человек пришло из Рассылок@Mail.Ru, а остальные — подписались на нашем сервере),
  • на форуме зарегистрировалось шестдесят человек и написано 380 сообщений,
  • мне на почту пришло 821 письмо, а ответил я на 677 писем (всего в почтовом ящике почти полторы тысячи писем),
  • мой список контактов в ICQ увеличился почти вдвое!
В общем, всё идёт к постепенному расширению нашей рассылки, и я считаю это очень хорошим началом!

Немного о нововведениях: на сайте (на каждой странице) Вы можете увидеть специальный блок, в котором можно прочесть описание одной из сотен книг. Основные темы книг — создание веб-сайтов и всё, что с этим связано. Книги посвящены таким компьютерным областям, как программирование на HTML, XML, CSS, PHP, JavaScript, MySQL, созданию роликов с помощью Flash и дизайну. Кто знает, может кому-нибудь из Вас одна из этих книг поможет!

Массивы

Для хорошего понимания, что такое массив, представим себе задачу: в PHP-скрипте должны содержаться фамилии учеников первого класса и оценка каждого ученика по математике. Скрипт должен по фамилии выводить оценку.

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

Пример 1. Решение задачи с использованием конструкции switch:
<?php
if ($familia!='') {
switch (
$familia) {
case
'Иванов':
echo (
'Оценка: 3');
break;
case
'Ласточкина':
echo (
'Оценка: 5');
break;
case
'Медведев':
echo (
'Оценка: 4');
break;
case
'Орехова':
echo (
'Оценка: 5');
break;
}
} else {
echo (
'<form action="ocenka.php">Фамилия: ');
echo (
'<input type="text" name="familia" value="Иванов"> ');
echo (
'<input type="submit" value="Узнать оценку!"></form>');
}
?>

Как видите, всё просто и легко. В общем, на первоый взгляд, у нас получился отличный скрипт, который, к тому же отлично работает.

Но это на первый взгляд. А теперь давайте посмотрим: что делать, если нужно добавить ещё тридцать фамилий? Или, например, изменить чью-то оценку? Переписывать весь скрипт? Представьте, каким этот скрипт будет огромным! В нём будет практически невозможно разобраться. Как быть?

И вот здесь к нам на помощь придут массивы. Немножко теории: Массив — это набор переменных, объединённых одним именем.

Массив состоит из пронумерованной последовательности элементов. Номера последовательности называются индексами. Такой массив можно представить в виде таблицы с двумя колонками: первая колонка – индекс элемента, вторая – его значение.

Таблица 1. Массив фамилий учеников (без оценок):
ИндексЗначение
0Иванов
1Ласточкина
2Медведев
3Орехова

Вот так могла выглядеть таблица с пронумерованными фамилиями учеников из примера.

Заметьте: в компьютерных массивах по-умолчанию первый элемент имеет индекс 0, второй – 1 и так далее.

Тот пример, что был указан выше — это так называемый одномерный массив. Почему одномерный? Потому что у этого массива есть только один индекс.

Существуют в программировании и двумерные массивы. Если брать пример из жизни, то двумерным массивом можно назвать таблицу умножения:

Таблица 2. Двумерный массив – таблица умножения:
 123
1123
2246
3369

В этой таблице у нас сразу два индекса — это умножаемое число и число-умножатель.

Если двумерный массив — это таблица, то трёхмерный массив — это куб. Существуют и многомерные массивы, но представить их в виде какого-либо объекта уже не так-то просто.

Ассоциативные массивы

Ассоциативный массив — это обычный массив, только вместо индексов-чисел можно использовать индексы-строки.

Если в обычном массиве мы писали, что элемент «0» имеет значение «Иванов» (фамилия), то в ассоциативном массиве мы можем написать, что элемент «Иванов» (фамилия-индекс) имеет значение «3» (оценка-значение). И тогда первоначальная таблица будет выглядеть вот так:

Таблица 3. Ассоциативный массив фамилий учеников и их оценок:
Индекс
Фамилия ученика
Значение
Оценка ученика
Иванов3
Ласточкина5
Медведев4
Орехова5

Массивы в PHP

Как говорит определение, элементы массива объединены одним именем. В PHP массив — это одна переменная, имеющая в себе несколько элементов. При этом индекс записывается в квадратных скобках:

Пример 2. Внешний вид переменной-массива
<?php
$a
[1]=50; // это массив $a, первый элемент
$a[3]="Маша"; // это всё тот же массив $a, но уже третий элемент
$a["жизнь"]="смерть";
// и это всё тот же массив $a, элемент с индексом
// «жизнь»
$b['sample']="PHP!!!";
// массив $b элемент «sample»
?>

Думаю, что по одному этому примеру становится всё ясно.

В одном массиве могут содержаться и элементы с числовым индексом и элементы со строковым индексом.

Над элементами массива можно производить все операции, которые можно производить с обычными переменными — сложение, вычитание, умножение, деление, конкатенация, инкремент, декремент и другие.

Пример 3. Операции над элементами массива:
<?php
// $ocenki — массив оценок одного ученика по
// математике за неделю (ну, это для примера ;)
$ocenki[]=5;
$ocenki[]=4;
$ocenki[]=5;
$ocenki[]=3;
// заметьте: при присвоении новым элементам значений
// я не указываю их индекс. если не указывать индекс
// то PHP будет сам устанавливать индексы по порядку
// так что сейчас у нас массив выглядит примерно так
// $ocenki[0] = 5
// $ocenki[1] = 4
// $ocenki[2] = 5
// $ocenki[3] = 3

for ($i=0; $i<=3; $i++) {
// запускаем цикл для перебора всех элементов массива

$ocenki['summa']+=$ocenki[$i];
// здесь мы к элементу «summa» прибавляем
// значение каждого их четырёх элементов массива

}

$ocenki['srednee']=$ocenki['summa']/4;
// находим среднее арифметическое

echo ('Оценка за месяц: ' . $ocenki['srednee']);
?>

Результат предсказуем:

Рисунок 1. Результат операций:

А теперь вернёмся к первоначальной задаче — вывод оценки по фамилии. C учётом полученных знаний я создал вот такой код:

Пример 4. Другое решение поставленной задачи:
<?php
$fam
['Иванов']=3;
$fam['Ласточкина']=5;
$fam['Медведев']=4;
$fam['Орехова']=5;
if (
$familia!='') {
echo (
'Оценка: ' . $fam[$familia]);
} else {
echo (
'<form action="ocenka.php">Фамилия: ');
echo (
'<input type="text" name="familia" value="Иванов"> ');
echo (
'<input type="submit" value="Узнать оценку!"></form>');
}
?>

Теперь всё становится гораздо легче: данные явно отделены от кода программы. Это, к тому же очень удобно: добавлять новые записи легко может человек, который в программировании вообще не разбирается (согласитесь, скопировать строчку и изменить фамилию и оценку это просто!).

Постепенно изучая PHP у Вас ещё будет сотня поводов благодарить создателей PHP за их предусмотрительность — работа с массивами проста, легка и удобна.

Функции работы с массивами

В PHP есть базовый набор функций для работы с массивами. В первую очередь это функции создания и сортировки массивов. О них-то мы и поговорим.

array()

Функция создаёт массив. Формат:

array array(...);

Особенность этой функции в том, что у неё может быть произвольное количество параметров (обычно указывается точное количество). Нам известно, что все параметры передаются функции через запятую, так что в данном случае мы можем передавать любое количество параметров, отделяя их запятой, и каждый параметр станет отдельным элементом массива.

Посмотрите на примеры такой функции:

Пример 5. Создание массивов с помощью функции array():
<?php
$massiv
=array(1, 2, 3, 4);
// создан массив с элементами 1, 2, 3 и 4

$massiv2=array('Иванов', 'Петров', 'Сидоров');
// а это массив с элементами 'Иванов', 'Петров' и 'Сидоров', причём
// 'Иванов' - нулевой элемент, 'Петров' - первый, а 'Сидоров' -
// второй (напомню, нумерация массива начинается с нуля)

// если нам нужно явно указать, под каким индексом должен быть
// элемент, то это пишется так:
$massiv3=array(1=>'Иванов', 2=>'Петров', 7=>'Сидоров');
// теперь первый элемент массива $massiv3 равен строке 'Иванов',
// второй – 'Петров', а седьмой – 'Сидоров', нулевого элемента
// нет, как нет элементов с 3 по 6.

// также можно создать ассоциативный массив:
$massiv4=array('name'=>'Иванов Иван', 'email'=>'ivan@ivanov.ru', 'age'=>18);
// Теперь у нас есть массив, где элемент 'name' равен 'Иванов Иван',
// 'email' равен 'ivan@ivanov.ru', а 'age'=18

// мы в любой момент можем обратиться к элементам уже созданных массивов:
echo ($massiv[0]+$massiv4['age']);
// результат: 19 (нулевой элемент массива $massiv равен единице,
// плюс элемент 'age' массива $massiv4 равен 18)

$massiv5=array(1=>17, 'page'=>3, 'user'=>'alex', 2=>22);
// можно создавать массивы, в которых есть как элементы с числовым,
// так и со строковым индексом

$baza=array(
'familia'=>array('Иванов', 'Петров', 'Сидоров'),
'imya'=>array('Иван', 'Пётр', 'Сергей'),
'vozrast'=>array(22, 17, 45)
);
// здесь мы создаём массив массивов! это также легко и просто.
// то есть, фактически у нас получается двумерный массив.

// а вот как с ним можно работать:
echo ($baza['familia'][1] . ' ' . $baza['imya'][1] . ', ');
echo (
$baza['vozrast'][1] . ' лет');
// Результат будет такой:
// «Петров Пётр, 17 лет»
?>

Думаю, что Вы легко сориентируетесь по этому примеру.

print_r()

Функция в удобном виде выводит содержимое массива. Формат функции:

bool print_r ( mixed expression [, bool return]);

  • expression — это переменная-массив, которую Вы хотите просмотреть. Если переменная не является массивом, то функция просто выведет значение переменной. Заметьте, что здесь написано mixed. Это значит, что аргуметр функции может иметь любой тип данных.
  • return — способ отображения результата. По-умолчанию установлено на FALSE и выводит результат прямо на экран. Если указать TRUE, то результат будет возвращён в вызывающую функцию.

Посмотрите примеры работы с функцией:

Пример 6. Функция print_r():
<?php
$massiv4
=array('name'=>'Иванов Иван', 'email'=>'ivan@ivanov.ru', 'age'=>18);

$baza=array(
'familia'=>array('Иванов', 'Петров', 'Сидоров'),
'imya'=>array('Иван', 'Пётр', 'Сергей'),
'vozrast'=>array(22, 17, 45)
);
// возьмём массивы из прошлого примера

echo ('<pre>Массив baza: ');
print_r ($baza);
echo (
'<br><br>Массив massiv4: ');
$vid_massiva=print_r($massiv4, TRUE);
// сейчас мы записали результат работы функции (то есть описание
// массива) в переменную $vid_massiva
echo ($vid_massiva);
// а теперь мы его выводим на экран
echo ('</pre>');
?>
Результаты функции print_r() выведены внутри <pre></pre>, потому что без этих тегов нарушится внешний вид результата и его будет куда сложнее изучать.

А вот какой результат должен был у Вас получиться:

Результат выполнения шестого примера:
Массив baza: Array
(
    [familia] => Array
        (
            [0] => Иванов
            [1] => Петров
            [2] => Сидоров
        )

    [imya] => Array
        (
            [0] => Иван
            [1] => Пётр
            [2] => Сергей
        )

    [vozrast] => Array
        (
            [0] => 22
            [1] => 17
            [2] => 45
        )

)

Массив massiv4: Array
(
    [name] => Иванов Иван
    [email] => ivan@ivanov.ru
    [age] => 18
)

Как видите, очень легко и удобно!


В PHP есть множество функций для работы с массивами. Большинство из них позволяет работать с индексами массивов и так или иначе сортировать массивы. Я думаю, что изучать сразу все их не стоит, тем более, что то, что было сегодня описано требует серьёзного закрепления.

В качестве домашнего задания предлагаю Вам сделать массив информации о своих коллегах (одноклассниках, однокашниках, друзьях, членах семьи). Выберите несколько полей (например: имя, возраст, рост, вес) и создайте массив, заполнив его информацией. Затем выведите результат с помощью функции print_r(). Подсчитайте среднее арифметическое для веса всех, кто есть в массиве или вычислите средний возраст, в общем делайте всё, что придумаете, ведь чем больше Вы будете упражняться, тем лучше у Вас будет получаться работа с массивами!

Если у Вас возникнут вопросы пишите их мне на E-Mail или задавайте их на форуме. Результаты домашнего задания также можете отсылать мне.

На сегодня это всё. Спасибо за внимание!


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: inet.webbuild.phplearn
Отписаться
Вспомнить пароль

В избранное