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

Уроки php. Работа с массивами в PHP


Здравствуйте, дорогие читатели!    Все вопросы и замечания присылайте на phpphp@mail.ru.

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

Единственный момент, которого хотелось бы коснуться сейчас - операция конкатенации ("склейки" строк). Она работает так:

<?

$abc = "1234";

$def = "5678";

echo $abc.$def;

?>

Если выполнить данную программу, то она выдаст нам: 12345678. Во многих других языках (в т.ч. в JavaScript) в роли оператора конкатенации выступает +. Но если в PHP мы напишем echo $abc+$def;  то получим 6912, т.е. результат сложения чисел (или 0, если в переменных будут содержаться не только цифры). Но, не будем анализировать разнообразные ошибочные ситуации. Их лучше разбирать индивидуально и на практике J

Есть сокращенный вид конкатенации:

$abc="123";

$abc.="456";

означает то же самое, что и

$abc="123";

$abc=$abc."456";

 

Сегодня рассмотрим смешанный тип array (массив). (кроме массивов к смешанному типу относится object. С объектами подробнее познакомимся, когда будем рассматривать объектную модель программирования (надеюсь дело дойдет до этого J ))

Массивы — это упорядоченные наборы переменных. Имена их тоже начинаются со знака доллара. Есть два типа массивов: списки (автоматически нумеруемые массивы, где ключами значений выступают числа от нуля до относительной бесконечности) и ассоциативные массивы (где пары «ключ — значение» записываются в явном виде). Пример массива-списка:

$spisok = array("Январь","Февраль","Март","Апрель");

При вызове определенного номера элемента на экране будет выведено значение этого элемента массива. Например, чтобы на экране появилась надпись «Март», следует записать:

echo $spisok[2]; // Двойка вызывает третий элемент, потому что

             //нумерация Начинается с нуля

             // Все, что записано после двух слэшей и до

             // конца строки, считается в PHP комментариями

В квадратных скобках при вызове элемента массива записывается ключ этого элемента: числовой или иного типа.

Ассоциативный массив записывается так:

$assoc = array("Имя" => "Иван","Фамилия" =>"Иванов","Год рождения" => "1970");

Теперь, чтобы вызвать нужные данные, следует написать:

echo $assoc["Фамилия"]." ".$assoc["Имя"];

На экран будет выведен текст: «Иванов Иван». Обратите внимание, что пробел — это обычный текст, внедренный в код на PHP, поэтому он записан в кавычках. Три отрезка текста объединяются в строку при помощи оператора конкатенации.

Обычно элементы массива вызываются в циклах. Но - это рассмотрим в ближайших "подходящих" примерах.

Массивы можно записывать и не в одну строку. Например, для списка правомерной будет и такая запись:

$spisok[] = "Январь";

$spisok[] = "Февраль ";

$spisok[] = "Март";

$spisok[] = "Апрель";

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

$assoc["Имя"] = "Иван";

$assoc["Фамилия"] = "Иванов";

$assoc["Год рождения"] = "1970";

Вызов же элементов массива от формы их записи не меняется. Массивы могут быть многомерными. В них каждый из элементов массива сам является массивом:

$massiv = array();

$massiv[0] = array("1","2","3");

$massiv[1] = array("4","5","6");

В этом случае при вызове

echo $massiv[1][2];

на экран будет выведено число «6».

 

Простой перебор массива можно осуществить циклом foreach:

foreach($spisok as $spisok1)

{

echo "<p><b>".$spisok1."</b></p>";

}

Равноценной будет запись и с оператором цикла while:

$i=0;

while($i < count($spisok))

{

echo "<p><b>".$spisok[$i]."</b></p>";

$i++;

}

Здесь пришлось ввести переменную $i, изначально равную нулю.

 

Строго говоря, в PHP нет разницы между индексными и ассоциативными массивами; существует только один тип массива, который может содержать и числовые, и строковые индексы. Это может вам дать "дополнительную гибкость", а может быть источником лишней головной боли при отладке программ (если вы будете злоупотреблять смешиванием индексов). Н-р здесь все понятно:

$map = array( 'version'    => 4, // ключ 'version'
              
'OS'         => 'Linux', // ключ 'OS'
              
'lang'       => 'english',
              
'short_tags' => true
            
);

а здесь значение ключей указано в комментариях:

$switching = array(         10// ключ = 0
                    
5    =>  6, // ключ = 5
                    
3    =>  7// ключ = 3
                    
'a'  =>  4, // ключ = а
                            
11// ключ = 6 (максимальным числовым 

                                // индексом был 5)
                    
'8'  =>  2// ключ = 8 (число!)
                    
'02' => 77// ключ = '02'
                    
0    => 12  // значение 10 будет перезаписано на 12
                  
);

Пойди разберись какая "задумка" была у автора программы J

 

Давайте продемонстрируем работу с массивами на простых примерах:

<?php
$arr = array(=> 112 => 2);

$arr[] = 56;    // В этом месте скрипта это
                // эквивалентно $arr[13] = 56;

$arr["x"] = 42// Это добавляет к массиву новый
                // элемент с ключом "x"
                
unset($arr[5]); // Это удаляет элемент из массива

unset($arr);    // Это удаляет массив полностью
?>

 

Обратите внимание, что максимальный числовой ключ, используемый для этого не обязательно должен существовать в массиве в настоящий момент. Он просто должен был существовать с момента последнего переиндексирования массива. Это иллюстрирует следующий пример:

<?php
// Создаем простой массив.
$array = array(12345);
print_r($array); // Печатаем массив

// Теперь удаляем каждый элемент, но сам массив оставляем нетронутым:
foreach ($array as $i => $value) {
    unset($array[$i]);
}
print_r($array);

// Создаем элемент (обратите внимание, что новым ключом будет 5,
// а не 0, как вы возможно ожидали).
$array[] = 6;
print_r($array); // Печатаем массив

// Переиндексация:
$array = array_values($array);
$array[] = 7;
print_r($array); // Печатаем массив
?>

Вышеприведенный пример выведет следующее:

 

Array

(

    [0] => 1

    [1] => 2

    [2] => 3

    [3] => 4

    [4] => 5

)

Array

(

)

Array

(

    [5] => 6

)

Array

(

    [0] => 6

    [1] => 7

)

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

 

 

На следующих занятиях мы закрепим изучение типов на более полезных примерах.

До встречи!  Жду предложения и замечания.

Александр

phpphp@mail.ru.


В избранное