Массивы с различными индексами. Использование циклов. Операции для работы с массивами

При создании массива $products мы предоставили возможность присвоить каждому элементу индекс по умолчанию. Это означает, что первый добавленный элемент стал 0-м элементом, второй 1-м и так далее. РНР поддерживает также массивы, в которых с каждым значением можно связать (ассоциировать) любой ключ (индекс).

Инициализация массива

Следующий код создает массив, в котором название товаров используется в качестве ключей, а их цены — в качестве значений.

$prices = array ('Фильтр масляный' => 20, 'Фильтр воздушный' => 10, Свечи зажигания' ' => 4 );

Символы, находящиеся между ключем и значением — ни что иное, как знак равенства, за которым следует знак "больше".

Доступ к элементам массива

Как и ранее, доступ к содержимому массива осуществляется через имя переменной и ключ, поэтому к информации, сохраненной в массиве $prices, можно обратиться как к $prices ['Фильтр масляный'], $prices ['Фильтр воздушный'] и $prices ['Свечи зажигания'].

Следующий код создает этот же массив $prices. Но вместо того, чтобы сразу создавать массив с тремя элементами, сначала создает массив только с одним элементом, а затем в массив добавляются еще два элемента.

$prices = array ('Фильтр масляный' => 20);

$prices ['Фильтр воздушный'] = 10;

$prices ['Свечи зажигания'] = 4;

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

$prices ['Фильтр масляный'] = 20;

$prices ['Фильтр воздушный'] = 10;

$prices ['Свечи зажигания'] = 4;

Использование циклов

Поскольку в ассоциативных массивах индекчы не являются числами, для работы с такими массивами невозможно воспользоваться простым счетчиком for. В этом случае потребуется применить цикл foreach либо конструкции list () и each ().

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

foreach ($prices as $key => $value)

echo $key. '=>'. $value. '<br>';

Приведенный ниже код выводит содержимое массива $prices с использованием конструкции each ().

while ($element = each ($prices ))

{

echo $element ['key'];

echo ' _ ';

echo $element ['value'];

echo '<br>';

}

В окне веб-браузера это будет выглядеть ТАК.

В приведенном выше примере кода используется функция each (). Эта функция возвращает текущий элемент массива и делает текущим следующий элемент. Поскольку функция each () вызывается внутри цикла while, она по очереди возвращает каждый элемент массива и прекращает выполнение по достижении конца массива.

В этом примере кода переменная $element является массивом. При вызове функции each () она возвращает массив с четырмя значениями и четырся индексами ячеек массива. Ячейки key и 0 содержат ключ текущего элемента, а ячейки value и 1 — значения текущего элемента. Хотя не играет роли, какую из них выбрать, предпочтительнее пользоваться именованными ячейками, а не нумерованными.

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

list ($product, $price) = each ($prices);

В этой строке кода с помощью функции each () получается текущий элемент из массива $prices, затем он возвращается в виде массива, после чего текущим становится с ледующий элемент. Кроме того, функция list () используется для преобразования элементов 0 и 1 массива, возвращаемого функцией each (), в две новых переменных $product и $price.

Можно циклически просмотреть весь массив $prices, отображая его содержимое на экране, с помощью следующего кода:

while (list ($product, $price) = each ($prices) )

echo "$product - $price <br>";

В окне веб-браузера это будет выглядеть ТАК.

Т.е. получается вывод сгенерированный предыдущим сценарием, однако его легче читать, так как функция list () позволяет присваивать имена переменным.

При использовании функции each () следует помнить, что массив отслеживает текущий элемент на начало массива. Чтобы вновь выполнить циклический просмотр массива $prices, следует воспользоваться следующим кодом:

reset ($prices);
while (list ($product, $price) = each ($prices) )
echo "$product - $price <br>";

В результате текущий элемент будет снова установлен на начало массива, что позволит еще раз выполнить просмотр массива.

Операции для работы с массивами

Существует набор специальных операций, применяемых только в отношении массивов. Большинство из них имеет склярные аналоги.

Таблица. Операции для работы с массивами РНР

Операция Название Пример Результат
+ объединение $a + $b Объединение $a и $b. Массив $b добавляется к массиву $a, при этом элементы с конфликтующими ключами не добавляются.
== равно $a == $b Возвращает true, если массивы $a и $b содержат одинаковые элементы.
=== идентично $a === $b Возвращает true, если массивы $a и $b содержат одинаковые элементы, расположенные в одном и том же порядке.
!= не равно $a != $b Возвращает true, если массивы $a и $b не содержат одинаковые элементы
<> не равно $a <> $b То же, что и !=.
!== не идентично $a !== $b Возвращает true, если массивы $a и $b не содержат одинаковые элементы, расположенные в одном и том же порядке.

Большинство операций достаточны очевидны, и только лишь объединение требует некоторых пояснений. Операция объединения пытается добавить элементы массива $b в конец массива $a. Если ключи элементов в $b совпадают с ключами некоторых элементов в $a, такие элементы не добавляются. Таким образом, элементы массива $a не перезаписываются.

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




  • Tweet


  • Другие |
назадвверхвперед
Rambler's Top100