Поиск значения в массиве требуется практически в каждом PHP приложении, скрипте работающим с данными, для чего существует множество способов и специальных функций. В зависимости от задачи и типа поиска следует использовать те или иные инструменты, учитывая их особенности, скорость выполнения и удобство в применении. Далее мы ознакомимся с PHP функциями поиска элементов в массиве, возможными конструкциями и методами, а также выясним какой способ наиболее быстрый.
Функции для поиска в массиве
:
array_search
— служит для поиска значения в массиве. В случае удачи она возвращает ключ искомого значения, если ничего не найдено — возвращает FALSE. До версии PHP 4.2.0, array_search() при неудаче возвращала NULL, а не FALSE.
Синтаксис функции mixed array_search (mixed needle, array haystack [, bool strict]).
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
Пример использования функции с конструкцией foreach для поиска элемента массива, возвращает TRUE при успехе
Синтаксис конструкции
while (expr)
statement
Возвращает ключ элемента массива при успехе
Из приведенной таблицы замеров видно, что функция array_search , показывает наилучший результат как при поиске в малых так и больших массивах. При этом время поиска спомощью циклов значительно увеличивается в зависимости от размера массива.
Одна из основных операций при работе с массивами - поиск конкретного значения. Для этого предназначена функция PHP array_search(). Она способна обрабатывать как одномерные, так и ассоциативные коллекции, возвращая ключ искомого значения, если оно обнаружено в массиве.
Синтаксис
Формализованное описание функции array_search() в PHP выглядит следующим образом:
Mixed array_search (mixed value, array $collection [, bool strict])
Входные параметры:
- $collection - массив, в котором будет произведен поиск;
- value - искомое значение любого типа;
- strict - необязательный логический флаг, устанавливающий строгий механизм сравнения с учетом типов.
Механизм работы
Функция PHP array_search() поочередно сравнивает value со всеми значениями в массиве collection. По умолчанию, сравнение осуществляется без учета типов операндов. Эту настройку можно изменить, установив для флага strict значение TRUE. Сравнение строк осуществляется с учетом регистра.
При обнаружении совпадения возвращается ключ, соответствующий найденному элементу, и работа функции прекращается. Следовательно, с ее помощью нельзя обнаружить множественное вхождение искомого значения в массив.
Если совпадений не найдено, функция вернет булево значение FALSE.
Проверять возвращенный результат следует с помощью оператора строгого равенства (===). Это важно, так как функция может вернуть значение, которое приводится к FALSE, например, 0 или пустую строку.
Примеры использования
Пример 1. При передаче в функцию PHP array_search() многомерного массива, результатом работы будет ключ искомого элемента.
"winter", "season2" => "spring", "season3" => "summer", "season4" => "autumn"); $result1 = array_search("winter", $array); $result2 = array_search("summer", $array); $result3 = array_search("april", $array); ?>
В этом примере переменная $result1 получит значение "season1", $result2 будет равна "season3", а $result3 будет присвоено булево значение FALSE, так как строка "april" не встречается в исходном массиве.
Пример 2. Функция PHP array_search() может обрабатывать и одномерный массив, считая его ключи следующими по порядку числовыми индексами.
Переменной $result будет присвоено значение 1, согласно индексу элемента "охотник" в массиве $array.
Пример 3. Возможная ошибка при анализе результата.
"Washington", 1 => "Adams", 2 => "Jefferson", 3 => "Madison", 4 => "Monroe"); $result = array_search("Washington", $presidents); if (!$result) { echo "G. Washington was not the first president of the USA"; } ?>
Вот так, не проверяя полученный результат строгим равенством, можно получить неожиданное сообщение о том, что Джордж Вашингтон не был первым президентом Соединенных Штатов.
Пример 4. Возвращается только ключ первого обнаруженного совпадения.
Несмотря на то, что искомое значение встречается в массиве трижды, функция вернет только первый найденный результат - 0. Для поиска множественных совпадений рекомендуется использовать функцию PHP array_keys().
Я уже достаточно долго использую функцию array_search() для поиска значений в массиве, так как неоднократно слышал и читал о том, что она работает заметно быстрее, чем поиск по массиву в цикле, но насколько она быстрее - не знал. Наконец-то дошли руки самому проверить и посчитать.
Сравнил скорость поиска в массиве с помощью этой функции с обычным перебором массива в циклах foreach и while. На 10-100 элементах массива разница незаметна да и время столь мало, что им можно принебречь. А вот для больших массивов разница оказалась весьма существенной. С увеличением размера массива на порядок, значительно увеличивалось и время поиска. При ста тысячах элементов скорость foreach падала до 0,013 секунды, а while - до 0,017, при том что array_search() тоже замедлился, но все-таки остался на порядок быстрее - 0.004 секунды. Для большого скрипта, работающего с большими массивами замена поиска в цикле на поиск с помощью array_search() будет вовсе не «блошиной оптимизацией».
В связи с этим вспомнил недавнюю дискуссию с одним из коллег на работе - насчет того, нужно ли программисту знать все эти встроенные функции языка, или достаточно «программистского склада ума» и общих познаний. Не вдаваясь с рассуждения об этом самом складе ума, думаю, что все-таки знать функции надо, может быть не весь синтаксис в деталях, а хотя-бы какие функции есть и что они в общих чертах могут.
UPD: нужен программистский склад ума, тоже нужен! И внимательность с памятью не помешают (навеяно break и range:)
Под хабракатом код скрипта, которым подсчитывал время:
$mass=100000; // число значений в массиве в котором будем искать
$search=50000; // в массиве будем искать это значение
$first_result=array(); // массив результатов, для вычисления среднего значения первого варианта
$second_result=array(); // массив результатов, для вычисления среднего значения второго варианта
$third_result=array(); // массив результатов, для вычисления среднего значения третьего варианта
// создаем и наполняем массив
$test_array = range(0, $mass-1); // спасибо SelenIT))
/*
$test_array=array();
for ($i=0; $i<$mass; $i++)
{
$test_array=$i;
}
*/
// цикл для подсчета средних значений
for ($d=0; $d<30; $d++) {
//*************** Поиск с помощью array_search *******************
// Запускаем подсчет времени
$time_start = microtime(1);
// поиск
$key = array_search($search, $test_array, true);
// если нашли
if ($key!==FALSE) // надо именно!== а не!=, ведь номер первого элемента - 0
{
echo $test_array[$key];
}
$time_end = microtime(1);
// конец подсчета времени
// пишем в массив значений
$first_result= $time_end - $time_start;
//*************** Поиск по массиву с циклом foreach *******************
// Запускаем подсчет времени
$time_start = microtime(1);
// сам поиск
foreach ($test_array as $ta)
{
if ($ta==$search)
{
echo $ta;
break;
}
}
$time_end = microtime(1);
// конец подсчета времени
// пишем в массив значений
$second_result= $time_end - $time_start;
//*************** Поиск по массиву с циклом while *******************
// Запускаем подсчет времени
$time_start = microtime(1);
// определяем длину массива
$count=count($test_array);
$j=0;
// сам поиск
while ($j<$count)
{
if ($test_array[$j]==$search) // если нашли
{
echo $test_array[$j];
break;
}
$j++;
}
$time_end = microtime(1);
// конец подсчета времени
// пишем в массив значений
$third_result= $time_end - $time_start;
}
$srednee1=array_sum ($first_result)/count($first_result);
$srednee2=array_sum ($second_result)/count($second_result);
$srednee3=array_sum ($third_result)/count($third_result);
Printf("первый код выполнен в среднем за: %.7f секунды", $srednee1);
printf("второй код выполнен в среднем за: %.7f секунды", $srednee2);
printf("третий код выполнен в среднем за: %.7f секунды", $srednee3);
// результат:
// первый код выполнен в среднем за: 0.0000295 секунды
// второй код выполнен в среднем за: 0.0153386 секунды
// третий код выполнен в среднем за: 0.0226001 секунды
(PHP 4 >= 4.0.5, PHP 5)
array_search -- Осуществляет поиск данного значения в массиве и возвращает соответствующий ключ в случае удачи
Описание
mixed array_search (mixed needle, array haystack [, bool strict])Ищет в haystack значение needle и возвращает ключ, если таковое присутствует в массиве, FALSE в противном случае.
Замечание: Если needle является строкой, производится регистро-зависимое сравнение.
Замечание: До PHP 4.2.0, array_search() при неудаче возвращала NULL вместо FALSE .
Если вы передадите значение TRUE в качестве необязательного третьего параметра strict , функция array_search() также проверит тип needle в массиве haystack .
Если needle присутствует в haystack более одного раза, будет возвращён первый найденный ключ. Для того, чтобы возвратить ключи для всех найденных значений, используйте функцию array_keys() с необязательным параметром search_value .
Пример 1. Пример использования array_search()
|
Внимание |
Эта функция может возвращать как логическое значение FALSE , так и не относящееся к логическому типу значение, которое приводится к FALSE , например, 0 или "". За более подробной информации обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией. |