array_walk($books1,"try_walk","Роман");
?>
В результате работы скрипта получим:
Роман "Руслан и Людмила" написал А.С. Пушкин
Роман "Война и мир" написал Л.Н. Толстой
Роман "Герой нашего времени"
написал М.Ю. Лермонтов
Заметим, что мы не изменили значений у элементов массива. Чтобы их изменить, надо было передавать значения в переменную $val функции try_walk по ссылке.
<?php
$books1 = array(
"А.С. Пушкин"=>"Руслан и Людмила",
"Л.Н. Толстой"=>"Война и мир",
"М.Ю. Лермонтов"=>"Герой нашего времени");
// создаем функцию, которую хотим
// применить к элементам массива
function try_walk(&$val,$key){
$key = "
Автор: " .$key ."<br>";
$val = "Название: "" . $val .""
";
echo $key.$val;
}
// применяем ко всем элементам массива
// $book1 функцию try_walk
array_walk($books1,"try_walk");
print_r($books1);
?>
В результате работы скрипта получим:
Автор: А.С. Пушкин
Название: "Руслан и Людмила"
Автор: Л.Н. Толстой
Название: "Война и мир"
Автор: М.Ю. Лермонтов
Название: "Герой нашего времени"
Array ( [А.С. Пушкин] =>
Название: "Руслан и Людмила"
[Л.Н. Толстой] =>
Название: "Война и мир"
[М.Ю. Лермонтов] =>
Название: "Герой нашего времени")
Выделение подмассива
Функция array_slice
Поскольку массив – это набор элементов, вполне вероятно, потребуется выделить из него какой-нибудь поднабор. В PHP для этих целей есть функция array_slice. Ее синтаксис таков:
array_slice (массив,
номер_элемента [, длина])
Эта функция выделяет подмассив длины длина в массиве массив, начиная с элемента, номер которого задан параметром номер_элемента. Положительный номер_элемента указывает на порядковый номер элемента относительно начала массива, отрицательный – на номер элемента с конца массива.
<?php
$arr = array(1,2,3,4,5);
$sub_arr = array_slice($arr,2);
print_r($sub_arr);
/*
выведет Array ( [0] => 3 [1] =>4 [2] => 5 ),
т.е. подмассив, состоящий из элементов
3, 4, 5 */
$sub_arr = array_slice($arr,-2);
print_r($sub_arr);
// выведет Array ( [0] => 4 [1] => 5 ),
// т.е. подмассив, из элементов 4, 5
?>
Если задать параметр длина при использовании array_slice, то будет выделен подмассив, имеющий ровно столько элементов, сколько задано этим параметром. Длину можно указывать и отрицательную. В этом случае интерпретатор удалит с конца массива число элементов, равное модулю параметра длина.
<?php
$arr = array(1,2,3,4,5);
$sub_arr = array_slice($arr, 2, 2);
// содержит массив из элементов 3, 4
$sub = array_slice($arr,-3, 2);
// тоже содержит массив из элементов 3, 4
$sub1 = array_slice($arr,0, -1);
// содержит массив из
// элементов 1, 2, 3, 4
$sub2 = array_slice($arr,-4, -2);
// содержит массив из элементов 2, 3
?>
Функция array_chunk
Есть еще одна функция, похожая на array_slice() – это array_chunk(). Она разбивает массив на несколько подмассивов заданной длины. Синтаксис ее такой:
array_chunk ( массив, размер
[, сохранять_ключи])
В результате работы array_chunk() возвращает многомерный массив, элементы которого представляют собой полученные подмассивы. Если задать параметр сохранять ключи как true, то при разбиении будут сохранены ключи исходного массива. В противном случае ключи элементов заменяются числовыми индексами, которые начинаются с нуля.
Пример 7.15. У нас есть список приглашенных, оформленный в виде массива их фамилий. У нас имеются столики на три персоны. Поэтому нужно распределить всех приглашенных по трое.
<?php
$persons = array("Иванов", "Петров",
"Сидорова","Зайцева", "Волкова");
$triples = array_chunk($persons,3);
// делим массив на подмассивы
// по три элемента
foreach ($triples as $k => $table){
// выводим полученные тройки
echo "За столиком номер $k сидят: <ul>";
foreach ($table as $pers)
echo "<li>$pers";
echo "</ul>";
}
?>
В результате получим:
за столиком номер 0 сидят:
• Иванов
• Петров
• Сидорова
за столиком номер 1 сидят:
• Зайцева
• Волкова
Сумма элементов массива
В этом разделе мы познакомимся с функцией, вычисляющей сумму всех элементов массива. Сама задача вычисления суммы значений массива предельно проста. Но зачем писать лишний раз один и тот же код, если можно воспользоваться специально созданной и всегда доступной функцией. Функция эта называется, как можно догадаться, array_sum(). И в качестве параметра ей передается только имя массива, сумму значений элементов которого нужно вычислить.
В качестве примера использования этой функции приведем решение более сложной задачи, чем просто вычисление суммы элементов. Этот пример также иллюстрирует применение функции array_slice(), которую мы обсуждали чуть раньше.
Пример 7.16. Пусть дан массив натуральных чисел. Нужно найти в нем такое число, что сумма элементов справа от него равна сумме элементов слева от него.
<?php
//массив задается функцией array
$arr = array(2,1,3,4,5,6,4);
// перебираем каждый элемент массива $arr.
// Внутри цикла текущий ключ массива
// содержится в переменной $k,
// текущее значение – в переменной $val
foreach ($arr as $k => $val){
$p = $k + 1;
// синтаксис array array_slice (
array array,int offset [,int length])
// array_slice выделяет подмассив
// длины length в массиве array,
// начиная с элемента offset.
$out_next = array_slice($arr,$p);
// получаем массив элементов,
// идущих после текущего
$out_prev = array_slice($arr,0,$k);
// получаем массив элементов,
// идущих перед текущим
// функция mixed array_sum (array array)
// подсчитывает сумму элементов массива array
$next_sum = array_sum($out_next);
$prev_sum = array_sum($out_prev);
// если сумма элементов до текущего равна
// сумме элементов после, то выводим
// значение текущего элемента
if ($next_sum==$prev_sum)
echo "value:$val";
// можно посмотреть, что представляют собой
// рассмотренные массивы на каждом шаге
// print_r($out_next); echo "<br>";
// print_r($out_prev);
// echo "$next_sum, $prev_sum<br>";
echo "<hr>";
}
?>
Заключение
Итак, подведем итоги. В этой лекции мы изучили ряд функций, упрощающих работу с массивами данных. Мы рассмотрели функции для поиска значения среди элементов массива; функции для сортировки элементов массива, как по их значениям, так и по ключам; функции, позволяющие применять ко всем элементам массива функцию, созданную пользователем. Кроме того, мы изучили функцию, выделяющую подмассивы из элементов массива, и функцию, вычисляющую сумму всех элементов массива. Использование всех этих функций было продемонстрировано на примерах. Все функции для работы с массивами доступны без каких-либо конфигурационных настроек PHP, и пользоваться ими можно абсолютно свободно. Так что, прежде чем изобретать велосипед, загляните в руководство по языку PHP: – вполне возможно, что кто-то сделал это до вас.
Строки
Вероятно, читатели примерно представляют, что такое тип данных «строка» и как создать переменную такого типа. В одной из первых лекций мы приводили три способа задания строк: с помощью одинарных кавычек, двойных кавычек и с помощью heredoc–синтаксиса. Отмечали мы и основные различия между этими способами. В основном они касаются обработки переменных и управляющих последовательностей внутри строки.
<?php
echo 'В такой строке НЕ обрабатываются
переменные и большинство
последовательностей';
echo "Здесь переменные и последовательности
обрабатываются";
echo <<<EOT
Здесь тоже обрабатываются как переменные,
так и управляющие последовательности.
И кроме того, можно вводить символы кавычек