Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

8.4. Массивы

ряд переменных, упорядоченных по имени и имеющих различный примера что у вас есть 20 которые нужно внести в программу. Можно для удобства назначить одинаковые имена и ставить в конце каждого имени число в соответствии с номером названия. Получится простейший одномерный массив. РНР предоставляет большой выбор средств для детальной и удобной работы с таким набором — массивом. Число (так называемый индекс) нужно заключать в квадратные скобки. Допустим, есть ряд строковых переменных — компьютер. Интернет, монитор. Выберем для имя любое, как и для обычной переменной. Индекс в массивах начинается не с единицы, а с нуля, и, таким образом, для внесения наших слов в массив надо сделать так:

$m[0] = "компьютер";

$m[1] = "Интернет";

$m[2] = "модем";

$m[3] = "монитор";

Теперь у нас с именем $m и максимальным индексом (количество элементов в массиве) — 4. Именно 4, хотя последний заполненный элемент — 3. Если мы попробуем считать элемент с четвертым индексом, результат будет равен пустой строке, так как там просто ничего нет. Обращаться к элементам массива

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

$i = 0; while ($i < count ($m)) { echo $m[$i] . "<br>"; $i++; }

Функция count($m) выдает нам количество элементов массива. Таким образом, у нас всегда есть возможность знать, сколько элементов в данном массиве.

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

Одномерные массивы

Одномерный массив состоит из одной строки.

РНР поддерживает как скалярные (0,1,2...), так и ассоциативные массивы ("a", "b", "c"...). Между ними, практически, нет никакой разницы. Создать массив можно с помощью функций list () или array () или просто определить значения элементов массива. Например:

$a[0] = "abc";

$а[1] = "def";

$b["foo"] = 13;

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

$а[] = "hello"; // $а[2] = "hello"

$а[] = "world"; // $а[3] = "world"

Сортировать массивы можно с помощью функций asort (), arsort (), ksort (), rsort (), sort (), uasort(),usort (), nuksort () в зависимости от необходимого типа сортировки (см. п. 20.6).

Определить число элементов в массиве можно с помощью функции count().

Перемещаться по массиву можно с помощью функций next () (следующий элемент) и prev () (предыдущий элемент). Еще один способ перемещения по массиву — использование функции each () (вывод необходимого элемента).

Многомерные массивы

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

$а[1] = $f; // примеры одномерных массивов

$a["foo"] = $f;

$a[l] [0] = $f; // двумерный массив

$a["foo"] [2] = $f; // числовые и ассоциативные индексы

$а[3] ["bar"] = $f; // можно смешивать

$a["foo"] [4] ["bar"] [0] = $f; // четырехмерный массив

В РНР 3 нельзя ссылаться на многомерные массивы в строках. Например, следующая строка не даст желаемого результата:

$a[3]['bar'] = 'Bob';

echo "Так работать не будет: $а[3][bar]";

В РНР 3 будет выведена строка «Так работать не будет: Array [bar]». Однако для получения нужного результата можно использовать оператор конкатенации строк

$а[3]['bar'] = 'Bob';

echo "Так работать будет: " . $a[3][bar];

В результате будет выведено: «Так работать будет».

В РНР 4 эту проблему можно решить, заключив ссылку на массив (в строке) в фигурные скобки:

$а[3]['bar'] = 'Bob';

echo "Так работать будет: {$а[3][bar]}";

Заполнять многомерные массивы можно по-разному. Самым тяжелым для понимания является использование команды array() для ассоциативных массивов. Следующие два примера кода одинаково заполняют одномерный массив. Первый пример:

$а["color"] = "red";

$a["taste"] = "sweet";

$a["shape"] = "round";

$a["name"] = "apple";

$a[3] = 4;

Второй пример:

$a = array(

"color" => "red",

"taste" => "sweet",

"shape" => "round",

"name" => "apple",

3 => 4

);

Функция array () для многомерных массивов может быть вложенной (пример 8.4).

Пример 8.4. Многомерные массивы

<?php

$а = array(

    "apple" => array(

        "color" => "red",

        "taste" => "sweet",

        "shape" =>- "round"

    ),

    "orange" => array(

        "color" => "orange",

        "taste" => "tart",

        "shape" => "round"

    ),

    "banana" => array(

        "color" => "yellow",

        "taste" => "pasty",

        "shape" => "banana-shaped"

    )

);

echo $a["apple"]["taste"];

?>

Результат выполнения программы представлен на рис. 8.2.

Рис. 8.2. Результат выполнения скрипта

Array — тип данных, такой же, как integer или string. Если переменная $array — массив, то gettype ($array) выдаст array (имя переменной выбрано случайным образом и ктипуданныхоно отношения не имеет), ais_array ($array) выдаст true.


ВНИМАНИЕ

Индексы в массиве — это указатели на его элементы.


РНР поддерживает как скалярные, так и ассоциативные индексы массивов. Ассоциативными массивами пользуются, например, в функциях работы с MySQL:

$row = mysql_fetch_array($result);

print ($row["field1"]. $row["field2"]. $row["field3"]).

Теперь поговорим о создании массивов поподробнее.

Первое средство — функция array:

$array = array($val1, $val2, $val3);

$array2 = array($key1 => $val1, $key2 => $val2, $key3 => $val3);

В первом случае получится скалярный массив, во втором — ассоциативный. Можно создать массив, просто указав индекс и значение.

$array[$key] = $val;

Переменная $array, если она не существовала до этого, станет массивом, а в ячейку с индексом $key (не обязательно 0) помещается значение $val. Несомненным достоинством РНР является отсутствие необходимости указывать индекс ячейки.

$new_array[] = "0"; // то же самое, что $new_array[0] = "0";

$new_array[] = "1"; // то же самое, что $new_array[1] = "1";

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

print ("test $variable text");

Но если вы попытаетесь вывести элемент массива таким же образом, то у вас ничего не получится. В официальной документации по РНР (на сайте www.php.net) приведены наглядные примеры многомерных массивов.

Функции, которые наиболее часто используются для работы с массивами — это sizeof (размер массива) и list & each (выбирают из каждого массива имя элемента и его

Чтобы обработать все элементы скалярного массива, в котором индексы элементов представляют собой числовой ряд (от 0 до $n) достаточно использовать функцию sizeof и цикл:

for ($i=0;$i<sizeof($array);$i++) {

...

};

Если элементы начинаются не с 0, а с известного $m, то можно действовать так:

for ($i=$m;$i<sizeof($array)+$m;$i++) {

...

};

Но если массив ассоциативный (возможно, смешанный) или мы вообще не знаем, есть в ряду пустые места или нет, то нужно воспользоваться функциями list и each:

while (list($key, $val) = each ($array)) {

Если надо вывести значения элементов в документ, то делается так:

print ("...$val...");

Чтобы обработать массив, обращаемся к его элементам:

$array[$key] = somefunction($val);

Мы специально отметили возможность разрывов в скалярных индексах. Дело в том, что те, кто работал с массивами, например, в Паскале, знают, что там массивы объявляются по принципу «от сихдо сих». Но в отличие от того же Паскаля, в РНР массивы ничем не ограничены, и есть возможность создавать массивы хоть с сотого элемента, предыдущих девяносто девяти просто не будет существовать (соответственно, sizeof такого массива будет 1). В любой момент можно создать новый элемент или удалить существующий (если его не будет, программа «ругаться» не Поэтому, если при отладке программы вы не уверены, что содержится в массиве, то сделайте следующее:

while (list{$k, $v) = each ($array))

print ("$k - $v<br>");

Другие функции, работающие с массивами: array_diff (сравнение массивов), array_rand (получение случайных элементов массива), array_unique (удаление повторов элементов) и in_array (проверка, есть ли заданное значение в массиве).

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

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

$data = array (1, 10, 100, 1000, // числовые данные

'Some text', 'Another text', // строковые данные

'name' => 'John', 'age' => 23, // ассоциативные связи в массиве

'date' => array('day'=>10,'month'=>'may','year'=>2001)); //вложенный массив

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

echo data[1] ; // результат — 10

echo $data[5]; // результат — 'Another text'

echo $data['age']; // результат - 23

echo $data['date']['month']; // результат - 'may'

<< Предыдущий параграф Следующий параграф >>
Оглавление