KnigaRead.com/

Нина Савельева - Курс "Язык программирования PHP"

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Нина Савельева, "Курс "Язык программирования PHP"" бесплатно, без регистрации.
Перейти на страницу:

<?

$del_items = array("langs" => array(

"10"=>"Python", "12"=>"Lisp"),

"other"=>"Информатика");

echo count($del_items) . "<br>";

// выведет 2

echo count($del_items,COUNT_RECURSIVE);

// выведет 4

?>



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


Функция in_array


in_array("искомое значение","массив",

["ограничение на тип"]);


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


Например, имеется массив не изученных нами языков программирования. Мы хотим узнать, содержится ли в этом массиве язык PHP. Напишем следующую программу:


<?php

$langs = array("Lisp","Python","Java",

"PHP","Perl");

if (in_array("PHP",$langs))

echo "Надо бы изучить PHP<br>";

// выведет сообщение "Надо бы изучить PHP"

if (in_array("php",$langs))

echo "Надо бы изучить php<br>";

// ничего не выведет, поскольку в массиве

// есть строка "PHP", а не "php"

?>



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


Например:


<?php

$langs = array("Lisp","Python",array("PHP","Java"),"Perl");

if (in_array(array("PHP","Java"),$langs))

echo "Надо бы изучить PHP и Java<br>";

?>



Функция array_search


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


array_search("искомое значение","массив",

["ограничение на тип"]);


Сравнение строк чувствительно к регистру, а если указан опциональный аргумент, то сравниваются еще и типы значений. До PHP 4.2.0, если искомое значение не было найдено, эта функция возвращала ошибку или пустое значение NULL.


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


<?php

$langs = array("Lisp","Python","Java",

"PHP","Perl");

if (!array_search("PHP",$langs))

echo "Надо бы изучить PHP<br>";

else {

$k = array_search("PHP",$langs);

echo "PHP я изучила $k – м";

}

?>



В результате мы получим строчку:


PHP я изучила 3 – м


Очевидно, что эта функция более функциональна, чем in_array, поскольку мы не только получаем информацию о том, что искомый элемент в массиве есть, но и узнаем, где именно в массиве он находится. А что будет, если искомых элементов в массиве несколько? В таком случае функция array_search() вернет ключ первого из найденных элементов. Чтобы получить ключи всех элементов, нужно воспользоваться функцией array_keys().


Функция array_keys


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


array_keys ("массив"

[,"значение для поиска"])


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


Пример 7.5. Мы записали массив языков, которые изучили. Список был длинным, и некоторые языки были записаны несколько раз. У нас возникло подозрение, что один из таких языков – Lisp. Давайте это проверим:


<?php

$langs =

array("Lisp","Python","Java","PHP",

"Perl","Lisp");

$lisp_keys = array_keys($langs,"Lisp");

echo "Lisp входит в массив ".

count($lisp_keys) ." раза:<br>";

foreach ($lisp_keys as $val){

echo "под номером $val <br>";

}

?>



В результате получим:


Lisp входит в массив 2 раза:

под номером 0

под номером 5



Функция array_keys(), как и две предыдущие, зависит от регистра, т.е. элементов LISP в массиве она не обнаружит. array_keys() появилась только в PHP4. В PHP3 для реализации ее функциональности нужно придумывать свою функцию.


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


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


Функция array_unique


Функция array_unique(массив) удаляет повторяющиеся значения из массива и возвращает новый массив. Таким образом, вместо нескольких одинаковых значений и их ключей мы имеем одно значение. Какой у него будет ключ? Как из нескольких ключей одинаковых элементов выбирается тот, который будет сохранен в новом массиве? Происходит следующее. Все элементы массива преобразуются в строки и сортируются. Затем обработчик запоминает первый ключ для каждого значения, а остальные ключи игнорирует.


Попробуем избавиться от повторяющихся языков в списке изученных.


<?php

$langs =

array("Lisp","Java","Python","Java",

"PHP","Perl","Lisp");

print_r(array_unique($langs));

?>



Получим следующее:


Array ( [0] => Lisp [1] => Java [2]

=> Python [4] => PHP [5] => Perl )



Далее рассмотрим задачу сортировки массива.


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


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


Функция sort


Функция sort имеет следующий синтаксис


sort (массив [, флаги])


и сортирует массив, т.е. упорядочивает его значения по возрастанию. Эта функция удаляет все существовавшие в массиве ключи, заменяя их числовыми индексами, соответствующими новому порядку элементов. В случае успешного завершения работы она возвращает true, иначе – false.


Пример 7.6. Пусть у нас есть два массива: цены товаров – их названия и, наоборот, названия товаров – их цены. Упорядочим эти массивы по возрастанию:


$items = array(10 => "хлеб", 20 => "молоко",

30 => "бутерброд");

sort($items);

// строки сортируются в алфавитном

// порядке, ключи теряются

print_r($items);

$rev_items = array("хлеб" => 10,

"бутерброд" => 30, "молоко" => 20);

sort($rev_items);

// числа сортируются по возрастанию,

// ключи теряются

print_r($rev_items);

?>



Получим:


Array ( [0] => бутерброд [1] =>

молоко [2] => хлеб )

Array ( [0] => 10 [1] => 20 [2] => 30 )



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


- SORT_REGULAR – сравнивать элементы массива обычным образом;


- SORT_NUMERIC – сравнивать элементы массива как числа;


- SORT_STRING – сравнивать элементы массива как строки.


Функции asort, rsort, arsort


Если требуется сохранять индексы элементов массива после сортировки, то нужно использовать функцию asort (массив [, флаги]). Если необходимо отсортировать массив в обратном порядке, т.е. от наибольшего значения к наименьшему, то можно задействовать функцию rsort (массив [, флаги]). А если при этом нужно еще и сохранить значения ключей, то следует использовать функцию arsort(массив [, флаги]). Как вы, наверное, заметили синтаксис у этих функций абсолютно такой же, как у функции sort. Соответственно и значения флагов могут быть такими же, как у sort: SORT_REGULAR, SORT_NUMERIC, SORT_STRING. Кстати говоря, флаг SORT_NUMERIC появился только в PHP4.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*