Контакти

PHP array_search: пошук значення в масиві. Як перевірити наявність значення в масиві php Php пошук в асоціативному масиві за значенням

Найчастіше при написанні коду необхідно перевірити чи існує те чи інше значення елемента в масиві. Сьогодні ми розглянемо декілька функцій, за допомогою яких це можна зробити.

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

Ми можемо отримувати різні масиви з нашої бази даних і перевіряти наявність того чи іншого значення в ньому. Шукане значення може передаватися і від користувача нашого скрипта, коли він, наприклад, щось шукає. За результатами такого пошуку можна здійснювати певні дії. Все залежить від конкретно поставленого завдання, однак, алгоритми пошуку значення в масиві будуть одними і тими ж.

Сьогодні ми їх розглянемо.

Перевірка наявності значення в масиві. Функція in_array ()

функція in_array () дозволить нам перевірити наявність якого-небудь значення в масиві.

Якщо результат її роботи вдалий і шуканий елемент в масиві знайдено, то функція поверне true, Тобто «правду».

Функція приймає 2 обов'язкових параметра:<Что ищем> і<Где ищем>.

Також вона може приймати ще один необов'язковий параметр:<Тип данных>. Якщо цей третій необов'язковий параметр має значення true, Тоді перевіряється ще й тип даних. Тобто '2' і 2 буде не одне і те ж. У першому випадку - це рядок, у другому - число. І тоді вже вся функція in_array () не поверне значення true.

Також потрібно пам'ятати, що функція здійснює порівняння з урахуванням регістру символів.

Давайте розглянемо роботу цієї функції на простому прикладі.
Нам потрібен якийсь масив. За допомогою функції перевіримо наявність значення в масиві і виведемо на екран певне повідомлення.

Відпрацювавши функція виведе на екран повідомлення «Yes», \u200b\u200bтак як елемент «Marina» в нашому масиві присутній.

Поміняйте перший параметр у функції на будь-якої неіснуючий елемент, і Ви побачите повідомлення «No».

Перевірка наявності значення в масиві. Функція array_search ()

Існує і ще одна функція для пошуку array_search (), Яка на відміну від попередньої буде повертати ключ знайденого елемента. Це в свою чергу може стати в нагоді, якщо ми працюємо з асоціативним масивом.

Функція приймає ті ж параметри, що і попередня. При цьому третій параметр також є необов'язковим.

Давайте подивимося, як її можна використовувати, працюючи з асоціативним масивом.

"October", "money" \u003d\u003e 200, "name" \u003d\u003e "Mila"); $ Key \u003d array_search ( "Mila", $ Mass1); if ($ key) echo $ key; ?\u003e

В даному випадку ми побачимо на екрані «name», тобто ключ від шуканого елемента зі значенням «Mila».

Ці дві функції дуже схожі і по суті відрізняються тільки повертається значенням.

Пошук значення в багатовимірному масиві

А що робити, якщо ми працюємо з багатовимірним масивом? Адже його елементами будуть інші масиви.

Тут уже розглянуті нами алгоритми не спрацюють.

Насправді все не так вже й складно, просто потрібно трохи ускладнити весь механізм і використовувати цикл, наприклад, foreach (), Який прекрасно працює з масивами.

Припустимо у нас є багатовимірний масив. Його безпосередніми значеннями є інші масиви, в яких може міститися дані значення елемента.

Все, що потрібно зробити - це перебрати елементи початкового масиву в циклі foreach (). Кожен елемент цього масиву буде розібраний на ключ ($ key) і значення ($ value).

Значним буде кожен з масивів, що знаходиться всередині основного багатовимірного масиву. Ось з цими значеннями ми і будемо працювати, шукаючи в кожному внутрішньому масиві шукане значення елемента.

При знаходженні ми виведемо на екран повідомлення про те, що такий елемент існує, а якщо немає, то виведемо інше повідомлення, що такого елемента немає.

Давайте подивимося все це на прикладі коду:

"Anna", "id" \u003d\u003e 234); $ Mass2 \u003d array ( "name" \u003d\u003e "anton", "id" \u003d\u003e 24); $ Mass2 \u003d array ( "name" \u003d\u003e "ivan", "id" \u003d\u003e 007); foreach ($ Mass2 as $ key \u003d\u003e $ value) ($ name. \u003d in_array ( "ivan", $ value);) if ($ name) echo "OK! Element here!"; else echo "No have element!"; ?\u003e

Як Ви бачите, спочатку ми оголошуємо сам багатовимірний масив.

При цьому тут обов'язково потрібно писати не просто знак рівності, а «. \u003d».

Робиться це для того, щоб змінна $ name також не буде перезаписано на кожній ітерації, а доповнювалася. Адже якщо на першій ітерації елемент буде знайдений і в змінну $ name запишеться значення «true», а на другий ітерації (тобто в другому внутрішньому масиві) шуканого значення елемента немає, то значення змінної $ name просто перезапише, і в підсумку ми просто не отримаємо коректний результат.

Як Ви зрозуміли, підсумком роботи цього коду буде повідомлення «OK! Element here! ».

Спробуйте поміняти шуканий елемент на неіснуючий і Ви побачите повідомлення «No have element!».

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

Ось і все на сьогодні! Сподіваюся, урок був зрозумілий і корисний! Спробуйте самі написати подібний код, щоб розібратися у всьому остаточно.

А я чекаю Ваших коментарів.

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

Бажаю Вам успішного програмування!

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

(PHP 4\u003e \u003d 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 \u003d array (0 \u003d\u003e "blue", 1 \u003d\u003e "red", 2 \u003d\u003e 0x000000, 3 \u003d\u003e "green", 4 \u003d\u003e "red"); $ key \u003d array_search ( "red", $ array ); // $ key \u003d 1;
$ Key \u003d array_search ( "green", $ array); // $ key \u003d 2; (0x000000 \u003d\u003d 0 \u003d\u003d "green")
$ Key \u003d array_search ( "green", $ array, true); // $ key \u003d 3;
?>
Увага

Ця функція може повертати як логічне значення FALSE , Так і не відноситься до логічного типу значення, яке приводиться до FALSE , Наприклад, 0 або "". За більш детальною інформацією зверніться до розділу Булев тип. Використовуйте оператор \u003d\u003d\u003d для перевірки значення, що повертається цією функцією.

Я вже досить довго використовую функцію array_search () для пошуку значень в масиві, так як неодноразово чув і читав про те, що вона працює помітно швидше, ніж пошук по масиву в циклі, але наскільки вона швидше - не знав. Нарешті дійшли руки самому перевірити і порахувати.

Порівняв швидкість пошуку в масиві за допомогою цієї функції зі звичайним перебором масиву в циклах foreach і while. На 10-100 елементах масиву різниця непомітна та й час настільки мало, що їм можна знехтувати. А ось для великих масивів різниця виявилася дуже істотною. Зі збільшенням розміру масиву на порядок, значно збільшувалася і час пошуку. При ста тисячах елементів швидкість foreach падала до 0,013 секунди, а while - до 0,017, при тому що array_search () теж сповільнилося, але все-таки залишився на порядок швидше - 0.004 секунди. Для великого скрипта, який працює з великими масивами заміна пошуку в циклі на пошук за допомогою array_search () буде зовсім не «блошиних оптимізацією».

У зв'язку з цим згадав недавню дискусію з одним з колег на роботі - щодо того, чи потрібно програмісту знати всі ці вбудовані функції мови, або досить «програміста менталітету» і загальних знань. Не вдаючись з міркування про це самому менталітеті, думаю, що все-таки знати функції треба, може бути не весь синтаксис в деталях, а хоча-б якісь функції є і що вони в загальних рисах можуть.

UPD: потрібен програмістський склад розуму, теж потрібен! І уважність з пам'яттю не завадять (навіяно break і range :)

Під хабракатом код скрипта, яким підраховував час:

$ Mass \u003d 100000; // число значень в масиві в якому будемо шукати
$ Search \u003d 50000; // в масиві будемо шукати це значення
$ First_result \u003d array (); // масив результатів, для обчислення середнього значення першого варіанту
$ Second_result \u003d array (); // масив результатів, для обчислення середнього значення другого варіанту
$ Third_result \u003d array (); // масив результатів, для обчислення середнього значення третього варіанту

// створюємо і наповнюємо масив
$ Test_array \u003d range (0, $ mass-1); // спасибі SelenIT))

/*
$ Test_array \u003d array ();
for ($ i \u003d 0; $ i<$mass; $i++)
{
$ Test_array \u003d $ i;
}
*/

// цикл для підрахунку середніх значень
for ($ d \u003d 0; $ d<30; $d++) {

// *************** Пошук за допомогою array_search *******************

// Запускаємо підрахунок часу
$ Time_start \u003d microtime (1);
// пошук
$ Key \u003d array_search ($ search, $ test_array, true);
// якщо знайшли
if ($ key! \u003d\u003d FALSE) // треба саме! \u003d\u003d а не! \u003d, адже номер першого елемента - 0
{
echo $ test_array [$ key];
}
$ Time_end \u003d microtime (1);
// кінець підрахунку часу

// пишемо в масив значень
$ First_result \u003d $ time_end - $ time_start;

// *************** Пошук по масиву з циклом foreach *******************

// Запускаємо підрахунок часу
$ Time_start \u003d microtime (1);
// сам пошук
foreach ($ test_array as $ ta)
{
if ($ ta \u003d\u003d $ search)
{
echo $ ta;
break;
}
}
$ Time_end \u003d microtime (1);
// кінець підрахунку часу

// пишемо в масив значень
$ Second_result \u003d $ time_end - $ time_start;

// *************** Пошук по масиву з циклом while *******************

// Запускаємо підрахунок часу
$ Time_start \u003d microtime (1);

// визначаємо довжину масиву
$ Count \u003d count ($ test_array);
$ J \u003d 0;
// сам пошук
while ($ j<$count)
{
if ($ test_array [$ j] \u003d\u003d $ search) // якщо знайшли
{
echo $ test_array [$ j];
break;
}
$ J ++;
}
$ Time_end \u003d microtime (1);
// кінець підрахунку часу

// пишемо в масив значень
$ Third_result \u003d $ time_end - $ time_start;
}

$ Srednee1 \u003d array_sum ($ first_result) / count ($ first_result);
$ Srednee2 \u003d array_sum ($ second_result) / count ($ second_result);
$ Srednee3 \u003d array_sum ($ third_result) / count ($ third_result);

Printf ( "перший код виконаний в середньому за:% .7f секунди", $ srednee1);
printf ( "другий код виконаний в середньому за:% .7f секунди", $ srednee2);
printf ( "третій код виконаний в середньому за:% .7f секунди", $ srednee3);

// результат:
// перший код виконаний в середньому за: 0.0000295 секунди
// другий код виконаний в середньому за: 0.0153386 секунди
// третій код виконаний в середньому за: 0.0226001 секунди

Одна з основних операцій при роботі з масивами - пошук конкретного значення. Для цього призначена функція 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.

Перевіряти повернутий результат слід за допомогою оператора суворого рівності (\u003d\u003d\u003d). Це важливо, тому що функція може повернути значення, яке приводиться до FALSE, наприклад, 0 або порожній рядок.

приклади використання

Приклад 1. При передачі у функцію PHP array_search () багатовимірного масиву, результатом роботи буде ключ шуканого елемента.

"Winter", "season2" \u003d\u003e "spring", "season3" \u003d\u003e "summer", "season4" \u003d\u003e "autumn"); $ Result1 \u003d array_search ( "winter", $ array); $ Result2 \u003d array_search ( "summer", $ array); $ Result3 \u003d array_search ( "april", $ array); ?\u003e

У цьому прикладі змінна $ result1 отримає значення "season1", $ result2 буде дорівнює "season3", а $ result3 буде присвоєно логічне значення FALSE, так як рядок "april" не зустрічається в вихідному масиві.

Приклад 2. Функція PHP array_search () може обробляти і одновимірний масив, вважаючи його ключі наступними по порядку числовими індексами.

Змінної $ result буде присвоєно значення 1, згідно з індексом елемента "мисливець" в масиві $ array.

Приклад 3. Можлива помилка при аналізі результату.

"Washington", 1 \u003d\u003e "Adams", 2 \u003d\u003e "Jefferson", 3 \u003d\u003e "Madison", 4 \u003d\u003e "Monroe"); $ Result \u003d array_search ( "Washington", $ presidents); if (! $ result) (echo "G. Washington was not the first president of the USA";)?\u003e

Ось так, не перевіряючи отриманий результат строгим рівністю, можна отримати несподіване повідомлення про те, що Джордж Вашингтон не був першим президентом Сполучених Штатів.

Приклад 4. Повертається тільки ключ першого виявленого збіги.

Незважаючи на те, що дані значення зустрічається в масиві тричі, функція поверне тільки перший знайдений результат - 0. Для пошуку множинних збігів рекомендується використовувати функцію PHP array_keys ().



Сподобалася стаття? поділіться їй