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

Очень просто о PHP, от элементарных понятий до ООП Массивы. Функции для работы с массивами


Это перевод четвёртой статьи из обучающего курса по языку программирования PHP. Прочитав данный цикл статей, вы получите возможность легко писать программы на языке PHP. Узнаем что такое массивы, а также какие в PHP есть функции для работы с ними.

Итак, продолжим.

Большая ошибка

Мы потратили кучу времени на общий обзор PHP - изучили управляющие структуры, операторы и переменные - вам, наверное, уже надоело. Возможно, вы подумываете о том, чтобы бросить всё прямо сейчас и потратить время более конструктивно (как вы думаете) перед зобмоящиком.

Это будет большой ошибкой. И когда я сказал "большую", я не преувеличиваю.

Если вы променяете эту часть курса на прелести Катя Пушкарёвой, то пропустите самые крутые типы данных в PHP. Это такие штучки, называемые массивами, и я не преувеличу, сказав, что после обсуждения массивов вы никогда не будете смотреть на PHP-скрипты как прежде.

Фруктовая пицца

До сих пор мы обсуждали переменные с одним значением:


<?php
$i = 5;
?>

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

<?php
  
// определим массив
$pizzaToppings = array('яблоки', 'груши', 'сыр', 'креветки', 'мясо', 'яйца');
print_r($pizzaToppings);

?>

Здесь $pizzaToppings - переменная-массив, содержащая значения 'яблоки', 'груши', 'сыр', 'креветки', 'мясо' и 'яйца'. (Переменные-массивы часто используются для объединения связанных значений).

print_r() - это специальная функция, которая позволяет заглянуть внутрь массива. Она более полезна при отладке (определении почему ваш скрипт не работает), чем в целях вывода информации, но я использую её здесь чтобы вы могли увидеть что творится на самом деле. У вас ведь запущены сервер и браузер, не так-ли?

Различные элементы массива доступны по порядковому номеру, но первый элемент нумеруется как нулевой. Так, чтобы извлечь значение 'яблоки', вам надо использовать запись $pizzaToppings[0], а 'креветки' - $pizzaToppings[3]. В-общем, надо указать имя переменной и за ней в квадратных скобках числовой индекс.

PHP также позволяет вам заменить индексы на указанные вами "ключи" для того, чтобы создать немного другой тип массива. Каждый ключ уникален, и соответствует значению в массиве.

<?php
  
// определим массив
$fruits = array('red' => 'яблоки', 'yellow' => 'бананы', 'purple' => 'сливы', 'green' => 'киви');
print_r($fruits); ?>

В данном случае $fruits - это массив, содержащий четыре пары ключ-значение (символ "=>" используется чтобы показать связь между ключом и значением). Чтобы получить значение "банан", мы должны использовать запись вида $fruits['yellow'], а для киви - $fruits['green'].

Этот тип массива иногда ещё называется хеш, или ассоциативный массив. Если вы использовали когда-нибудь Perl, то заметите схожесть с его хешами.

Кушаем по-итальянски

Легче всего обьявить массив функцией array(). Вот так:

<?php
  
// определим массив
$pasta = array('спагетти', 'лазанья', 'макароны'); ?>

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

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

<?php
  
// определим массив
$pasta[0] = 'спагетти';
$pasta[1] = 'лазанья';
$pasta[2] = 'макароны'; 

?>

Если вы предпочитаете использовать не цифровые индексы, а ключи, то можете использовать следующий пример:

<?php
  
// определим массив
$menu['zavtrak'] = 'яйца с ветчиной'; 
$menu['obed'] = 'отбивная';
$menu['ujin'] = 'ситро и сухарик'; ?>

Таким-же способом вы можете добавлять таким-же способом. Например, если вы захотите добавить элемент 'зелёные оливки' в массив $pizzaToppings, используйте вот такой способ:

<?php
  
// добавим элемент в массив
$pizzaToppings[6] = 'зелёные оливки'; ?>

Чтобы изменить элемент массива, просто назначьте ему новое значение. Например, для замены 'груши' в $pizzaToppings на 'зелёные оливки':

<?php
  
// изменим элемент массива
$pizzaToppings[1] = 'зелёные оливки'; ?>

Вы можете делать то-же самое, используя вместо индексов ключи. Следующее выражение изменяет элемент с ключом 'obed' на другие значение:

<?php
  
// изменим элемент массива
$menu['obed'] = 'пельмени';

?>

Тянем-потянем... а потом толкнём!

Также вы можете добавлять элемент в конец существующего массива функцией array_push():

<?php
  
// определим массив
$pasta = array('спагетти', 'лазанья', 'макароны');

// добавим ещё один элемент в конец
array_push($pasta, 'мармелад!');

print_r($pasta);

?>

Также вы можете удалять элемент из конца массива, используя функцию с интересным названием, array_pop():

<?php
  
// определим массив
$pasta = array('спагетти', 'лазанья', 'макароны');

// удалим один элемент в конце
array_pop($pasta);

print_r($pasta);

?>

Для удаления элемента в начале массива можно использвать функцию array_shift():

<?php
  
// определим массив
$pasta = array('спагетти', 'лазанья', 'макароны');

// удалим один элемент в конце
array_shift($pasta);

print_r($pasta);

?>

Функция array_unshift() позаботится о вставке одного элемента в самое начало массива:

<?php
  
// определим массив
$pasta = array('спагетти', 'лазанья', 'макароны');

// добавим ещё один элемент в конец
array_unshift($pasta, 'мармелад!');

print_r($pasta);

?>

Функции array_push() и array_unshift() не работают с ассоциативными массивами, чтобы добавить элементы в такие массивы лучше использовать записи вида $массив[$ключ] = $значение.

Функция explode() разделяет строку на меньшие части в соответствии с указанным пользователем разделителем и возвращает эти части как элементы массива:

<?php
  
// определим строку в разделителями
$str = 'красный, синий, зелёный, жёлтый'; 

// разделим её на отдельные части
$colors = explode(', ', $str); 

print_r($colors);

?>

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

<?php
  
// определим массив
$colors = array ('красный', 'синий', 'зелёный', 'жёлтый'); 

// соединим в строку при помощи " и ",
// получится 'красный и синий и зелёный и жёлтый' 
$str = implode(' и ', $colors); 

print $str;
?>

И наконец, два примера ниже показывают функции сортировки sort() и rsort(), которые могут быть использованы для сортировки массива по алфавиту (или по порядку цифр) в возрастающем или ниспадающем порядке соответственно:

<?php
  
// определим массив
$pasta = array('спагетти', 'вермишель', 'макароны'); 

// возвращает отсортированный по алфавиту массив
sort($pasta); 
print_r($pasta); 
print "
"; // возвращаем отсортированный в обратном // порядке по алфавиту массив rsort($pasta); print_r($pasta); ?>

Крутим-крутим циклы-циклы...

Итак, мы позаботились о том, чтобы добавить данные в массив. А теперь как-же их оттуда извлечь?

Получение данных из массива очень легко: всё что вам надо, это указать требуемый элемент, используя его индексный номер. Чтобы прочитать весь массив просто используйте одну из конструкций циклов, которые изучили в третьей части данного курса.

Вот несложный пример:

<html>
<head></head>
<body> 
Мои любимые рок-группы:
<ul>
<?php
  
// определим массив
$artists = array('Metallica', 'Evanescence',
                 'Linkin Park', 'Мираж'); 

// цикл по массиву и печать элементов
for ($x = 0; $x < sizeof($artists); $x++) { 
    echo '<li>'.$artists[$x]; 
}

?>
</ul>
</body>
</html>

После запуска скрипта вы увидите подобную картину:

Мои любимые рок-группы:

  • Metallica
  • Evanescence
  • Linkin Park
  • Мираж

В этом примере я определил массив, а затем использовал цикл for() для: прохода по массиву, извлечения из него элементов в индексной нотации и затем для печати их друг за другом.

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

Если вы используете ассоциативные массивы, вам пригодятся функции array_keys() и array_values() - для извлечения всех ключей и значений из массива.

<?php
  
// определим массив
$menu = array('завтрак' => 'яйца с беконом', 'обед' => 'сосиска',
              'ужин' => 'корочка хлеба'); 

/* возвращает массив ('завтрак', 'обед', 'ужин')
   с числовыми индексами */ 
$result = array_keys($menu); 
print_r($result); 
print " <br />"; 

/* возвращает массив ('яйца с беконом', ''сосиска'',
                      'корочка хлеба')с числовыми индексами */ 
$result = array_values($menu); 
print_r($result);

?>

Что это за шум?

Однако, существует более простой путь извлечь все элементы из массива. Во времёна PHP версии 4.0 был добавлен новый тип цикла, созданный специально для этой цели - прохода по массиву: цикл foreach(). (Его синтаксис сходен с аналогичной конструкцией в Perl). Выглядит примерно так:

foreach ($array as $temp) { 
    сделай что-нибудь! 
}

Цикл foreach() срабатывает один раз для каждого элемента в качестве аргумента и двигается по циклу вперёд с каждый проходом. В отличие от цикла for() ему не требуется счётчик или вызов функции sizeof(), потому что он отслеживает своё положение в массиве автоматически. При каждом запуске выполняется выражение внутри фигурных скобок, а текущий элемент массива доступен во временной переменной цикла.

Для лучшего понимания как он работает, рассмотрите эту переделку предыдущего примера (перечисление рок-групп) с использованием цикла foreach():

<html>
<head></head>
<body> 
Мои любимые рок-группы:
<ul>
<?php
  
// определим массив
$artists = array('Metallica', 'Evanescence',
                 'Linkin Park', 'Мираж'); 

// цикл по массиву и печать элементов
foreach ($artists as $a) { 
echo '<li>'.$a;
} ?> </ul> </body> </html>

Каждый раз, когда выполняется цикл, он помещает текущий элемент массива во временную переменную $a. Эта переменная может быть использована выражениями внутри блока цикла. Поскольку циклу foreach() не требуется счётчик для отслеживания положения в массиве, его легче обслуживать и читать, в отличие стандартного цикла for(). А ещё он ещё работает с ассоциативными массивами без необходимости дополнительного программирования.

Музыка масс

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

<html>
<head></head>
<body>

<?php
// проверим отправку формы
if (!isset($_POST['submit'])) {
 // и покажем форму
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<input type="checkbox" name="artist[]" value="Bon Jovi">Ласковый май
<input type="checkbox" name="artist[]" value="N'Sync">Ленинград
<input type="checkbox" name="artist[]" value="Boyzone">Авкариум
<input type="checkbox" name="artist[]" value="Britney Spears">Гражданская оборона
<input type="checkbox" name="artist[]" value="Jethro Tull">На-на
<input type="checkbox" name="artist[]" value="Crosby, Stills & Nash">Уматурман
<input type="submit" name="submit" value="Select">
</form>

<?php
}
else {
 // или покажем выбранные группы
   // испсользуем цикл foreach для чтения и вывода элементов
   if (is_array($_POST['artist'])) {
    echo 'Вы выбрали: <br />';
    foreach ($_POST['artist'] as $a) {
     echo "<i>$a</i><br />";
    }
 }
 else {
    echo 'Ничего не выбрано';
   }
}
?>

</body>
</html>

Когда форма будет отправлена, PHP автоматически создаст массив и заполнит его выбранными элементами. Этот массив затем будет обработан циклом foreach(), для извлечения из него выбранных исполнителей.

Также вы можете делать это со списками с множественным выбором просто указав в имени элемента select языка HTML массив (name="artist[]"). Попробуйте, проверьте и удостоверьтесь что вы готовы к следующей лекции.

В то-же время, на том-же канале! :)

Оригинал статьи: http://www.figli-migli.org.ua/books/799-php101-4

В избранное