PHP: Обход массивов

Функция print_r() позволяет посмотреть на весь массив целиком, но не может выделить отдельные его части. Представьте себе задачу, когда требуется вывести из массива элементы, удовлетворяющие определенному условию. В этом случае функция print_r() не сможет нам помочь. Для решения подобных задач применяют операторы цикла. Но и здесь нас ожидают подводные камни. Сначала разберем самый простой случай, когда массив в качестве ключей имеет последовательный ряд чисел.

Воспользуемся оператором цикла for, так как его запись является очень компактной и практичной. Единственное, что нам надо выяснить, – это количество элементов в массиве. На практике очень часто для решения данной проблемы применяют функцию count(). В качестве входного параметра для нее является массив, а возвращает она количество элементов в нем.

Обход массива

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html> 
<head>
<title> Обход массива </title>
</head>
<body>
<?php
// инициализация массива
Sclosets = array(0 => "Майка",1 => "Кроссовки",2 => "Шорты"); 
$len_mass = count ($closets); // вычисление количества элементов 
for ($i =0; $i < $len_mass; $i++) 
{
echo $closets[$i] . "<br>"; // вывод элемента
}
?>
</body> 
</html>

Итак, предположим, что ключ первого элемента в нашем массиве будет 0. Таким образом, мы проходим по всем элементам массива и выводим их. В этот цикл уже можно добавить определенное условие, предъявляемое к элементам массива.

У вас может возникнуть вопрос о присутствии переменной $len_mass в программе, так как функцию count() можно компактно уместить во второе выражение цикла for. Сразу хочется сказать, что делать этого не следует, потому что при этом возникают два негативных момента. Во-первых, функция count() будет выполняться при каждой итерации, что увеличивает время обработки, а во-вторых, количество элементов массива может поменяться в теле цикла.

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

Конструкция foreach

1
2
3
4
foreach ($massiv as $key => $value) 
{
// действия
}

В этой конструкции мы видим три переменные, среди которых $massiv – это просматриваемый массив. Переменные $кеу и $value (названия этих переменных вы выбираете сами) содержат соответственно ключ и значение. Итак, поясним ход работы этого оператора цикла на примере:

Обход массива с помощью конструкции foreach

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html> 
<head>
<title> вывод Обход массива с помощью конструкции forach </title> 
</head> 
<body> 
<?php
$closets=array("Петров"=>"Майка","Иванов"=>"Кроссовки","Сидоров"=>"Шорты");
foreach ($closets as $key => $value)
{
echo $key . " " . $value . "<br>"; // вывод элемента
}
?>
</body> 
</html>

Итак, в первой строчке мы создаем массив из трех элементов. Заметьте, что индексация производится с помощью строк. Далее следует конструкция, которая начинается со слова foreach. Затем в круглых скобках помещается рассматриваемый массив, после которого записывается специальное слово as. После него следует пара ключ-значение, разделяемая оператором =>.

Итак, на первой итерации переменной $kеу присваивается ключ первого элемента, а переменной $value – его значение. При следующей итерации в переменные $kеу и $value запишутся соответственно ключ и значение следующего элемента. И так далее, пока массив не будет пройден полностью.

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

Для работы с указателем применяются функции list(), each(), count() и др.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100