Массивы в PHP. Пишем на PHP: Работа с массивами (начало)

Скачать Viber 26.07.2019
Скачать Viber

Мы с вами изучили основы работы с массивами, у вас теперь есть понимание того, что такое массив, что такое цикл, и мы даже реализовали несколько своих функций для работы с массивами. Теперь вы готовы получить знания об уже готовых функциях для работы с массивами в PHP.

В этом плане стандартная библиотека функций предлагает нам большой выбор, практически на все случаи жизни. Я же постараюсь в этом уроке рассказать вам о тех функциях, с которыми лично мне приходится работать ежедневно. На мой взгляд, вся веб-разработка на PHP выглядит плюс/минус одинаково, и большинству разработчиков приходится работать с этими же функциями. Так что, функции для работы с массивами в PHP, перечисленные в этой статье, вам пригодятся с очень большой вероятностью. Итак, давайте посмотрим, какие же задачи нам чаще всего требуется решать при работе с массивами.

Проверка существования ключа в массиве

Зачастую мы не знаем, есть ли в массиве какой-либо ключ. И если мы попробуем обратиться по ключу, которого в массиве нет – возникнет ошибка. Простейший пример.

курса PHP для начинающих .

В результате, как и ожидали – ошибка.

Чтобы подобной ситуации избежать, следует проверять, есть ли такой ключ в массиве или нет. Для этого есть функция array_key_exists($key, $array). Она принимает на вход первым аргументом ключ, а вторым – массив, в котором его наличие нужно проверить. Возвращает true, если ключ найден, и false – если нет. Использование выглядит следующим образом.

Код доступен только после покупки курса PHP для начинающих .

Результат:

Проверка существования значения

Не менее часто приходится узнать, а есть ли значение в массиве. Например, мы хотим узнать, есть ли число 7 в массиве. Как мы помним, в прошлом уроке мы самостоятельно написали для этого функцию. Однако в реальном кодинге нужно по большей части пользоваться готовым. Эта функция называется in_array($needle, $array). Здесь $needle – это то, что ищется, $array – массив, в котором ищем. Она возвращает true, если значение найдено, и false – если нет. Выглядит её применение следующим образом.

Код доступен только после покупки курса PHP для начинающих .

Объединение массивов

Очень часто требуется объединить 2 массива в один. Для этого есть функция array_merge($array1, $array2). В качестве аргументов, как вы поняли, этой функции передаются массивы, которые нужно объединить. Возвращает эта функция получившийся массив.

Код доступен только после покупки курса PHP для начинающих .

Результат:

Обратите внимание, что если ключи будут строковыми, то поведение функции будет несколько иным. Если строковые ключи из $array2 будут пересекаться с ключами из массива $array1, то в результат для пересекающихся ключей попадут только значения из $array2. Они как бы перезапишут то, что было в первом массиве.

Код доступен только после покупки курса PHP для начинающих .

Результат получится следующим:

Это может быть удобно, когда нам необходимо обновить часть каких-то данных в массиве. Как в примере выше – мы обновили пароль, оставив логин прежним.

Другие функции

Функций для работы с массивами в PHP очень много. И остальные вы найдёте на сайте с документацией PHP .
А домашнее задание вам в этом поможет.

Если этот урок был вам полезен, расскажите об этом курсе своим знакомым или поделитесь на него ссылкой в социальных сетях.

На самом деле массив в PHP - это упорядоченное отображение, которое устанавливает соответствие между значением и ключем . Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как собственно массив, список (вектор), хэш-таблицу (являющуюся реализацией карты), словарь, коллекцию, стэк, очередь или, возможно, как что-то еще. Поскольку вы можете иметь в качестве значения другой массив PHP, вы можете также легко эмулировать деревья. Объяснение этих структур данных выходит за рамки данного справочного руководства, но вы найдете как минимум один пример каждой из них. За дополнительной информацией вы можете обратиться к соответствующей литературе по этой обширной теме.

Синтаксис

Определение при помощи array()

Массив может быть создан языковой конструкцией array() . В качестве параметров она принимает определенное количество разделенных запятыми пар key => value (ключ => значение). $arr = array("foo" => "bar" , 12 => true );$arr [ "foo" ]; // bar
echo $arr [ 12 ]; // 1
?>

Key может быть либо integer , либо string . Если ключ - это стандартное представление integer , он так и будет интерпретироваться (т.е. "8" будет восприниматься как 8 , тогда как "08" будет интерпретироваться как "08"). В PHP нет разницы между индексными и ассоциативными массивами; существует только один тип массива, который может содержать и числовые, и строковые индексы. Значение может быть любого имеющегося в PHP типа.

$arr = array("somearray" => array(6 => 5 , 13 => 9 , "a" => 42 ));$arr [ "somearray" ][ 6 ]; // 5
echo $arr [ "somearray" ][ 13 ]; // 9
echo $arr [ "somearray" ][ "a" ]; // 42
?>

Если вы не указываете ключ для приведенного значения, то берется максимальный числовой индекс и новый ключ будет равен этому максимуму + 1. Если вы укажите ключ, которому уже присвоено значение, оно будет перезаписано.

// Этот массив эквивалентен...
array(5 => 43 , 32 , 56 , "b" => 12 );// ...этому массиву
array(5 => 43 , 6 => 32 , 7 => 56 , "b" => 12 );
?>

Используя в качестве ключа TRUE вы получите ключ 1 типа integer . Используя в качестве ключа FALSE вы получите ключ 0 типа integer . Используя в качестве ключа NULL , вы получите пустую строку. Использование в качестве ключа пустой строки создаст (или перезапишет) ключ с пустой строкой и его значение; это не то же самое, что использование пустых квадратных скобок. Вы не можете использовать в качестве ключей массивы или объекты. Это вызовет предупреждение: Illegal offset type ("Недопустимый тип смещения").

Создание/модификация с помощью синтаксиса квадратных скобок

Также вы можете изменять существующий массив, явно устанавливая значения в нем. Это выполняется присвоением значений массиву при указании в скобках ключа. Кроме того, вы можете опустить ключ, в этом случае добавьте к имени переменной пустую пару скобок (" "). Если массив $arr еще не существует, он будет создан. Таким образом, это еще один способ определить массив. Для изменения определенного значения просто присвойте элементу с его ключом новое значение. Если вы хотите удалить пару ключ/значение, вам нужно использовать функцию unset() .
Замечание: Как уже говорилось выше, если вы не укажите в скобках ключа, то будет взят максимальный из существующих целочисленных индексов, и новым ключом будет это максимальное значение + 1. Если целочисленных индексов еще нет, то ключом будет 0 (ноль). Если вы укажите ключ, которому уже присвоено значение, оно будет перезаписано.

Обратите внимание, что максимальный числовой ключ, используемый для этого не обязательно должен существовать в массиве в настоящий момент . Он просто должен был существовать с момента последнего переиндексирования массива. Это иллюстрирует следующий пример:

// Создаем простой массив.
$array = array(1 , 2 , 3 , 4 , 5 );
print_r ($array );// Теперь удаляем каждый элемент, но сам массив оставляем нетронутым:
foreach ($array as $i => $value ) {
unset($array [ $i ]);
}
print_r ($array );// Создаем элемент (обратите внимание, что новым ключом будет 5,
// а не 0, как вы возможно ожидали).
$array = 6 ;
print_r ($array );// Переиндексация:
$array = array_values ($array );
$array = 7 ;
print_r ($array );
?>
Вышеприведенный пример выведет следующее: Array ( => 1 => 2 => 3 => 4 => 5) Array () Array ( => 6) Array ( => 6 => 7)

Полезные функции

Для работы с массивами существует достаточное количество полезных функций. Смотрите раздел функции для работы с массивами .
Замечание: Функция unset() позволяет удалять ключи массива. Обратите внимание, что массив НЕ будет переиндексирован. Если вы использовали только "обычные числовые индексы" (увеличивающиеся на единицу, начиная с нуля), вы можете переиндексировать массив используя array_values() .

Управляющая конструкция foreach существует специально для массивов. Она предоставляет возможность легко пройтись по массиву.

Массив делает и не делает

Почему $foo это неверно?

Вы всегда должны заключать индекс ассоциативного массива в кавычки. К примеру, пишите $foo["bar"], а не $foo. Но почему $foo это неверно? Возможно, вы встречали в старых скриптах следующий синтаксис: $foo [ bar ] = "враг" ;
echo $foo [ bar ];
// и т. д.
?>

Это неверно, хотя и работает. Тогда почему же это неверно? Причина в том, что этот код содержит неопределенную константу (bar), а не строку ("bar" - обратите внимание на кавычки), и PHP в будущем может определить константу, которая к несчастью для вашего кода будет иметь то же самое имя. Это работает, потому что PHP автоматически преобразует голую строку (не заключенную в кавычки строку, которая не соответствует ни одному из известных символов) в строку, которая содержит голую строку. Например, если константа с именем bar не определена, то PHP заменит bar на строку "bar" и использует ее.

Замечание: Это не означает, что нужно всегда заключать ключ в кавычки. Нет необходимости заключать в кавычки константы или переменные , поскольку это помешает PHP обрабатывать их. error_reporting (E_ALL );
ini_set ("display_errors" , true );
ini_set ("html_errors" , false );
// Простой массив:
$array = array(1 , 2 );
$count = count ($array );
for ($i = 0 ; $i < $count ; $i ++) {
echo "\nПроверяем $i: \n" ;
echo "Плохо: " . $array [ "$i" ] . "\n" ;
echo "Хорошо: " . $array [ $i ] . "\n" ;
echo "Плохо: {$array["$i"]}\n" ;
echo "Хорошо: {$array[$i]}\n" ;
}
?>

Замечание: Вышеприведенный код выведет следующее:

Дополнительные примеры, демонстрирующие этот факт:

// Давайте покажем все ошибки
error_reporting (E_ALL );$arr = array("fruit" => "apple" , "veggie" => "carrot" );// Верно

print $arr [ "veggie" ]; // carrot

// Неверно. Это работает, но из-за неопределенной константы с
// именем fruit также вызывает ошибку PHP уровня E_NOTICE
// Notice: Use of undefined constant fruit - assumed "fruit" in...

print $arr [ fruit ]; // apple

// Давайте определим константу, чтобы продемонстрировать, что
// происходит. Мы присвоим константе с именем fruit значение "veggie".

define ("fruit" , "veggie" );// Теперь обратите внимание на разницу
print $arr [ "fruit" ]; // apple
print $arr [ fruit ]; // carrot

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

print "Hello $arr" ; // Hello apple

// С одним исключением: фигурные скобки вокруг массивов внутри
// строк позволяют константам находится там

print "Hello {$arr}" ; // Hello carrot
print "Hello {$arr["fruit"]}" ; // Hello apple

// Это не будет работать и вызовет ошибку обработки, такую как:
// Parse error: parse error, expecting T_STRING" or T_VARIABLE" or T_NUM_STRING"
// Это, конечно, также приложимо и к использованию в строках автоглобальных переменных

print "Hello $arr["fruit"]" ;
print "Hello $_GET["foo"]" ;// Еще одна возможность - конкатенация
print "Hello " . $arr [ "fruit" ]; // Hello apple
?>

Когда вы переведете error_reporting() в режим отображения ошибок уровня E_NOTICE (такой как E_ALL), вы увидите эти ошибки. По умолчанию error_reporting установлена их не отображать. Как указано в разделе синтаксис , внутри квадратных скобок (" [ " и " ] ") должно быть выражение. Это означает, что вы можете писать подобно этому:

Обратите внимание, что E_ERROR - это такой же верный идентификатор, как и bar в первом примере. Но последний пример по сути эквивалентен такой записи:

Поскольку E_ERROR соответствует 1 и т. д. Как мы уже объяснили в вышеприведенных примерах, $foo по-прежнему работает, но это неверно. Это работает, поскольку в соответствии со своим синтаксисом bar ожидается как константа. Однако, в данном случае константы с именем bar не существует. В таком случае PHP предполагает, что, написав bar , вы имели ввиду строку "bar" , но забыли указать кавычки.

Так что же в этом плохого?

Когда-нибудь в будущем команда разработчиков PHP возможно пожелает добавить еще одну константу или ключевое слово, либо вы можете ввести в ваше приложение еще одну константу и тогда у вас могут возникнуть проблемы. Например, вы уже не можете использовать таким образом слова empty и default , поскольку они являются зарезервированными ключевыми словами .
Замечание: Повторим, внутри строки (string ), заключенной в двойные кавычки правильным является не окружать индексы массива кавычками, поэтому "$foo" является верным. Более подробно почему - смотрите вышеприведенные примеры, а также раздел обработка переменных в строках .

Преобразование в массив

Для любого из типов: integer , float , string , boolean и , если вы преобразуете значение в массив, вы получите массив с одним элементом (с индексом 0), являющимся скалярным значением, с которого вы начали. Если вы преобразуете в массив объект (object ), вы получите в качестве элементов массива свойства (переменные-члены) этого объекта. Ключами будут имена переменных-членов. Если вы преобразуете в массив значение NULL , вы получите пустой массив.

Примеры

Тип массив в PHP является очень гибким, поэтому мы приведем здесь несколько примеров, чтобы продемонстрировать вам все возможности массивов. // это
$a = array("color" => "red" ,
"taste" => "sweet" ,
"shape" => "round" ,
"name" => "apple" ,
4 // ключом будет 0
);// полностью соответствует
$a [ "color" ] = "red" ;
$a [ "taste" ] = "sweet" ;
$a [ "shape" ] = "round" ;
$a [ "name" ] = "apple" ;
$a = 4 ; // ключом будет 0$b = "a" ;
$b = "b" ;
$b = "c" ;
// создаст массив array(0 => "a" , 1 => "b" , 2 => "c"),
// или просто array("a", "b", "c")
?>

Пример 11-4. Использование array()

// Массив как карта (свойств)
$map = array("version" => 4 ,
"OS" => "Linux" ,
"lang" => "english" ,
"short_tags" => true
);// исключительно числовые ключи
$array = array(7 ,
8 ,
0 ,
156 ,
- 10
);
// это то же самое, что и array(0 => 7, 1 => 8, ...)$switching = array(10 , // ключ = 0
5 => 6 ,
3 => 7 ,
"a" => 4 ,
11 , // ключ = 6 (максимальным числовым индексом был 5)
"8" => 2 , // ключ = 8 (число!)
"02" => 77 , // ключ = "02"
0 => 12 // значение 10 будет перезаписано на 12
);// пустой массив
$empty = array();
?>
Результат работы приведенного скрипта будет следующий: Обратите внимание, что в настоящее время невозможно изменять значения массива в таком цикле напрямую. Однако можно сделать так: Следующий пример создает начинающийся с единицы массив.

= sort ($files );
print_r ($files );
?>

Поскольку значение массива может быть чем угодно, им также может быть другой массив. Таким образом вы можете создавать рекурсивные и многомерные массивы.

Пример 11-10. Рекурсивные и многомерные массивы

$fruits = array ("фрукты" => array ("a" => "апельсин" ,
"b" => "банан" ,
"c" => "яблоко"
),
"числа" => array (1 ,
2 ,
3 ,
4 ,
5 ,
6
),
"дырки" => array ("первая" ,
5 => "вторая" ,
"третья"
);// Несколько примеров доступа к значениям предыдущего массива
echo $fruits [ "дырки" ][ 5 ]; // напечатает "вторая"
echo $fruits [ "фрукты" ][ "a" ]; // напечатает "апельсин"
unset($fruits [ "дырки" ][ 0 ]); // удалит "первая"

// Создаст новый многомерный массив

$juices [ "яблоко" ][ "зеленое" ] = "хорошее" ;
?>
Обратите внимание, что при присваивании массива всегда происходит копирование значения. Чтобы копировать массив по ссылке, вам нужно использовать оператор ссылки.

Давно я не писал в бложек. Работа и учеба не дают покоя. Последнее время получаю много заказов на PHP, и частенько приходится работать с массивами данных. Знания мои в PHP не изумительные, поэтому постоянно лезу в документацию. Сегодня пришла в голову мысль — написать себе мини-шпаргалку с полезными функциями для работы с массивами в PHP. Думаю, эта шпаргалка пригодится не только мне.

Самая часто используемая функция на мой взгляд — это count(«массив») . Функция count возвращает количество элементов в массиве. Пример работы:

$myArr = array("John", "Ivan", "Oleg"); echo count($myArr);

$ myArr = array ("John" , "Ivan" , "Oleg" ) ;

echo count ($ myArr ) ;

На самом деле, функция count может работать не только с массивами, но и с обыкновенными переменными, а так же с многомерными массивами. Приведу еще парочку примеров:

$myArr = array(array(1, 2, 3), array(1, 2), 3); echo count($myArr); //Выведет 3 echo count($myArr, COUNT_RECURSIVE); //Выведет общее количество элементов (8) $myVar = "Ivan"; echo count($myVar); //Выведет 1 echo count(NULL); //Выведет 0

$ myArr = array (array (1 , 2 , 3 ) , array (1 , 2 ) , 3 ) ;

echo count ($ myArr ) ; //Выведет 3

echo count ($ myArr , COUNT_RECURSIVE ) ; //Выведет общее количество элементов (8)

$ myVar = "Ivan" ;

echo count ($ myVar ) ; //Выведет 1

echo count (NULL ) ; //Выведет 0

Если кто не понял, почему count($myArr, COUNT_RECURSIVE) возвращает 8 — объясняю. Массив $myArr состоит из 3-х элементов (два массива и одно число). Первый элемент массива $myArr — это массив из 3 элементов. Значит всего элементов уже 6. Прибавляем сюда еще два элемента из второго массива и получаем 8.

Идем дальше. Следующая полезная функция — in_array(«искомое значение», «массив», [«совпадение по типу»]) . Функция in_array ищет элемент по искомому значению в переданном ей массиве. Если находит — возвращает TRUE, в противном случае FALSE. Третий аргумент отвечает за необходимость совпадения по типу. Если он установлен в TRUE — значит, искомое значение должно совпадать не только по значению, но и по типу. Кроме того, сравнение строк — чувствительно к регистру. Примеры:

$myArr = array("Abc", "3", 2); echo in_array("Abc", $myArr); //Выведет 1 echo in_array("abc", $myArr); //Ничего не выведет echo in_array("2", $myArr); //Выведет 1 echo in_array("2", $myArr, TRUE); //Ничего не выведет

echo in_array ("Abc" , $ myArr ) ; //Выведет 1

echo in_array ("abc" , $ myArr ) ; //Ничего не выведет

echo in_array ("2" , $ myArr ) ; //Выведет 1

echo in_array ("2" , $ myArr , TRUE ) ; //Ничего не выведет

$myArr = array("Abc", "3", 2); echo array_search("Abc", $myArr); //Выведет 0 echo array_search("abc", $myArr); //Ничего не выведет echo array_search("2", $myArr); //Выведет 2 echo array_search("2", $myArr, TRUE); //Ничего не выведет

$ myArr = array ("Abc" , "3" , 2 ) ;

echo array_search ("Abc" , $ myArr ) ; //Выведет 0

echo array_search ("abc" , $ myArr ) ; //Ничего не выведет

echo array_search ("2" , $ myArr ) ; //Выведет 2

echo array_search ("2" , $ myArr , TRUE ) ; //Ничего не выведет

Ничего сложного. Следующей гости нашей статьи это array_values(«массив») и array_keys(«массив») . Не трудно догадаться, как они работают. Функция array_values возвращает новый массив, содержащий все значение переданного ей массива, а array_keys — ключи, переданного ей массива. Примеры:

$myArr = array("A" => 1, "B" => 2, "C" => 3); $valuesArr = array_values($myArr); $keysArr = array_keys($myArr); print_r($valuesArr); print_r($keysArr);

$ myArr = array ("A" =& gt ; 1 , "B" =& gt ; 2 , "C" =& gt ; 3 ) ;

$ valuesArr = array_values ($ myArr ) ;

$ keysArr = array_keys ($ myArr ) ;

print_r ($ valuesArr ) ;

print_r ($ keysArr ) ;

Результат выполнения:

Array ( => 1 => 2 => 3) Array ( => A => B => C).

Идем дальше. Функции сортировки массивов. Первой рассмотрим sort(«массив», [«флаги»]) . Сортирует массив по возрастанию, или по алфавиту, если это строка. В качестве дополнительных флагов можно задать следующие параметры: SORT_REGULAR (о бычное сравнение элементов), SORT_NUMERIC (числовое сравнение элементов), SORT_STRING (строковое сравнение элементов). Подробнее можно прочитать в официальной документации, по вот этой ссылке . Примеры использования функции:


"; sort($myArr); print_r($myArr); echo "
"; sort($myArr, SORT_STRING); print_r($myArr); echo "
";

print_r ($ myArr ) ;

echo "
" ;

sort ($ myArr ) ;

print_r ($ myArr ) ;

echo "
" ;

sort ($ myArr , SORT_STRING ) ;

print_r ($ myArr ) ;

echo "
" ;

Результат работы:

Array ( => 10 => 1 => 12 => 13 => 2 => 3 => 11 => 100)
Array ( => 1 => 2 => 3 => 10 => 11 => 12 => 13 => 100)
Array ( => 1 => 10 => 100 => 11 => 12 => 13 => 2 => 3)

Все просто, не так ли? Есть аналогичная функция, но сортирует она в обратном порядке — rsort(«массив», [«флаги»]) . А так же еще две функции, выполняющие аналогичные действия, но при этом они сохраняют значения ключей. Это asort(«массив», [«флаги»]) — простая сортировка с сохранением ключей и arsort(«массив», [«флаги»]) — сортировка в обратном порядке, с сохранением ключей. Аналогичный пример работы функций asort и arsort:

$myArr = array(10, 1, 12, 13, 2, 3, 11, 100); print_r($myArr); echo "
"; asort($myArr); print_r($myArr); echo "
"; arsort($myArr); print_r($myArr); echo "
";

$ myArr = array (10 , 1 , 12 , 13 , 2 , 3 , 11 , 100 ) ;

print_r ($ myArr ) ;

echo "
" ;

asort ($ myArr ) ;

print_r ($ myArr ) ;

echo "
" ;

arsort ($ myArr ) ;

print_r ($ myArr ) ;

echo "
" ;

Результат работы немного другой:

Array ( => 10 => 1 => 12 => 13 => 2 => 3 => 11 => 100)
Array ( => 1 => 2 => 3 => 10 => 11 => 12 => 13 => 100)
Array ( => 100 => 13 => 12 => 11 => 10 => 3 => 2 => 1)

Обратите внимание, что в этом примере я не использовал флаг SORT_STRING. Кроме этих функций, существует возможность сортировка массива по ключам. Для этого есть функции ksort(«массив», [«флаги»]) и krsort(«массив», [«флаги»]) , которые работают аналогично, поэтому обойдемся без примера:).

А что если я хочу отсортировать массив каким-либо своим способом? В этом мне могут помочь функции usort(«массив», «функция») и uksort(«массив», «функция») , которые выполняют сортировку в соответствии пользовательской функции сравнения элементов. То есть, программист должен описать функцию, которая будет сравнивать элементы массива по очереди, а сами usort или uksort будут располагать элементы в массиве, в зависимости от результатов сравнения. Пример немного посложнее. Сначала объясню устройство массива. Он будет состоять из массивов, содержащих строку и число. Например, вот такой:

$myArr = array(array(1, "String1"), array(2, "String2"), array(3, "String3"));

$ myArr = array (array (1 , "String1" ) , array (2 , "String2" ) , array (3 , "String3" ) ) ;

Теперь поменяем элементы местами и отсортируем его по первому элементу внутренних массивов. Код:

//Наш массив $myArr = array(array(2, "String2"), array(3, "String3"), array(1, "String1")); //Функция сравнения элементов function compare($a, $b) { if ($a < $b) return -1; elseif ($a > $b) return 1; return 0; } //Сортируем массив usort($myArr, "compare"); //Выводим на экран print_r($myArr);

//Наш массив

$ myArr = array (array (2 , "String2" ) , array (3 , "String3" ) , array (1 , "String1" ) ) ;

//Функция сравнения элементов

function compare ($ a , $ b ) {

if ($ a [ 1 ] & lt ; $ b [ 1 ] )

return - 1 ;

elseif ($ a [ 1 ] & gt ; $ b [ 1 ] )

return 1 ;

return 0 ;

//Сортируем массив

usort ($ myArr , "compare" ) ;

//Выводим на экран

print_r ($ myArr ) ;

Результат работы программы:

Array ( => Array ( => 1 => String1) => Array ( => 2 => String2) => Array ( => 3 => String3))

Как видите ничего сложного. Массив сортируется по первому элементу внутреннего массива. Функция сравнения может возвращать 3 значения. Если «положительное» — значит, функция сортировка считает, что первый элемент больше второго, если «отрицательное» — значит наоборот и если «0» — значит, элементы равны. Функция ursort работает также, только сортирует в обратном порядке. Кстати, можно отсортировать по убыванию, используя usort, просто задав правильную функцию сравнения для этого случая.

Дальше нас ждет array_walk(«массив», «функция», [«дополнительный аргумент»]) . Эта функция пробегается по массиву, передавая пару значения и ключа в пользовательскую функцию. Дополнительный аргумент, если он задан, передастся в качестве третьего в пользовательскую функцию. Если ошибок во время работы не возникло — вернет TRUE, иначе — FALSE. Рассмотрим пример, что бы было понятнее:

$myArr = array("A" => "Ivan", "B" => "John", "C" => "Bob"); function walker_function($value, $key, $additional) { echo $key." ".$additional." ".$value."
"; } array_walk($myArr, "walker_function", "is");

$ myArr = array ("A" =& gt ; "Ivan" , "B" =& gt ; "John" , "C" =& gt ; "Bob" ) ;

function walker_function ($ value , $ key , $ additional ) {

echo $ key . " " . $ additional . " " . $ value . "
" ;

Массив представляет собой совокупность объектов, имеющих одинаковые размер и тип. Каждый объект в массиве называется элементом массива. Создать новый массив в PHP несложно. При объявлении индексируемого массива после имени переменной ставится пара квадратных скобок ():

$languages = "Spanish";

// $languages = "Spanish"

После этого в массив можно добавлять новые элементы, как показано ниже. Обратите внимание: новые элементы добавляются без явного указания индекса. В этом случае новый элемент добавляется в позицию, равную длине массива плюс 1:

$languages = "English"; // $1anguages[l] = "English";

$languagest ] = "Gaelic"; // $languages = "Gaelic";

Кроме того, новые элементы можно добавлять в конкретную позицию массива. Для этого указывается индекс нрвого элемента:

$languages = "Italian";

$languages = "French";

Ассоциативные массивы создаются аналогичным образом:

$languages["Spain"] = "Spanish";

$languages["France"] = "French";

При создании массивов используются три стандартные языковые конструкции:

  • аrrау();
  • list();
  • range().

Хотя все три случая приводят к одному результату -- созданию массива, в некоторых случаях одна конструкция может оказаться предпочтительнее других. Далее приведены описания и примеры использования каждой конструкции.

Функция array() получает ноль или более элементов и возвращает массив, состоящий из указанных элементов. Ее синтаксис:

array array ([элемент1, элемент2...])

Вероятно, array() является всего лишь более наглядной записью для создания массива, используемой для удобства программиста. Ниже показан пример использования array() для создания индексируемого массива:

$languages = array ("English". "Gaelic". "Spanish");

// $languages = "English". $languages = "Gaelic",

// $languages = "Spanish"

А вот как array() используется при создании ассоциативных массивов:

$languages = array("Spain" => "Spanish",

"Ireland" => "Gaelic".

"United States" => "English");

// $languages["Spain"] = "Spanish"

// $languages["Ireland"] = "Gaelic"

// $languages["United States"] = "English"

Ассоциативные массивы особенно удобны в тех ситуациях, когда числовые индексы не имеют логического соответствия. Например, в предыдущем примере названия стран вполне естественно ассоциируются с языками. Попробуйте-ка воплотить эту логическую связь при помощи цифр!

Конструкция list() похожа на аrrау(), однако ее главная задача -- одновременное присваивание значений, извлеченных из массива, сразу нескольким переменным. Синтаксис команды list():

void list (переменная1 [. переменная2 , ...])

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

профессия и любимый цвет); компоненты записи разделяются вертикальной чертой (|). Типичная строка выглядит так:

Nino Sanzi|Professional Golfer|green

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

while ($line = fgets ($user_file. 4096)) :

// Разделить строку функцией split().

// Компоненты присваиваются переменным Sname. $occupation и Scolor.

list ($name, $occupation, $color) = split("|", $line);

// Отформатировать и вывести данные

print "Name: Sname
";

print "Occupation: Soccupation
";

print "Favorite color: Scolor
";

Каждая строка файла читается, форматируется и выводится в следующем виде:

Name: Nino Sanzi

Occupation: Professional Golfer

Favorite color: green

В приведенном примере применение list() зависит от разделения строки на элементы функцией split(). Элементы, полученные в результате деления, присваиваются, соответственно, переменным $name, $occupation и $color. Дальше все сводится к форматированию данных для вывода в конкретном браузере. Удобные средства лексического анализа текстовых файлов являются одной из сильных сторон PHP. Эта тема подробно рассматривается в главах 7 и 8.

Конструкция range() позволяет легко и быстро создать массив целых чисел из интервала, определяемого верхней и нижней границами. Range() возвращает массив, состоящий из всех целых чисел указанного интервала. Синтаксис range():

array range (int нижняя_граница, int верхняяграница)

Следующий пример наглядно показывает, насколько удобна эта конструкция:

$lottery = range(0,9);

// $lottery = array(0,1,2,3,4,5,6,7,8,9)

Как видно из приведенного фрагмента, в параметрах range() был указан интервал от 0 до 9 и массив $lottery был заполнен целыми числами из этого интервала.

Многомерные массивы

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

$chessboard = "King"; // Двухмерный массив

$capitals["USA"] ["Ohio"] = "Columbus": // Двухмерный массив

$streets["USA"]["Ohio"]["Columbus"] = "Harrison"; // Трехмерный массив

В качестве примера рассмотрим массив, в котором хранится информация о десертах и особенностях их приготовления. Обойтись одномерным массивом было бы довольно трудно, но двухмерный массив подходит как нельзя лучше:

$desserts = аrrау(

"Fruit Cup" => array (

"calories" => "low",

"served" -> "cold",

"preparation" => "10 minutes"

"Brownies" => array (

"calories" -> "high",

"served" => "piping hot",

"preparation" => "45 minutes"

После создания массива к его элементам можно обращаться по соответствующим ключам:

$desserts["Fruit Cup"]["preparation"] // возвращает "10 minutes"

$desserts["Brownies"]["calories"] // возвращает "high"

Присваивание значений элементам многомерных массивов выполняется так же, как и в одномерных массивах:

$desserts["Cake"]["calories"] = "too many";

// Присваивает свойству "calories" объекта "Cake" значение "too many"

Хотя в многомерных массивах появляются новые уровни логической организации данных, многомерные массивы создаются практически так же, как и одномерные. Впрочем, ссылки на многомерные массивы в строках требуют особого внимания; этой теме посвящен следующий раздел.

Ссылки на многомерные массивы

print "Brownies are good, but the calories content is ".

$desserts["Brownies"]["calories"];

print "Brownies are good, but the calories content is

{$desserts}";

Обратите внимание на отсутствие кавычек вокруг ключей. Также следует помнить, что между фигурными скобками и ссылкой не должно быть лишних пробелов. Если хотя бы одно из этих условий не выполняется, произойдет ошибка. Впрочем, годятся оба способа. Я рекомендую выбрать один формат и придерживаться его, чтобы ваши программы выглядели более последовательно. Если не использовать какой-либо из этих способов форматирования, ссылки на многомерные массивы будут интерпретироваться буквально, что наверняка приведет к непредвиденным результатам.

Поиск элементов массива

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

Функция i n_array () проверяет, присутствует ли в массиве заданный элемент. Если поиск окажется удачным, функция возвращает TRUE, в противном случае возвращается FALSE. Синтаксис функции in_array():

bool in_array(mixed элемент, array массив)

Эта функция особенно удобна тем, что вам не приходится в цикле перебирать весь массив в поисках нужного элемента. В следующем примере функция in_array() ищет элемент "Russian" в массиве $languages:

$languages = array("English", "Gaelic", "Spanish"):

$exists = in_array("Russian", $languages); // $exists присваивается FALSE

$exists = in_array("English", $languages): // $exists присваивается TRUE

Функция in_array() часто встречается в управляющих конструкциях, когда ее возвращаемое значение (TRUE/FALSE) используется для выбора одного из двух вариантов продолжения. В следующем примере функция in_array() используется для выбора одного из двух вариантов в условной команде if:

// Ввод данных пользователем

$language = "French"; $email = "[email protected]";

// Если язык присутствует в массиве

if (in_array($language. $languages)) :

// Подписать пользователя на бюллетень.

// Обратите внимание: в PHP нет стандартной функции с именем

// subscribe_user(). В данном примере эта функция просто имитирует

// процесс подписки.

subscribe_user($email, $language);

print "You are now subscribed to the $language edition of the newsletter.";

// Язык отсутствует в массиве

print "We"re sorry, but we don"t yet offer a $language edition of the newsletter".

Что происходит в этом примере? Допустим, переменные $language и $email содержат данные, введенные пользователем. Вы хотите убедиться в том, что указанный язык поддерживается вашей системой, и используете для этой цели функцию in_array(). Если название языка присутствует в массиве, пользователь подписывается на бюллетень и получает соответствующее сообщение. В противном случае программа сообщает, что на указанном языке бюллетень не распространяется. Конечно, в настоящей программе пользователь не должен гадать, какие языки поддерживаются вашей программой. Задача решается при помощи раскрывающегося списка -- эта тема подробно рассматривается в главе 10. Здесь этот пример всего лишь демонстрирует возможности работы с массивами.

Функция array_keys() возвращает массив, содержащий все ключи исходного массива, переданного в качестве параметра. Если при вызове передается дополнительный параметр искомый_элемент, возвращаются только ключи, которым соответствует заданное значение; в противном случае возвращаются все ключи массива. Синтаксис функции array_keys():

array array_keys (array массив [, mixed искомый_элемент])

Рассмотрим пример использования функции array_keys() для получения ключа заданного элемента:

$great_wines = array ("Australia" => "Clarendon Hills 96",

"France" => "Comte George de Vogue 97",

"Austria" => "Feiler Artinger 97");

$great_labels = array_keys($great_wines);

// $great_labels = array("Australia", "France", "Austria");

$great_labels = array_keys($great_wines, "Clarendon Hills 96");

// $great_labels = array("Australia");

Функция array_keys() позволяет очень легко получить все ключи ассоциативного массива -- например, в предыдущем случае ими были названия стран, в которых производятся различные сорта вин.

Функция array_values() возвращает массив, состоящий из всех значений исходного массива, переданного в качестве параметра. Синтаксис функции array_values():

array array_values(array массив)

Вернемся к предыдущему примеру, в котором функция array_keys() использовалась для получения всех значений ключей. На этот раз функция array_values() возвращает все значения, соответствующие ключам:

// $great_wines = array ("Australia" => "Clarendon Hills 96",

// "France" => "Comte George de Vogue 97",

// "Austria" => "Feiler Artinger 97");

$great_labels = array_values($great_wines);

// $great_labels = аrrау("Clarendon Hills 96",

// "Comte George de Vogue 97",

// "Feiler Artinger 97");

Функции array_keys() и array_values() дополняют друг друга, позволяяпри необходимости получить все составляющие той или иной стороны ассоциативного массива.

Добавление и удаление элементов

К счастью, в PHP при создании массива не нужно указывать максимальное количество элементов. Это увеличивает свободу действий при операциях с массивами, поскольку вам не приходится беспокоиться о случайном выходе за границы массива, если количество элементов превысит ожидаемый порог. В PHP существует несколько функций для увеличения размеров массива. Некоторые из них были созданы для удобства программистов, привыкших работать с различными типами очередей и стеков (FIFO, FILO и т. д.), что отражается в названиях функций (push, pop, shift и unshift). Но даже если вы не знаете, что такое «очередь» или «стек», не огорчайтесь -- в этих функциях нет ничего сложного.

Очередью (queue) называется структура данных, из которой элементы извлекаются в порядке поступления. Стеком (stack) называется структура данных, из которой элементы извлекаются в порядке, обратном порядку их поступления.

Функция array_push() присоединяет (то есть дописывает в конец массива) один или несколько новых элементов. Синтаксис функции array_push():

int array_push(array массив, mixed элемент [, ...])

Длина массива возрастает прямо пропорционально количеству его элементов. Это продемонстрировано в следующем примере:

$languages = array("Spanish", "English", "French");

array_push($languages, "Russian", "German", "Gaelic");

// $languages = array("Spanish", "English", "French",

// "Russian", "German", "Gaelic")

У функции array_push(), как и у многих стандартных функций PHP, существует «двойник» -- функция аrrау_рор(), предназначенная для извлечения элементов из массива. Главное различие между этими функциями заключается в том, что array_push() может добавлять несколько элементов одновременно, а аrrау_рор() удаляет элементы только по одному.

аrrау_рор()

Результат работы функции аrrау_рор() прямо противоположен array_push() -- эта функция извлекает (то есть удаляет) последний элемент из массива. Извлеченный элемент возвращается функцией. Синтаксис функции аrrау_рор():

аrrау_рор(аrrау массив)

При каждом выполнении аrrау_рор() размер массива уменьшается на 1. Рассмотрим пример:

$languages = array("Spanish", "English", "French",

"Russian", "German", "Gaelic");

$a_language = array_pop($languages): // $a_language = "Gaelic"

$a_language = array_pop($languages): // $a_language = "German"

// $languages = array ("Spanish", "English", "French", "Russian");

Функции array_push(), и array_pop() удобны тем, что с их помощью можно выполнять операции с элементами и управлять размером массива, не беспокоясь о неинициализированных или пустых элементах. Такое решение работает намного эффективнее, чем любые попытки управления этими факторами со стороны программиста.

Функция array_shift() аналогична аrrау_рор() с одним отличием: элемент удаляется из начала (левого края) массива. Все остальные элементы массива сдвигаются на одну позицию к началу массива. У функции array_shift() такой же синтаксис, как и у аггау_рор():

array_shift(array массив)

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

$languages = array("Spanish", "English", "French", "Russian");

$a_language = array_shift($languages); // $a_language = "Spanish";

// $languages = array("English", "French", "Russian");

Функция array_unshift() дополняет array_shift() -- новый элемент вставляется в начало массива, а остальные элементы сдвигаются на одну позицию вправо. Синтаксис команды array_unshift():

1nt array_unshift(array массив, mixed переменная1 [....переменная2])

При одном вызове функции можно добавить как один, так и несколько элементов, при этом размер массива возрастает пропорционально количеству добавленных элементов. Пример добавления нескольких элементов:

$ languages = array("French", "Italian", "Spanish");

array_unshift($languages, "Russian", "Swahili", "Chinese");

// $languages = array("Russian", "Swahili", "Chinese",

// "French", "Italian", "Spanish");

Функция array_pad() позволяет быстро увеличить массив до желаемого размера посредством его дополнения стандартными элементами. Синтаксис функции array_pad():

array arrap_pad(array массив, int размер, mixed значение):

Параметр размер определяет новую длину массива. Параметр значение задает стандартное значение, присваиваемое элементам во всех новых позициях массива. При использовании array_pad() необходимо учитывать некоторые обстоятельства:

Если размер положителен, массив дополняется справа, а если отрицателен -- слева.

Если абсолютное значение параметра размер меньше либо равно длине массива, никаких действий не выполняется.

Абсолютным значением (модулем) целого числа называется его значение без знака. Например, абсолютное значение чисел 5 и -5 равно 5.

Пример дополнения массива с конца:

$weights = array_pad($weights. 10, 100);

// Результат: $weights = array(1, 3, 5, 10, 15, 25, 50, 100, 100, 100);

Пример дополнения массива с начала:

$weights = array(1, 3, 5, 10, 15, 25, 50);

$weights = array_pad($weights, -10, 100);

// Результат: $weights = array(100, 100, 100, 1, 3, 5, 10, 15, 25, 50);

Неправильная попытка дополнения массива:

$weights = array(1, 3, 5, 10, 15, 25, 50);

$weights = array_pad($weigtits, 3, 100);

// Массив $weights не изменяется:

// $weights = array(1, 3, 5, 10, 15, 25, 50);

Перебор элементов

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

Функция reset() переводит внутренний указатель текущей позиции в массиве к первому элементу. Кроме того, она возвращает значение первого элемента. Синтаксис функции reset():

mixed reset (array массив)

Рассмотрим следующий массив:

$fruits = array("apple", "orange", "banana");

Допустим, указатель текущей позиции в этом массиве установлен на элемент "orange". Команда:

$a_fruit = reset($fruits);

вернет указатель в начало массива, то есть на элемент "apple", и вернет это значение, если результат вызова reset() используется в программе. Возможен и упрощенный вариант вызова:

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

Функция each() при каждом вызове выполняет две операции: она возвращает пару «ключ/значение», на которую ссылается указатель текущей позиции, и перемещает указатель к следующему элементу. Синтаксис функции each():

array each (array массив)

Для удобства each () возвращает ключ и значение в виде массива из четырех элементов; ключами этого массива являются 0, 1, value и key. Возвращаемый ключ ассоциируется с ключами 0 и key, а возвращаемое значение -- с ключами 1 и value.

В следующем примере функция each () возвращает элемент, находящийся в текущей позиции:

// Объявить массив из пяти элементов

$spices = array("parsley", "sage", "rosemary", "thyme", "pepper");

// Установить указатель на первый элемент массива

// Создать массив $a_sp1ce. состоящий из четырех элементов

$a_spice = each($spices);

В результате выполнения приведенного фрагмента массив $a_spice будет содержать следующие пары «ключ/значение»:

  • 0 => 0;
  • 1 => "parsley";
  • key => 0;
  • value => "parsley".

После этого строку "parsley" можно вывести любой из следующих команд:

print $a_spice: print $a_spice["value"];

Функция each() обычно используется в сочетании с list() в циклических конструкциях для перебора всех или некоторых элементов массива. При каждой итерации each() возвращает либо следующую пару «ключ/значение», либо логическую ложь при достижении последнего элемента массива. Вернемся к массиву $spices; чтобы вывести все элементы на экран, можно воспользоваться следующим сценарием:

// Сбросить указатель текущей позиции

// Перебрать пары "ключ/значение", ограничиваясь выводом значения

while (list ($key, $val) = each ($spices)) :

print "$val
"

Ниже приведен более интересный пример использования each() в сочетании с другими функциями, описанными в этой главе. Листинг 5.1 показывает, как при помощи этих функций вывести отформатированную таблицу стран и языков.

Листинг 5.1. Построение таблицы HTML по содержимому массива

// Объявить ассоциативный массив стран и языков $languages = array ("Country" => "Language",

"Spain" => "Spanish",

"USA" => "English",

"France" => "French",

"Russia" => "Russian");

// Начать новую таблицу

print "

";

// Переместить указатель к позиции первого элемента

$hdl = key ($languages);

Shd2 = $languages[$hd1];

// Вывести первый ключ и элемент в виде заголовков таблицы

print "

";

next($languages);

// Выводить строки таблицы с ключами и элементами массива

while (list ($ctry,$lang) = each ($languages)) :

print "

";

// Завершить таблицу print "

$hd1$hd2
Sctry$lang
";

В результате выполнения этого кода будет построена следующая таблица HTML.

Country

Language

Spain Spanish
USA English
France French
Russia Russian

Этот пример дает представление о самой сильной стороне PHP -- возможности объединения динамического кода с HTML для получения наглядного, отформатированного представления прочитанных данных.

Функция end() перемещает указатель к позиции последнего элемента массива. Синтаксис функции end():

end (array массив)

Функция next () смещает указатель на одну позицию вперед, после чего возвращает элемент, находящийся в новой позиции. Если в результате смещения

указатель выйдет за пределы массива, next () возвращает ложное значение. Синтаксис функции next ():

mixed next (array массив)

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

Функция prev() аналогична next () за одним исключением: указатель смещается на одну позицию к началу массива, после чего возвращается элемент, находящийся в новой позиции. Если в результате смещения указатель окажется перед первым элементом массива, prev() вернет ложное значение. Синтаксис функции prev():

mixed prev (array массив)

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

Функция array_walk() позволяет применить функцию к нескольким (а возможно, всем) элементам массива. Синтаксис функции array_walk():

int array_walk(array массив, string имя_функции [, mixed данные])

Функция, заданная параметром имя_функции, может использоваться для различных целей -- например, для поиска элементов с определенными характеристиками или модификации содержимого массива. В ассоциативных массивах функция имя_функции должна получать минимум два параметра -- элемент массива и ключ. Если указан необязательный третий параметр данные, он становится третьим параметром. В следующем примере функция array_walk() используется для удаления дубликатов из массива:

function delete_dupes($element) {

static $last=""; if ($element == $last)

unset($element); else . ""

$emails = array("[email protected]", "[email protected]", "[email protected]");

array_walk($emails,"delete_dupes");

// $emails = array("[email protected]", "[email protected]");

Функция array_reverse() позволяет легко перейти к противоположному порядку элементов, составляющих массив. Синтаксис функции array_reverse():

array array_reverse(array массив)

Рассмотрим пример использования функции array_reverse():

$us_wireproducers = array ("California", "Oregon", "New York". "Washington");

$us_wine_producers - array_reverse (Sus_wine_producers);

// $us_wine_producers = array ("Washington". "New York", "Oregon". "California");

При вызове array_reverse() для ассоциативного массива пары «ключ/значение» сохраняются, изменяется только порядок элементов массива.

Функция array_flip() меняет местами ключи и значения элементов массива. Синтаксис функции array_flip():

array array_flip(array массив)

В следующем примере функция array_flip() меняет местами все ключи и значения элементов:

$languages = array("Spain" => "Spanish", "France" => "French", "Italy" => "Italian");

$languages = array_flip($languages);

// $languages = array("Spanish" => "Spain", // "French" => "France", // "Italian" => "Italy");

Помните: функция array_flip() не изменяет порядок элементов массива. Для этой цели используется функция array_reverse().

Размер массива

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

$us_wine_producers = array ("Washington". "New York", "Oregon", "California");

for (Si = 0; Si < sizeof ($us_wine_producers); $i++) :

print "$us_wine_producers[$i]";

Поскольку массив $us_wine_producers индексируется целыми числами, мы можем воспользоваться циклом for для циклического увеличения переменной-счетчика ($i) и вывода каждого элемента в массиве.

Функция sizeof () возвращает количество элементов в массиве. Синтаксис функции sizeof ():

int sizeof (array массив)

Вероятно, функция sizeof () будет часто встречаться в ваших web-приложениях. Ниже приведен краткий пример ее использования (кстати, предыдущий пример тоже относится к числу стандартных применений sizeof ()):

$pasta = array("bowties", "angelhair", "rigatoni");

$pasta_size = sizeof($pasta);

// $pasta_size = 3

У функции sizeof () существует и другая, расширенная форма -- count () (см. ниже).

Функция count() выполняет ту же операцию, что и sizeof (), -- она возвращает количество значений, содержащихся в массиве. Синтаксис функции count ():

int count (mixed переменная)

Единственное различие между sizeof () и count() заключается в том, что в некоторых ситуациях count () возвращает дополнительную информацию:

  • если переменная существует и является массивом, count () возвращает количество элементов в массиве;
  • если переменная существует, но не является массивом, функция возвращает значение 1;
  • если переменная не существует, возвращается значение 0.

array_count_values()

Функция array_count_values() является разновидностью sizeof () и count (). Вместо общего количества элементов она подсчитывает количество экземпляров каждого значения в массиве. Синтаксис функции array_count_values():

array array_count_values(array массив):

В возвращаемом массиве ключами будут значения исходного массива, а значениями -- их частоты:

$states = аrrау("ОН", "ОК", "СА", "РА", "ОН", "ОН", "РА", "АК");

$state_freq = array_count_values($states);

Массив $state_freq заполняется следующими ассоциативными парами «ключ/значение»:

$state_freq = аrrау("ОН" => 3, "ОК" => 1, "СА" => 1, "РА" => 2, "АК" => 1);

Сортировка массивов

Сортировка занимает важное место в программировании и часто встречается на практике в таких Интернет-приложениях, как коммерческие сайты (сортировка категорий товаров в алфавитном порядке, сортировка цен) или поисковые системы (сортировка программ по количеству загрузок). В PHP существует девять стандартных функций сортировки (табл. 5.1), причем каждая функция сортирует массив особым образом.

Таблица 5.1. Функции сортировки

Сортировка

Обратный порядок

Сохранение пар «ключ/значение»

Значение

Значение

Значение

Значение

Значение

Значение

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

Сортировка элементов массива не ограничивается стандартными критериями, поскольку три функции (usort(), uasort() и uksort()) позволяют задать пользовательский критерий и отсортировать информацию произвольным образом.

Простейшая функция sort() сортирует элементы массива по возрастанию (от меньших к большим). Синтаксис функции sort ():

void sort (array массив)

Нечисловые элементы сортируются в алфавитном порядке в соответствии с ASCII-кодами. Следующий пример демонстрирует применение функции sort() при сортировке:

// Создать массив городов.

// Отсортировать города по возрастанию

// Перебрать содержимое массива и вывести все пары "ключ/значение".

for (reset($cities); $key = key ($cities); next ($cities)):

print("cities[$key] = $cities[$key]
";

Этот фрагмент выводит следующий результат:

cities = Aprilia

cities = Nettuno

cities = Venezia

Как видите, массив $cities сортируется в алфавитном порядке. Одна из разновидностей этого способа сортировки реализована в функции asort(), описанной ниже.

Функция rsort () работает точно так же, как функция sort (), за одним исключением: элементы массива сортируются в обратном порядке. Синтаксис функции rsort ():

void rsort (array массив)

Вернемся к массиву $cities из предыдущего примера:

$cities array("Aprilia", "Nettuno", "Roma", "Venezia", "Anzio");

cities = Venezia

cities = Nettuno

cities = Aprilia

Массив $cities также сортируется, но на этот раз в порядке, обратном алфавитному. Одна из разновидностей этого способа сортировки реализована в функции arsort(), описанной ниже.

Функция asort() работает почти так же, как упоминавшаяся выше функция sort(), однако она сохраняет исходную ассоциацию индексов с элементами независимо от нового порядка элементов. Синтаксис функции asort():

void asort(array массив)

Вернемся к массиву $cities:

$cities = array("Aprilia", "Nettuno", "Roma", "Venezia", "Anzio");

В результате сортировки массива $cities функцией rsort() элементы будут расположены в следующем порядке:

cities = Aprilia

cities = Nettuno

cities = Venezia

Обратите внимание на индексы и сравните их с приведенными в описании функции sort (). Именно в этом и состоит различие между двумя функциями.

Функция arsort () представляет собой разновидность asort(), которая сохраняет исходную ассоциацию индексов, но сортирует элементы в обратном порядке. Синтаксис функции arsort():

void arsort (array массив)

Воспользуемся функцией arsort() для сортировки массива $cities:

$cities = array("Aprilia", "Nettuno", "Roma", "Venezia", "Anzio");

arsort($cities);

cities = Venezia

cities[l] = Nettuno

cities = Aprilia

Обратите внимание на индексы и сравните их с приведенными в описании функции rsort(). Именно в этом и состоит различие между двумя функциями.

Функция ksort() сортирует массив по ключам, сохраняя исходные ассоциации ключей со значениями. Синтаксис функции ksort():

void ksort (array массив)

Для примера рассмотрим массив, слегка отличающийся от исходного массива

$wine_producers = array ("America" => "Napa Valley",

"Italy" => "Tuscany",

"Australia" => "Ruthgerlen",

"France" => "Loire",

"Chile" => "Rapel Valley");

В результате сортировки массива функцией ksort() элементы будут расположены в следующем порядке:

"America" => "Napa Valley"

"Australia" => "Ruthgerlen"

"Chile" => "Rapel Valley"

"France" => "Loire"

"Italy" => "Tuscany"

Сравните с результатами сортировки $wine_producers функцией sort ():

"America" => "Napa Valley"

"Australia" => "Tuscany"

"Chile" => "Ruthgerlen"

"France" => "Loire"

"Italy" => "Rapel Valley"

Более чем сомнительный результат!

Функция krsort() почти аналогична ksort(), однако ключи сортируются в обратном порядке. Синтаксис функции krsort():

void krsort (array $массив)

Рассмотрим сортировку массива $wi reproducers функцией krsort():

$wine_producers = array ("America" => "Napa Valley",

"Italy" => "Tuscany",

"Australia" => "Ruthgerlen",

"France" => "Loire".

"Chile" => "Rapel Valley");

krsort($wine_producers);

В результате сортировки элементы будут расположены в следующем порядке:

"Italy" => "Tuscany"

"France" => "Loire"

"Chile" => "Rapel Valley"

"Australia" => "Ruthgerlen"

"America" => "Napa Valley"

Вероятно, описанных выше функций сортировки будет вполне достаточно для большинства случаев. Тем не менее, в некоторых ситуациях может возникнуть необходимость в определении собственных критериев сортировки. В PHP такая возможность реализована в трех стандартных функциях: usort(), uasort() и uksort().

Функция usort() дает возможность отсортировать массив на основании критерия, определяемого программистом. Для этого usort() в качестве параметра передается имя функции, определяющей порядок сортировки. Синтаксис функции usort():

void usort (array массив, string имя_функции)

В параметре массив передается имя сортируемого массива, а в параметре имя_функции -- имя функции, на основании которой будет осуществляться сортировка. Допустим, у вас имеется длинный список греческих имен, которые необходимо выучить к предстоящему экзамену по истории. Вы хотите отсортировать слова по длине, чтобы начать с самых длинных, а затем учить короткие, когда вы уже устанете. Для сортировки массива по длине можно воспользоваться функцией usort().

Листинг 5.2. Определение критерия сортировки для функции usort()

$vocab = аrrау("Socrates", "Aristophanes", "Plato", "Aeschylus", "Thesmophoriazusae");

function compare_length($str1, $str2) {

// Получить длину двух следующих слов

$length1 = strlen($str1);

$length2 = strlen($str2);

// Определить, какая строка имеет меньшую длину

if ($length1 == $length2) :

elseif ($length1 < $length2) :

// Вызвать usort() с указанием функции compare_length()

// в качестве критерия сортировки

usort ($vocab, "compare_length") :

// Вывести отсортированный список

while (list ($key, $val) = each ($vocab)) {

echo "$val
";

В листинге 5.2 функция compare_length () определяет критерий сортировки массива. В данном случае это делается посредством сравнения длины передаваемых элементов. Функция-критерий должна получать два параметра, представляющих

сравниваемые элементы массива. Также обратите внимание на то, как эти элементы неявно передаются функции-критерию при вызове usort(), и на то, что все элементы автоматически сравниваются этой функцией.

Функции uasort() и uksort() представляют собой разновидности usort() с тем же синтаксисом. Функция uasort() сортирует массив по пользовательскому критерию с сохранением ассоциаций «ключ/значение». Функция uksort() также сортирует массив по пользовательскому критерию, однако сортируются не значения, а ключи.

Другие полезные функции

В этом разделе описаны некоторые функции, которые не принадлежат ни к какому конкретному разделу, но приносят несомненную пользу.

Функция arrayjnerge() сливает от 1 до N массивов, объединяя их в соответствии с порядком перечисления в параметрах. Синтаксис функции array_merge():

array array_merge(array массив1, array массив2, ..., array массивN]

Рассмотрим пример простого объединения массивов функцией arrayjnerge();

$arr_1 = array("strawberry", "grape", "lemon");

$arr_2 = array("banana", "cocoa", "lime");

$arr_3 = array("peach", "orange");

$arr_4 = array_merge ($arr2, $arr_1, $arr_3):

// $arr_4 = array("banana", "cocoa", "lime", "strawberry", "grape", "lemon", "peach", "orange");

Функция array_slice() возвращает часть массива, начальная и конечная позиция которой определяется смещением от начала и необязательным параметром длины. Синтаксис функции array_slice():

array array_slice(array массив, int смещение [, int длина])

  • Если смещение положительно, начальная позиция возвращаемого фрагмента отсчитывается от начала массива.
  • Если смещение отрицательно, начальная позиция возвращаемого фрагмента отсчитывается от конца массива.
  • Если длина не указана, в возвращаемый массив включаются все элементы от начальной позиции до конца массива.
  • Если указана положительная длина, возвращаемый фрагмент состоит из заданного количества элементов.
  • Если указана отрицательная длина, возвращаемый фрагмент заканчивается в заданном количестве элементов от конца массива.

Функция array_spl ice() отдаленно напоминает array_slice() -- она заменяет часть массива, определяемую начальной позицией и необязательной длиной, элементами необязательного параметра-массива. Синтаксис функции array_splice():

array_splice(array входной_массив, int смещение, , );

Значения параметров задаются по определенным правилам:

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

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

Удаление всех элементов с пятой позиции до конца массива:

$pasta = array_splice($pasta, 5);

Удаление пятого и шестого элементов:

$pasta = array_splice($pasta. 5, 2);

Замена пятого и шестого элементов новыми значениями:

$pasta = array_splice($pasta, 5, 2, array("element1", "element2"));

Удаление всех элементов, начиная с пятого, до третьего элемента с конца массива:

$pasta = array_splice($pasta, 5, -3);

Как видно из приведенных примеров, функция array_splice() обеспечивает гибкие возможности удаления элементов из массива при минимальном объеме кода.

Функция shuffle() сортирует элементы массива в случайном порядке. Синтаксис функции shuffle():

void shuffle(array массив);

Итоги

В этой главе рассматривались массивы и стандартные функции PHP для работы с массивами. В частности, рассматривались следующие темы:

  • создание индексируемых и ассоциативных массивов;
  • многомерные массивы;
  • отображение содержимого многомерных массивов;
  • поиск элементов;
  • добавление и удаление элементов;
  • размер массива;
  • сортировка;
  • другие полезные функции для работы с массивами.

Массивы являются очень удобными и универсальными средствами для работы с данными в web-приложениях. В примерах дальнейших глав массивы будут неоднократно использоваться для повышения эффективности и наглядности кода.

В главе 6 мы продолжим знакомиться с базовыми средствами PHP. На этот раз речь пойдет об объектно-ориентированных возможностях языка.

1. Что такое массив PHP?
2. Пример массива PHP?
3. Одномерный массив (векторный)
— индексный
— ассоциативный
4. Двумерный массив (массив в массиве, матрица)
5. Функции для работы с массивами (массив в массиве, матрица)

Начать данную тему хотелось бы с отречённых примеров. Допустим, мы рассматриваем какого-либо человека . У него есть имя, фамилия, адрес, телефон, пол, рост, цвет глаз и так далее. Информацию по всем этим пунктам можно отнести к массиву данных о человеке.

Массив может быть другого типа, без какой-либо конкретики по пунктам. Будет только тема. Допустим, это web-прграммирование . А в качестве элементов будут языки — HTML , CSS , JavaScript , PHP , MySQL . Всего 5 элементов.

Исходя из последнего примера предположим массив:

web-программирование
1. HTML
2. CSS
3. JavaScript
4. PHP
5. MySQL

Теперь смотрим на данный пример и анализируем основные понятия.

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

Массив в данном примере будет называться web-программирование .

У каждого элемента есть своё порядковое место, идентификатор.
Индекс (ключ массива) — либо порядковый номер, либо текстовое значение, по которому можно идентифицировать элемент.

Индексами в примере выше будут числовые значение от 1 до 5 . При обращении к индексу 2 мы увидим CSS.

Пример массива в PHP

Теперь давайте рассмотрим вышеуказанный пример в синтаксисе PHP, а не русского языка. Допустим массив будет называться короче — web . В квадратных скобках будет вставлять индекс.

Давайте рассмотрим простой пример массива, где в значении индексов будут числовые значения, а создавать массив будем так, словно переменным присваиваем значения.

$web=’HTML’;
$web=’CSS’;
$web=’JavaScript’;
$web=’PHP’;
$web=’MySQL’;

$web; // данная переменная содержит массив с 5-ю элементами

// чтобы вывести один из элементов массива достаточно указать индекс в массиве
echo $web; // выведет PHP

Одномерный массив

ИНДЕКСНЫЙ МАССИВ

Выше, с web-программированием, мы рассмотрели как раз пример одномерного массива.
Таким способом он создаётся редко. Он скорее наглядно показывает структуру массива. Чаще прибегают к другому методу.

$web=array(‘HTML’,’CSS’,’JavaScript’,’PHP’,’MySQL’);
echo $web; // выведет ‘HTML’
echo $web; // выведет ‘JavaScript’
echo $web; // выведет ‘PHP’

Если Вы хотите задать значения индекса, то их надо указать следующим образом. Знак => является указателем для присваивания индекса значению или наоборот значению индекс.

$web=array(1=>’HTML’,2=>’CSS’,3=>’JavaScript’,4=>’PHP’,5=>’MySQL’);
echo $web; // HTML
echo $web; // CSS
echo $web; // PHP
В примере отсчёт начинается с 1. Переменная с индексом 0 вследствие этого пустая.

В следующем примере мы не будем указывать индекс.

$day=’Понедельник’; // индекс 0
$day=’Вторник’; // 1
$day=’Среда’; // 2
$day=’Четверг’; // 3
$day=’Пятница’; // 4
Можно проследить, что происходит последовательное заполнение с нуля.

АССОЦИАТИВНЫЙ МАССИВ

Зачастую возникает потребность в создании буквенного индекса для элемента массива. Как я упоминал выше, такой индекс должен состоять из латинских букв, а имя должно быть заключено в кавычки. Рассмотрим на примере человека.

$user[‘nick’]=’Logic’;
$user[‘name’]=’Павел’;
$user[‘age’]=’25’;
$user[‘sex’]=’Мужской’;

$user; // переменная $user содержит массив с 4-мя элементами с буквенными индексами

// выводим элемент массива, указывая его буквенный индекс
echo $web[‘name’]; // выведет ‘Павел’
Как видите, всё достаточно просто. Только значение индекса закавычиваем.

Двумерный массив

Если Вы пропустили первую часть с Одномерным массивом, то настоятельно советую прочитать.
Если говорить проще, то это массив в массиве. То есть элементов большого массива является другой. Подобные массивы очень тормозят работу скрипта, загружая оперативную память, поэтому для быстрой обработки подобных групп данных созданы Базы Данных (Что такое База данных?), но о ней позже. Давайте разберём пример двумерного массива.

// массив с названиями Частей Света
$m = array(‘Европа’,’Азия’,’Африка’,’Америка’,’Австралия и Океания’);

// массив с названиями Стран
$s = array(‘Россия’,’Украина’,’Беларусь’,’Казахстан’);

// массив с названиями Столиц
$с = array(‘Москва’,’Киев’,’Минск’,’Астана’);

// создаём двумерный массив География
$geography = array($m, $s, $с);
?>
Во включенных массивах, как Вы обратили внимание, может быть разное количество элементов. Из части про одномерные массивы следовало, что у каждого элемента массива может быть индекс. Так давайте для каждого включённого массива присвоим своё значение.

Для этого расширим последнюю строчку и напишем её следующим образом.

$geography = array(‘Части Света’=>$m, ‘Страны’=>$s, ‘Столицы’=>$с);

Функции работы с массивами php

Foreach — циклическая функция для работы с массивами, в которой количество циклов равно количеству элементов массива.

Имеет следующий вид.

Код PHP

foreach (массив as $ключ=>$значение)
команды;
Ну и сразу пример работы

// создаём массив со знаменитыми IT
$names["Ритчи"] = "Деннис";
$names["Томпсон"] = "Кен";
$names["Гейтс"] = "Билл";
$names["Джобс"] = "Стив";

foreach ($names as $key => $value) {
echo "$value $key";
}
?>
На экран скрипт выведет

Деннис Ритчи
Кен Томпсон
Билл Гейтс
Стив Джобс
Count — функция, возвращающая количество элементов в массиве.

echo count($names); // в нашем примере с IT вернёт значение 4
Sort — функция, сортирующая элементы массива. Удобна в случае числовых значений индекса.
Arsort — функция, сортирующая элементы массива в обратном порядке.

sort($names); // сортирует по порядку. Удобно если в Индексе числа
arsort($names); // сортировать в обратном порядке. То есть по индексам элементы будут в порядке 3, 2, 1, 0
Unset — функция, удаляющая элемент массива.

unset($massiv); // удаление элемента массива с индексом 2
unset($massiv); // удаление массива целиком
Array_search — функция поиска в массиве.

Урок 7. Массивы в PHP

Имеет два аргумента. Проще говоря, имеет вил array_search(‘что’, где)

$animals=’dog’;
$animals=’cat’;
$animals=’bird’;
echo array_search(‘cat’,$animals); // выведет индекс элемента — цифру 2
Shuffle — функция, которая перемешивает ключи значений массива.

shuffle($animals); // выстроит элементы в случайном порядке
Спасибо за внимание!

Предыдущая статья
Урок 6. Циклы в PHPСледующая статья
Урок 8. Подключение файла в PHP. Include и require

Комментарии к статье (vk.com)

Создает пустой массив.

Вы можете вывести значения в массив позже, например:

На данный момент $ myArray содержит «дерево», «дом» и «собака». Каждая из приведенных выше команд добавляется к массиву, сохраняя элементы, которые уже были там.

Придя с других языков, этот способ добавления массива мне показался странным. Я ожидал сделать что-то вроде $ myArray + = «собака» или что-то еще …

или, может быть, метод «add ()», такой как коллекции Visual Basic. Но этот прямой синтаксис append является коротким и удобным.

Вы действительно должны использовать функцию unset () для удаления элементов:

… удалит «дом» из массива (массивы основаны на нулевом значении).

Основы работы с массивами в PHP

… уничтожит весь массив.

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

Вы можете назначать индексы самостоятельно, если хотите, и можете использовать любые цифры, которые вы хотите. Вы также можете присвоить номера индексов некоторым элементам, а не другим. Если вы это сделаете, PHP заполнит недостающие номера индексов, увеличиваясь с самого большого номера индекса, назначенного по мере его поступления.

Поэтому, если вы это сделаете:

… для элемента «собака» будет присвоен индексный номер 21. PHP не выполняет интеллектуального сопоставления шаблонов для поэтапного присвоения индексов, поэтому он не будет знать, что вам, возможно, захотелось присвоить индекс 30 «собаке» ». Вы можете использовать другие функции, чтобы указать шаблон приращения для массива. Я не буду вдаваться в это, но все это в PHP-документах.

В некоторых других языках (например, AS3) было отмечено, что инициализация нового массива выполняется быстрее, если сделать это как а не для целей создания объекта и создания экземпляра. Интересно, существуют ли какие-либо эквивалентности в PHP?

Массивы в PHP. Работа с массивами в PHP.

В данной статье рассматривается работа с массивами в PHP (основы). Массивы в PHP – это тип данных, который позволяет сохранять несколько переменных в одной.

Вот один простой пример:

В приведенном выше примере $products – это массив, в котором мы сохранили несколько различных продуктов. Далее мы вывели все эти продукты, обращаясь к каждому через “индексы” (ключи) : 0, 1 и 2.

Конечно, отдельные значения можно хранить и в отдельных переменных, например, так:

Это, конечно, хорошо, но давайте представим, что нам потребовалось вдруг перебрать все эти элементы. Как тут быть? Писать код под каждую переменную? Это долго и неудобно. Решение – использование массивов.
Используя циклы мы можем на каждой итерации (шаге) получить доступ к очередному элементу, благодаря индексам (ключам).

Создание массива в PHP.

В php не требуется делать объявление массива. Создать массив мы можем, используя функцию array():

В данном случае мы создали пустой массив. Если же мы в скобках укажем несколько значений через запятую, то мы заполним данный массив несколькими элементами:

Виды массивов.

1. ”Индексируемые” массивы или “автомассивы”. Примеры такого массива мы уже приводили выше. Особенностью данных массивов является то, что они имеют числовые индексы, которые создаются автоматически (“на лету”). Нумерация элементов начинается с 0.

Как определить длину (размер) индексируемого массива.

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

Используем функцию count() :

Перебор элементов. Перебрать все элементы автомассива можно с помощью конструкции for или foreach :

Чтобы добавить новый элемент в массив (осуществить запись в массив), нам достаточно выполнить следующую строку:

Перебор всех элементов ассоциативного массива осуществляется следующим образом:

3. Многомерные массивы содержат в качестве элементов другие массивы:

Мы можем создать и трехмерный массив:

вывод массива в PHP. Вывести любой массив можно с помощью функции print_r() , например:

При этом при удалении элемента индексы других элементов остаются неизменными.

Функции для работы с массивами:

Сортировка массивов
array_search – поиск значения в массиве



Рекомендуем почитать

Наверх