Функции для работы с массивами 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?

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

Массив может быть другого типа, без какой-либо конкретики по пунктам. Будет только тема. Допустим, это 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 - функция поиска в массиве. Имеет два аргумента. Проще говоря, имеет вил array_search("что", где)

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

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

Допустим у вас есть представление о массиве PHP . Работать с массивами без встроенных функций трудно. Можно описать функцию для определённой задачи. Вы можете потратить несколько часов на написание своих функций. Это плохой путь. Я предлагаю вам прочитать мануал на сайте php.net. Я написал несколько функций и через некоторое время обнаружил аналоги на php.net. Например поиск элемента в массиве легко сделает функция array_search()

//array_search() $array = array("name" => "Egor", "site" => "training.web", "description" => "обучение php"); $key = array_search("training.web", $array); echo $key; // site

Функция in_array() возвращает TRUE если элемент найден в массиве . Массив можно хаотично перемешать при помощи функции shuffle(). Если вам нужно вывести цитаты на сайте, то применяйте эту функцию. Часто применяется реверс массива. Функция array_reverse() поможет вам сделать реверс элементов в массиве.

//in_array() $lang = array("PHP", "RUBY", "HTML", "CSS"); if (in_array("PHP", $lang)) { echo "Нашел PHP"; } //shuffle() $numbers = range(1, 10); var_dump($numbers); //array(10) shuffle($numbers); print_r($numbers); //Array ( => 8 => 4 => 9 => 6 => 5 // => 7 => 1 => 2 => 10 => 3) $numbers = range(1, 10); //array_reverse() $numbers = array_reverse($numbers); print_r($numbers); //Array ( => 10 => 9 => 8 => 7 => 6 // => 5 => 4 => 3 => 2 => 1)

Самая часто используемая функция - это count(). Она подсчитывает количество элементов массива. Функция sizeof() считается устаревшей. Иногда нужно подсчитать количество одинаковых элементов в массиве. Поможет функция array_count_values(). Вы можете наполнить массив множеством элементов, а потом применить эту функцию. Если описать функцию, то вы потратите массу времени. Очень часто применяют отладочную функцию print_r(). Он выводит весь массив, каким бы большим и сложным он не был. Для того чтобы вытащить последний элемент массива, примените такой код: $numbers[ count($numbers) - 1 ]. Вы также можете применить функцию end().

//count() $numbers = range(1, 10); $count = count($numbers); for($i=0; $i 3 => 2 => 1)

Очень часто применяют функцию implode(). Она объединяет элементы массива в строку . Если вы используете свой разделитель, то вы можете разбить массив и собрать элементы в строку. Между элементами массива можно поставить правый слеш "/". Вы можете добавить в конец url-адреса такую строку. Если у вас есть строка, похожая на url-адрес, то для разбивки строки используйте функцию explode() . Читайте о функции explode в статье как разбить строку в массив explode() PHP . По разделителю строковые элементы строки превращаются в элементы массива. Одним словом, строковый тип дынных превращается в массив.

Ru/egor/lesons //explode() $url = "trainingweb.ru/egor/lesons"; $arr = explode("/", $url); print_r($arr); //Array ( => trainingweb.ru => egor => lesons)

Мне очень нравится функция array_map(). Она применяет callback-функцию ко всем элементам массива. Вы пишите функцию, а потом применяете её в функции array_map(). Вы можете прибавить единицу к каждому элементу массива. Вы можете перебирать массив таким образом или очищать массив от ненужных элементов.

//array_map() $numbers = range(1, 10); function plusOne($num) { $num += 1; return $num; } $arr = array_map("plusOne", $numbers); print_r($arr); //Array ( => 2 => 3 => 4 => 5 => 6 // => 7 => 8 => 9 => 10 => 11)

Бывает так, что нужно привести строку к массиву. Это делается просто при помощи функции (array). Я сделаю 2 строковые переменные. Затем переменные превращу в массивы и объединю массивы в один массив. Для объединения массивов в один общий массив подойдёт функция array_merge(). Вы можете массу массивов объединить в один массив: array_merge($arr1, $arr2, $arr3, ...,).

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

Для начала разберём простейшую функцию, которая проверяет находится ли элемент в массиве. Функция называется in_array() :

$arr = array("Num", "Str", "Int");
if (in_array("Str", $arr)) echo "Элемент найден";
?>

Как видно из примера, данная функция проверяет наличие первого параметра среди значений массива, заданного вторым параметром. И возвращает true , если элемент найден, либо false , если не был найден. Особо продвинутые спросят: "А как же быть с такими вещами, как 0 и false , ведь это разные значения, но PHP их считает одинаковыми?". Для этого в функции in_array() существует ещё третий параметр, необязательный, который если имеет значение true , то функция сверяет не только значения, но и типы:

$arr = array(0, "Str", "Int");
if (in_array(false, $arr, true)) echo "Элемент найден";
else echo "Элемент не найден";
?>

Ещё одна очень полезная функция - array_unique() , которая принимает массив и возвращает массив без дублирующихся значений:

$arr = array(3, 5, "Val", 3, "Val", 7);
$arr_uniq = array_unique($arr);
print_r($arr_uniq);
?>

Как можно заметить, запустив скрипт, в получившемся массиве нет повторяющихся значений.

Очень важные функции - это функции извлечения части массива из исходного (аналог функции substr() , только она для строк):

$arr_2 = array_slice($arr, 3);
print_r($arr_2);
?>

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

$arr = array(12, 10, 15, "Name", "Some", -0.5);
$arr_2 = array_slice($arr, 3, 2);
print_r($arr_2);
?>

В результате, Вы увидите: "Array ( => Name => Some) ".

Теперь перейдём к последней группе функций - функциям сортировки массивов . Но для начала напоминаю разницу между списками и ассоциативными массивами. Список - это массив, у которого индексами являются числа, которые упорядочены по возрастанию, начиная с 0 . А ассоциативный массив - это массив, у которого индексами является, вообще говоря, строки, которые называются ключами. Почему это так важно при сортировке? Если Вы сортируете список, то Вам совершенно не важно, чтобы сохранялась связка: "ключ - значение ", так как индексы не служат для идентификации значения, а служат лишь для обращения к нему. А в ассоциативном массиве первостепенное значение имеет именно связка: "ключ-значение ", поэтому необходимо, чтобы при сортировке она сохранялась.

Давайте начнём с простого: сортировки списков. Для этого существуют функции sort() и rsort() . Первая функция сортирует массив по возрастанию, а вторая по убыванию:

$arr = array(15, 12, "String", 40, -2, 0, 12);
sort($arr);
print_r($arr);
echo "
";
rsort($arr);
print_r($arr);
?>

Думаю, что здесь всё понятно.

Теперь перейдём к функциям сортировки ассоциативных массивов : asort() и arsort() . Делают они всё тоже самое, но связь "ключ-значение " сохраняется:

$arr = array("Name" => "Tommy", "Age" => "34", "Level" => "15");
asort($arr);
print_r($arr);
echo "
";
arsort($arr);
print_r($arr);
?>

Теперь давайте рассмотрим функции сортировки по ключам ассоциативных массивов : ksort() и krsort() :

$arr = array("Name" => "Tommy", "Age" => "34", "Level" => "15");
ksort($arr);
print_r($arr);
echo "
";
krsort($arr);
print_r($arr);
?>

Уверен, что здесь всё прозрачно. А если что-то непонятно, то запустите скрипт, и проанализируйте результат.

И, напоследок, рассмотрим функции пользовательской сортировки : uasort() и uksort() . Обе функции принимают два параметра: массив и пользовательскую функцию сортировки . Функция сортирует массив по значениям, а функция uksort() сортирует массив по ключам. В качестве примера рассмотрим такой скрипт:

function cmp($x, $y) {
if ($x == $y) return 0;
if ($x == 1) return 1;
if ($y == 1) return -1;
if ($x > $y) return 1;
else return -1;
}
$arr = array("A" => 1, "C" => 3, "B" => 2);
uasort($arr, "cmp");
print_r($arr);
echo "
";
uksort($arr, "cmp");
print_r($arr);
?>

Как видите, мы написали свои правила сортировки, по которым число "1 " всегда больше любого другого значения. Если ни одно из чисел не является "1 ", то тогда сравниваем по обычным правилам. Таким образом, PHP сортирует наш массив по правилам, описанным в функции сравнения, название которой мы передали в функциях uasort() и uksort() .

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

Заставила меня обратить еще раз особое внимание на массивы.

Попробую сделать небольшой обзор по общению с массивами.

Итак. Массивы бывают обыкновенные и ассоциативные. Отличаются они только тем, что в обыкновенных массивах ключами служат целые числа, а в ассоциативных -- сочетания различных знаков.

$personal; // обращение к ячейке обыкновенного массива;

$personal["vova"]; // обращение к ячейке ассоциативного массива;

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

Массивы в PHP могут иметь любую вложенность измерение, но традиционно используются массивы одно- и двухмерные.

Массив может хранить любую информацию -- от простых чисел до сложных структур.

Объявить массив просто:

var $array1 = array(); // пустой массив

Var $array2 = array("vova", "nina", "olga"); // массив с данными

Так объявляют обыкновенный массив. Если же нам надо объявить ассоциативный массив с данными или массив, в котором данные "разбросаны" в далекие друг от друга ячейки, нужно указывать кроме значений ячеек, еще и их ключ (название). Ключ от данных отделяется сочетанием "=>".

var $array3 = array(0 => "vova", 11 => "nina", 543 => "olga");
var $array4 = array("sorokin" => "vova", "bulgakova" => "nina", "zhezlova" => "olga");

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

Чтобы узнать имя Сорокина, нам теперь достаточно спросить массив:

echo $array4["sorokin"];

В общем, это все, что важно знать об объявлении массивов.

Теперь поговорим о том, что мы можем с массивами делать. Разумеется, я не буду останавливаться на том, что в массивах можно хранить данные: читать их, удалять и заменять на новые.

Как проверить существование массива?

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

if(!isset($array_name)) echo "Нет такого массива!";

Как уничтожить массив?

unset($array_name);

или одну из его ячеек:

unset($array_name[n]);

Как проще всего распечатать содержимое массива?

echo implode(",",$array_name);

Где implode -- функция объединения с разделителем.

В данном случае, массив выступает в роли списка переменных.

Если нужно создать массив для одной операции?

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

$str="один,два,три";
$list($one, $two,$three)=explode(",",$srt);

Теперь каждая переменная содержит свое слово.

И распечатать:

echo implode(",",list($one, $two, $three));

Можно, конечно, и просто перебрать содержимое массива в цикле:

while($i

Как изменить размеры массива?

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

Но если вы задумали обрезать массив или вырезать из массива определенный кусок, можете воспользоваться функцией array_splice() .

Как выполнить операцию над каждым элементом массива?

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

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

Например,

function print_arr($str)
{
echo $str,"
\n";
$str.=" - done";
}

Распечатает на экране все элементы массива $arr;

Если же вам необходимо произвести преобразование содержимого ячеек и получившиеся данные записать обратно в ячейки, вам придется указать это явно -- дать ссылку на реальный экземпляр ячейки в памяти. Как и в языке C, в PHP это делается добавлением перед переменной амперсанта "&".

Скажем, если бы на надо было не просто распечатать содержимое ячеек, как в приведенном примере, а добавить слово "done" после каждого слова и снова распечатать содержимое массива, то пример выглядел бы так:

function print_arr(&$str)
{
echo $str,"
\n";
$str.=" - done";
}

$arr=array("one","two","three");

Array_walk($arr,"print_arr");
echo "

\n";
array_walk($arr,"print_arr");

А результат так:

one two three one - done two - done three - done

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

Как удалить из массива дубликаты?

Очень просто. Для этого существует функция array_unique , которая вернет вам массив, сократив его до массива, не содержащего повторения.

Как сравнить два массива?

И тут PHP нас заставляет поскучать, ибо функция array_dif все сделает за нас.

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

$result = array_diff ($array1, $array2,$array3,:);

Как объединить массивы?

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

Честно говоря, одномерные массивы в PHP можно "складывать" обычным плюсом:

$array3=$array1+$array2;

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

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

* * *
На этом сегодня остановимся, завтра продолжим. Поиграйтесь с массивами, это действительно интересно!

Данный выпуск был подготовлен при подглядывании в книгу Хьюгса Стерлинга "