Php найти элемент в массиве значению. PHP: array_search — быстрый поиск по массиву. Удаление элементов из массива

Поиск значения в массиве требуется практически в каждом 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 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()

$array = array(0 => "blue" , 1 => "red" , 2 => 0x000000 , 3 => "green" , 4 => "red" );$key = array_search ("red" , $array ); // $key = 1;
$key = array_search ("green" , $array ); // $key = 2; (0x000000 == 0 == "green")
$key = array_search ("green" , $array , true ); // $key = 3;
?>
Внимание

Эта функция может возвращать как логическое значение FALSE , так и не относящееся к логическому типу значение, которое приводится к FALSE , например, 0 или "". За более подробной информации обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией.

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

Проверка наличия значения элемента в массиве может применяться при решении различных задач в программировании.

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

Сегодня мы их рассмотрим.

Проверка наличия значения в массиве. Функция 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!».

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

Вот и все на сегодня! Надеюсь, урок был понятен и полезен! Попробуйте сами написать подобный код, чтобы разобраться во всем окончательно.

А я жду Ваших комментариев.

Делитесь уроком со своими друзьями при помощи кнопок соц. сетей, расположенных ниже. А также подписывайтесь на обновления блога. Мы уже собрали достаточно неплохой архив полезных материалов, и они будут только пополняться!

Желаю Вам успешного программирования!

С Вами была Анна Котельникова!

Я уже достаточно долго использую функцию 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 секунды