От автора: осень, зима, вот и потянуло меня на лирику да романтику. Вы думаете, программирование совсем не романтическое ремесло? Ошибаетесь! Взять хотя бы массивы. Их ветвление очень похожи на повороты лабиринтов, в которых незнающий человек может застрять навеки! Сегодня мы узнаем, как происходит в PHP поиск по массивам.
Массивы бывают разные…
Надеюсь, с массивами вы немного знакомы. Хотя не факт, поэтому пару «зарисовок» на тему :). Массивы бывают:
Простые – состоят из пары «ключ-значение», где в качестве ключа выступает значение индекса. Любой нумерованный список можно рассматривать как простой массив, в котором номер строки является индексом, а его содержание — значением.
Ассоциативные – в них ключами могут выступать не только числа, но и строки. Чаще всего ключ и значение логически (ассоциативно) связаны между собой. Пример такого массива я пока не придумал :).
Также массивы могут быть:
Одномерными – используется один индекс.
Многомерными – используется два и более индексов.
Получается, что массивы являются одной из самых простых разновидностей структурированного представления данных. Вся информация в них упорядочена с помощью ключей, а информация записана в значения элементов. Но как происходит поиск ключа в массиве PHP?
Спасибо функциям!
Большая и огромная человеческая благодарность всем функциям PHP, которые облегчают работу с массивами! Если бы их не было (функций), то сортировка данных превратилась бы в настоящую «пытку» головного мозга!
Ну, может я и приврал чуток :). Но объем кода без применения этих функций точно бы возрос в разы. Опять не верите? Тогда давайте докажу на примере.
У нас есть массив, состоящий из сотрудников. Нам нужно «поймать» Вольдемарыча. Для этого следует осуществить поиск элемента в массиве PHP по значению. Вот как будет выглядеть реализация данной задачи без применения специальных функций:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $fio = array("Петрович", "Вольдемарыч", "Сансаныч"); $n = count($fio); $a=1; for($t = 0; $t < $n; $t++){ echo $fio[$t]. "<br>"; if($t==$a){ echo "<b>Попался, Вольдемарыч </b>"."<br>"; } } ?> |
Получается, чтобы поймать Вольдемарыча, нам потребовалось запустить 10 строк кода. Теперь попробуем сделать то же самое с помощью функции array_search(). В качестве аргументов она принимает значение элемента и сам массив, а возвращает индекс (ключ) искомого. В нашем случае она возвратит ключ элемента с содержимым «Вольдемарыч».
1 2 3 4 5 |
<?php $fio = array("Петрович", "Вольдемарыч", "Сансаныч"); $result=array_search("Вольдемарыч",$fio); echo $result; ?> |
Вот результат PHP поиска в массиве по значению:
Но почему функция вернула единицу, если Вольдемарыч у нас проходит «по списку» под номером два? Забыл сказать, что индексация массивов начинается не с 1, а с 0. Значит все верно.
«Многомерим» наш массив
В двух предыдущих примерах мы использовали одномерный массив, в котором для идентификации используется только один индекс. Но при работе со структурированными данными все элементы коллекций, списков, стеков и других «разновидностей» чаще всего взаимосвязаны между собой по нескольким «признакам».
Чтобы было понятнее, я предлагаю вспомнить о типах взаимосвязи между таблицами в одной базе данных. Например, существует таблица, в которую заносятся ФИО рабочих предприятия. При этом некоторые ее столбцы взаимосвязаны с другой таблицей, где фиксируется посещаемость (рабочий табель). А с этой таблицей может быть связана другая, куда (на основе табеля) вычисляется и заносятся сроки следующего (ежегодного) отпуска… То есть один элемент идентифицируется не по одному ключу, а по нескольким.
Получается, что PHP поиск в многомерном массиве осуществляется по двум и более индексам. Чтобы продемонстрировать это, нам придется немного подправить существующий вариант «структуры».
1 2 3 4 5 |
<?php $fio[1] = array("name"=>"Петрович", "vozrast"=>"48 лет", "profess"=>"слесарь"); $fio[2] = array("name"=>"Вольдемарыч", "vozrast"=>"29 лет", "profess"=>"сантехник"); $fio[3] = array("name"=>"Сансаныч", "vozrast"=>"38 лет", "profess"=>"токарь"); ?> |
Теперь посмотрим, как происходит PHP поиск ключа в многомерном массиве. Для этого нам пригодится предыдущая функция:
1 2 3 4 5 6 7 |
<?php $fio[1] = array("name"=>"Петрович", "vozrast"=>"48 лет", "profess"=>"слесарь"); $fio[2] = array("name"=>"Вольдемарыч", "vozrast"=>"29 лет", "profess"=>"сантехник"); $fio[3] = array("name"=>"Сансаныч", "vozrast"=>"38 лет", "profess"=>"токарь"); $result=array_search(array("name"=>"Вольдемарыч", "vozrast"=>"29 лет", "profess"=>"сантехник"),$fio); echo $result; ?> |
Но иногда при поиске значения в многомерном массиве PHP нужно узнать, есть такой элемента или нет. Для этого понадобится другая функция — in_array(). Она также в качестве параметров принимает значение элемента и массив, но возвращает значение типа bool.
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $fio[1] = array("name"=>"Петрович", "vozrast"=>"48 лет", "profess"=>"слесарь"); $fio[2] = array("name"=>"Вольдемарыч", "vozrast"=>"29 лет", "profess"=>"сантехник"); $fio[3] = array("name"=>"Сансаныч", "vozrast"=>"38 лет", "profess"=>"токарь"); if (in_array(array("name"=>"Вольдемарыч", "vozrast"=>"29 лет", "profess"=>"сантехник"),$fio)) { echo "Вольдемарыч нашелся!"; } else{ echo "Вольдемарыч сбежал!"; } ?> |
Двое из ларца…
Поиск совпадений в массиве PHP – тоже вещь нужная! Но для ее реализации придется создавать собственное решение, а не надеяться на возможности языка. С многомерностью на сегодня покончено. Для демонстрации следующего примера возвращаемся к первоначальному варианту массива.
1 2 3 4 5 6 7 8 9 10 |
<?php $fio = array("Петрович", "Вольдемарыч", "Сансаныч", "Вольдемарыч"); $n = count($fio); for($t = 0; $t < $n; $t++){ echo $fio[$t]. "<br>"; if($fio[$t]==$fio[1]){ echo "<b>Совпадение в $t элементе</b>"."<br>"; } } ?> |
С помощью этого примера мы провели поиск количества одинаковых значений в массиве PHP. Для этого в цикле if мы сравнивали значения всех элементов с заданным. Оказалось, что Вольдемарыч встречается в массиве два раза. Сегодня нам снова удалось не заплутать в дебрях PHP и узнать много нового. Например, кто такой Вольдемарыч :).