Это наиболее распространенная операция, совершаемая с массивом для обработки каждого его элемента. С ее помощью можно включить значения элементов массива в строки HTML-таблицы или подсчитать общую сумму элементов.
Простейший способ перебора каждого элемента массива - использование оператора foreach( ). Этот оператор позволяет выполнить блок кода для каждого элемента массива. В Примере 4-7 оператор foreach( ) выводит HTML-таблицу, состоящую из элементов массива.
Пример 4-7. Организация цикла с использованием оператора foreach( )
$meal = array('breakfast' => 'Walnut Bun',
'lunch' => 'Cashew Nuts and White Mushrooms',
'snack' => 'Dried Mulberries',
'dinner' => 'Eggplant with Chili Sauce');
print "<table>\n";
foreach ($meal as $key => $value) {
print "<tr><td>$key</td><td>$value</td></tr>\n";
}
print '</table>';
Пример 4-7 выведет следующее:
<table>
<tr><td>breakfast</td><td>Walnut Bun</td></tr>
<tr><td>lunch</td><td>Cashew Nuts and White Mushrooms</td></tr>
<tr><td>snack</td><td>Dried Mulberries</td></tr>
<tr><td>dinner</td><td>Eggplant with Chili Sauce</td></tr>
</table>
Для каждого элемента в $meal оператор foreach( ) скопирует ключ элемента в переменную $key, а его значение в переменную $value. Затем он выполнит код, расположенный внутри фигурных скобок. В Примере 4-7 этот код выведет $key и $value вперемешку с HTML-тегами для построения строки таблицы. Внутри блока кода допускается использование любых имен переменных для размещения ключей и значений элементов массива. Если подобные имена существовали до использования foreach( ), то содержание переменных с такими именами будет переписано значениями массива.
При использовании foreach( ) для вывода данных в HTML-таблицу может понадобиться оформить каждую строку таблицы с использованием разных цветов и стилей. Этого просто добиться, если поместить варианты переменных для задания цвета в отдельный массив. Затем переключать значение переменной в 0 или в 1 при каждом цикле работы foreach( ) для вывода строки в нужном цвете. В Примере 4-8 организован выбор из двух величин для установки цвета, размещенных в отдельном массиве $row_color.
Пример 4-8. Изменение цветов в строках таблицы
$row_color = array('red','green');
$color_index = 0;
$meal = array('breakfast' => 'Walnut Bun',
'lunch' => 'Cashew Nuts and White Mushrooms',
'snack' => 'Dried Mulberries',
'dinner' => 'Eggplant with Chili Sauce');
print "<table>\n";
foreach ($meal as $key => $value) {
print '<tr bgcolor="' . $row_color[$color_index] . '">';
print "<td>$key</td><td>$value</td></tr>\n";
// Здесь происходит переключение $color_index между 0 и 1
$color_index = 1 - $color_index;
}
print '</table>';
Пример 4-8 выведет следующее:
<table>
<tr bgcolor="red"><td>breakfast</td><td>Walnut Bun</td></tr>
<tr bgcolor="green"><td>lunch</td><td>Cashew Nuts and White Mushrooms</td></tr>
<tr bgcolor="red"><td>snack</td><td>Dried Mulberries</td></tr>
<tr bgcolor="green"><td>dinner</td><td>Eggplant with Chili Sauce</td></tr>
</table>
Изменение переменных цикла $key и $value внутри блока кода foreach( ) не касается самого массива. Если необходимо внести изменения в массив, то нужно использовать переменную $key в качестве индекса элементов массива. В Примере 4-9 эта технология использована для удвоения значения каждого элемента массива.
Пример 4-9. Изменение массива с использованием оператора foreach( )
$meals = array('Walnut Bun' => 1,
'Cashew Nuts and White Mushrooms' => 4.95,
'Dried Mulberries' => 3.00,
'Eggplant with Chili Sauce' => 6.50);
foreach ($meals as $dish => $price) {
// Выражение $price = $price * 2 НЕ РАБОТАЕТ
$meals[$dish] = $meals[$dish] * 2;
}
// Повторный проход по элементам массива и вывод измененных значений
foreach ($meals as $dish => $price) {
printf("The new price of %s is \$%.2f.\n",$dish,$price);
}
Пример 4-9 выведет следующее:
The new price of Walnut Bun is $2.00.
The new price of Cashew Nuts and White Mushrooms is $9.90.
The new price of Dried Mulberries is $6.00.
The new price of Eggplant with Chili Sauce is $13.00.
Краткая форма использования оператора foreach( ) применяется для нумерованного массива, она показана в Примере 4-10.
Пример 4-10. Использование оператора foreach( ) с нумерованными массивами
$dinner = array('Sweet Corn and Asparagus',
'Lemon Chicken',
'Braised Bamboo Fungus');
foreach ($dinner as $dish) {
print "You can eat: $dish\n";
}
Пример 4-10 выведет следующее:
You can eat: Sweet Corn and Asparagus
You can eat: Lemon Chicken
You can eat: Braised Bamboo Fungus
В данном случае оператору foreach( ) после пункта as надо указать лишь одно имя переменной, тогда значение каждого элемента будет копироваться в эту переменную внутри блока кода. А вот доступа к ключам элементов внутри блока кода не будет.
Для получения указателя на позицию в массиве при этом варианте использования foreach( ) понадобится отдельная переменная, увеличивающаяся на 1 при каждом выполнении блока кода. При использовании оператора for( ) позиция будет точно соответствовать значению переменной цикла. Оператор foreach( ) передает значение каждого элемента массива, а оператор for( ) передает позицию каждого элемента. Какой-либо другого оператора для организации цикла, предоставляющего оба значения одновременно, не существует.
Итак, при переборе элементов нумерованного массива, если необходимо иметь указатель на текущий элемент, используйте оператор for( ) вместо foreach( ). Начальное значение переменной цикла for( ) должно быть равно 0 и возрастать до величины на единицу меньшей, чем число элементов массива. Все это показано в Примере 4-11.
Пример 4-11. Перебор элементов нумерованного массива с использованием оператора for( )
$dinner = array('Sweet Corn and Asparagus',
'Lemon Chicken',
'Braised Bamboo Fungus');
for ($i = 0, $num_dishes = count($dinner); $i < $num_dishes; $i++) {
print "Dish number $i is $dinner[$i]\n";
}
Пример 4-11 выведет следующее:
Dish number 0 is Sweet Corn and Asparagus
Dish number 1 is Lemon Chicken
Dish number 2 is Braised Bamboo Fungus
При переборе массива с использованием оператора for( ) будет доступен работающий счетчик текущего элемента. Используйте этот счетчик и оператор деления по модулю для изменения цвета строк таблицы, как это показано в Примере 4-12.
Пример 4-12. Изменение цвета строк таблицы с использованием оператора for( )
$row_color = array('red','green');
$dinner = array('Sweet Corn and Asparagus',
'Lemon Chicken',
'Braised Bamboo Fungus');
print "<table>\n";
for ($i = 0, $num_dishes = count($dinner); $i < $num_dishes; $i++) {
print '<tr bgcolor="' . $row_color[$i % 2] . '">';
print "<td>Element $i</td><td>$dinner[$i]</td></tr>\n";
}
print '</table>';
В Примере 4-12 вычисляется подходящий цвет строк таблицы с использованием выражения $i % 2, которое поочередно принимает значение либо 0, либо 1, по мере того, как $i принимает либо четные, либо нечетные значения. Отпадает необходимость в использовании отдельной переменной для хранения соответствующего цвета строки, наподобие $color_index, как это было в Примере 4-8. Пример 4-12 выведет следующее:
<table>
<tr bgcolor="red"><td>Element 0</td><td>Sweet Corn and Asparagus</td></tr>
<tr bgcolor="green"><td>Element 1</td><td>Lemon Chicken</td></tr>
<tr bgcolor="red"><td>Element 2</td><td>Braised Bamboo Fungus</td></tr>
</table>
При переборе элементов массива с использованием оператора foreach( ) элементы становятся доступными в том порядке, в каком они добавлялись к массиву. Первый добавленный элемент первым и становится доступен, второй добавленный доступен следующим и так далее. Если обрабатывать нумерованный массив, в который элементы добавлялись в порядке, отличном от обычного порядка следования их числовых ключей, то это может дать неожиданные результаты. Пример 4-13 не выводит элементы массива ни в числовом, ни в алфавитном порядке.
Пример 4-13. Порядок следования элементов массива и оператор foreach( )
$letters[0] = 'A';
$letters[1] = 'B';
$letters[3] = 'D';
$letters[2] = 'C';
foreach ($letters as $letter) {
print $letter;
}
Пример 4-13 выведет следующее:
ABDC
Для гарантированного доступа к элементам в порядке нумерации их ключей используйте для их циклического перебора оператор for( ):
for ($i = 0, $num_letters = count($letters); $i < $num_letters; $i++) {
print $letters[$i];
}
Этот код выведет следующее:
ABCD
Если надо найти определенный элемент массива, то не нужно для этого перебирать весь массив. Есть более эффективный способ определить местонахождение отдельного элемента. Для проверки наличия в массиве элемента с определенным ключем используйте функцию array_key_exists( ), как это показано в Примере 4-14. Эта функция вернет true, если элемент с указанным ей ключем существует в указанном массиве.
Пример 4-14. Проверка наличия элемента с конкретным ключем
$meals = array('Walnut Bun' => 1,
'Cashew Nuts and White Mushrooms' => 4.95,
'Dried Mulberries' => 3.00,
'Eggplant with Chili Sauce' => 6.50,
'Shrimp Puffs' => 0); // Аромат креветки бесплатно!
$books = array("The Eater's Guide to Chinese Characters",
'How to Cook and Eat in Chinese');
// Существует
if (array_key_exists('Shrimp Puffs',$meals)) {
print "Yes, we have Shrimp Puffs";
}
// Не существует
if (array_key_exists('Steak Sandwich',$meals)) {
print "We have a Steak Sandwich";
}
// Существует
if (array_key_exists(1, $books)) {
print "Element 1 is How to Cook in Eat in Chinese";
}
Для проверки наличия в массиве элемента с конкретным значением используйте функцию in_array( ), как это показано в Примере 4-15.
Пример 4-15. Проверка наличия элемента с конкретным значением
$meals = array('Walnut Bun' => 1,
'Cashew Nuts and White Mushrooms' => 4.95,
'Dried Mulberries' => 3.00,
'Eggplant with Chili Sauce' => 6.50,
'Shrimp Puffs' => 0);
$books = array("The Eater's Guide to Chinese Characters",
'How to Cook and Eat in Chinese');
// Значение существует: ключу Dried Mulberries соответствует значение 3.00
if (in_array(3, $meals)) {
print 'There is a $3 item.';
}
// Значение существует
if (in_array('How to Cook and Eat in Chinese', $books)) {
print "We have How to Cook and Eat in Chinese";
}
// Значение не существует: функция in_array( ) чувствительна к регистру
if (in_array("the eater's guide to chinese characters", $books)) {
print "We have the Eater's Guide to Chinese Characters.";
}
Функция in_array( ) возвращает true, если находит элемент с заданным значением. При проведении сравнения строк эта функция чувствительна к регистру. Функция array_search( ) подобна функции in_array( ), но при успешном завершении поиска элемента она вместо true возвращает его ключ. В Примере 4-16 функция array_search( ) возвращает название блюда, цена которого $6.50.
Пример 4-16. Поиск элемента с конкретным значением
$meals = array('Walnut Bun' => 1,
'Cashew Nuts and White Mushrooms' => 4.95,
'Dried Mulberries' => 3.00,
'Eggplant with Chili Sauce' => 6.50,
'Shrimp Puffs' => 0);
$dish = array_search(6.50, $meals);
if ($dish) {
print "$dish costs \$6.50";
}
Пример 4-16 выведет следующее:
Eggplant with Chili Sauce costs $6.50
[right]Информация была взята с сайта physics.grsu.by[/right]