ФорумПрограммированиеПыхнуть хотите?F.A.Q. → Обработка массива в цикле (как сделать вывод данных из массива = ) )

Обработка массива в цикле (как сделать вывод данных из массива = ) )

  • pasha

    Сообщения: 1048 Репутация: N Группа: Адекваты

    Spritz 24 августа 2007 г. 10:36

    Обработка массива в цикле

    Это наиболее распространенная операция, совершаемая с массивом для обработки каждого его элемента. С ее помощью можно включить значения элементов массива в строки 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]
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 24 августа 2007 г. 10:39, спустя 2 минуты 50 секунд

    Я уже подумал, что это ты сам написал, а потом заметил номера примеров. Где копирайты?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!