Php поиск в ассоциативном массиве по значению. PHP: array_search — быстрый поиск по массиву
Я уже достаточно долго использую функцию 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 секунды
Зачастую при написании кода необходимо проверить существует ли то или иное значение элемента в массиве. Сегодня мы рассмотрим несколько функций, при помощи которых это можно сделать.
Проверка наличия значения элемента в массиве может применяться при решении различных задач в программировании.
Мы можем получать различные массивы из нашей базы данных и проверять наличие того или иного значения в нем. Искомое значение может передаваться и от пользователя нашего скрипта, когда он, например, что-то ищет. По результатам такого поиска можно совершать определенные действия. Все зависит от конкретно поставленной задачи, однако, алгоритмы поиска значения в массиве будут одними и теми же.
Сегодня мы их рассмотрим.
Проверка наличия значения в массиве. Функция in_array()
Функция in_array() позволит нам проверить наличие какого-либо значения в массиве.
Если результат ее работы удачный и искомый элемент в массиве найден, то функция вернет true , то есть «правду».
Функция принимает 2 обязательных параметра: <Что ищем> и <Где ищем>.
Также она может принимать еще один необязательный параметр: <Тип данных>. Если этот третий необязательный параметр имеет значение true , тогда проверяется еще и тип данных. То есть ‘2’ и 2 будет не одно и то же. В первом случае – это строка, во втором – число. И тогда уже вся функция in_array() не вернет значение true .
Также нужно помнить, что функция осуществляет сравнение с учетом регистра символов.
Давайте рассмотрим работу этой функции на простом примере.
Нам нужен какой-нибудь массив. При помощи функции проверим наличие значения в массиве и выведем на экран определенное сообщение.
Отработав функция выведет на экран сообщение «Yes», так как элемент «Marina» в нашем массиве присутствует.
Поменяйте первый параметр в функции на какой-либо несуществующий элемент, и Вы увидите сообщение «No».
Проверка наличия значения в массиве. Функция array_search()
Существует и еще одна функция для поиска array_search() , которая в отличие от предыдущей будет возвращать ключ найденного элемента. Это в свою очередь может пригодиться, если мы работаем с ассоциативным массивом.
Функция принимает те же параметры, что и предыдущая. При этом третий параметр также является необязательным.
Давайте посмотрим, как ее можно использовать, работая с ассоциативным массивом.
"october","money"=>200,"name"=>"Mila"); $key = array_search("Mila",$Mass1); if($key) echo $key; ?>
В данном случае мы увидим на экране «name», то есть ключ от искомого элемента со значением «Mila».
Эти две функции очень похожи и по сути отличаются только возвращаемым значением.
Поиск значения в многомерном массиве
А что делать, если мы работаем с многомерным массивом? Ведь его элементами будут другие массивы.
Здесь уже рассмотренные нами алгоритмы не сработают.
На самом деле все не так уж и сложно, просто нужно немного усложнить весь механизм и использовать цикл, например, foreach() , который прекрасно работает с массивами.
Допустим у нас есть многомерный массив. Его непосредственными значениями являются другие массивы, в которых может содержаться искомое значение элемента.
Все, что требуется сделать – это перебрать элементы первоначального массива в цикле foreach() . Каждый элемент этого массива будет разобран на ключ ($key) и значение ($value).
Значением будет являться каждый из массивов, находящийся внутри основного многомерного массива. Вот с этими значениями мы и будем работать, ища в каждом внутреннем массиве искомое значение элемента.
При нахождении мы выведем на экран сообщение о том, что такой элемент существует, а если нет, то выведем другое сообщение, что такого элемента нет.
Давайте посмотрим все это на примере кода:
"anna","id"=>234); $Mass2 = array("name"=>"anton","id"=>24); $Mass2 = array("name"=>"ivan","id"=>007); foreach($Mass2 as $key => $value) { $name .= in_array("ivan",$value); } if($name) echo "OK! Element here!"; else echo "No have element!"; ?>
Как Вы видите, вначале мы объявляем сам многомерный массив.
При этом здесь обязательно нужно писать не просто знак равенства, а «.=».
Делается это для того, чтобы переменная $name не перезаписывалась на каждой итерации, а дополнялась. Ведь если на первой итерации элемент будет найден и в переменную $name запишется значение «true», а на второй итерации (то есть во втором внутреннем массиве) искомого значения элемента нет, то значение переменной $name просто перезапишется, и в итоге мы просто не получим корректный результат.
Как Вы поняли, итогом работы этого кода будет сообщение «OK! Element here!».
Попробуйте поменять искомый элемент на несуществующий и Вы увидите сообщение «No have element!».
Конечно же, при нахождении или не нахождении определенного элемента мы можем не просто выводить сообщения, а делать какие-либо другие действия. Все зависит от того, что Вам нужно сделать. Например, при наличии искомого значения в массиве, Вы можете отдавать пользователю какую-то конкретную информацию и т.д.
Вот и все на сегодня! Надеюсь, урок был понятен и полезен! Попробуйте сами написать подобный код, чтобы разобраться во всем окончательно.
А я жду Ваших комментариев.
Делитесь уроком со своими друзьями при помощи кнопок соц. сетей, расположенных ниже. А также подписывайтесь на обновления блога. Мы уже собрали достаточно неплохой архив полезных материалов, и они будут только пополняться!
Желаю Вам успешного программирования!
С Вами была Анна Котельникова!
Одна из основных операций при работе с массивами - поиск конкретного значения. Для этого предназначена функция 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().
(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 или "". За более подробной информации обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией. |