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

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

Также, советуем воспользоваться поиском по сайту, мы уверены, что вы сможете найти больше информации по нужной Вам тематике

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'

Categories

1
Оглавление
email@scask.ru