PHP: Поиск в массиве

Author Автор: Роман Чернышов    Опубликовано: 12 июня 2013

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

Функции для поиска в массиве:
array_search — служит для поиска значения в массиве. В случае удачи она возвращает ключ искомого значения, если ничего не найдено — возвращает FALSE. До версии PHP 4.2.0, array_search() при неудаче возвращала NULL, а не FALSE.

Синтаксис функции mixed array_search ( mixed needle, array haystack [, bool strict] ).

$array = array(12, 17, 22, 79);
 
$key = array_search(17, $array, true); // $key = 1;
$key = array_search("17", $array); // $key = 1;
$key = array_search("17", $array, true); // FALSE;

Если значение needle (то, что ищем в массиве), является строкой, то производится регистро-зависимое сравнение.

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

Стоит учитывать, если искомое значение встречается в массиве несколько раз, то функция вернет только один — первый найденный ключ.

in_array — Проверяет, присутствует ли в массиве значение, в случае успеха возвращает TRUE, неудачи FALSE. Как вы понимаете функция служит для поиска и определения наличия элемента в массиве, ключ на сам же элемент не возвращается.

Синтаксис функции bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

Функции для перебора элементов массива, с последующим поиском:

foreach — Перебирает элементы массива, работает только с массивами и объектами, в случае использования переменных отличного типа, PHP выдаст ошибку.

Возможны два вида синтаксиса (подробнее тут):

foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement

Пример использования функции с конструкцией foreach для поиска элемента массива, возвращает TRUE при успехе

function IsInArray($array , $findme)
{
foreach ($array as $c)
 {
 if (strpos(strtolower($c), strtolower($findme)) !== false )
   return true;
 }
return false;
}

Возвращает ключ элемента массива при успехе

function IsInArray($array , $findme)
{
foreach ($array as $key => $value)
 {
 if (strpos(strtolower($value), strtolower($findme)) !== false )
   return $key;
 }
return false;
}

while — цикл, с помощью которого также можно произвести поиск элемента в массиве. Подробнее о самой конструкции, тут.

Синтаксис конструкции
while (expr)
statement

Возвращает ключ элемента массива при успехе

function IsInArray($array , $findme)
{
  // определяем длину массива
  $count=count($array);
  $j=0;
  // сам поиск
  while ($j<$count)
  {
   if ($array[$j]==$findme) // если нашли
      {
       return $array[$j]; 
       break;
      }
   $j++;
  }
}

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

Далее произведем замер среднего времени выполнения функций поиска:

Число элементов массиваarray_searchЦикл foreachЦикл while
100.00000680.00000640.0000076
1000.00000780.00001530.0000185
10000.00002090.00011770.0001351
100000.00042100.00121280.0018670
1000000.00396790.01309890.0175215

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

Оставить комментарий

Автор блога
Чернышов Роман
Роман Чернышов
Веб-разработчик, Full Stack
Senior, Architector
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка