PHP: array_search - rychlé vyhledávání v poli. PHP array_search: hledání hodnoty v poli Rychlé vyhledávání v poli php

💖 Líbí se vám? Sdílejte odkaz se svými přáteli

Hledání hodnoty v poli vyžaduje téměř každá PHP aplikace a skript pracující s daty, na což existuje mnoho metod a speciálních funkcí. V závislosti na úkolu a typu vyhledávání byste měli používat určité nástroje s ohledem na jejich vlastnosti, rychlost provádění a snadnost použití. Dále se seznámíme s PHP funkcemi pro vyhledávání prvků v poli, možnými konstrukcemi a metodami a také zjistíme, která metoda je nejrychlejší.

Funkce pro vyhledávání v poli:
pole_search- používá se k hledání hodnoty v poli. Pokud je úspěšný, vrátí klíč hledané hodnoty, pokud není nic nalezeno, vrátí FALSE. Před PHP 4.2.0 vracelo array_search() při selhání NULL místo FALSE.

Syntaxe funkce smíšené pole_search (mixed needle, pole haystack [, bool strict]).

foreach (výraz_pole jako $value)
prohlášení
foreach (array_expression as $key => $value)
prohlášení

Příklad použití funkce s konstrukcí foreach k vyhledání prvku pole, přičemž při úspěchu vrátí hodnotu TRUE

Syntaxe konstrukce
zatímco (expr)
prohlášení

Při úspěchu vrátí klíč prvku pole

Z tabulky měření je vidět, že funkce pole_search, ukazuje nejlepší výsledky při vyhledávání v malých i velkých polích. Zároveň se výrazně prodlužuje doba vyhledávání pomocí smyček v závislosti na velikosti pole.

Jednou z hlavních operací při práci s poli je hledání konkrétní hodnoty. K tomu je určena funkce PHP array_search(). Je schopen zpracovávat jak jednorozměrné, tak asociativní kolekce, přičemž vrací klíč hledané hodnoty, pokud je v poli nalezen.

Syntax

Formalizovaný popis funkce array_search() v PHP je následující:

Smíšené pole_search (smíšená hodnota, pole $collection [, bool strict])

Vstupní parametry:

  • $collection - pole, ve kterém bude vyhledávání provedeno;
  • hodnota - požadovaná hodnota libovolného typu;
  • strict je volitelný booleovský příznak, který nastavuje přísný mechanismus porovnávání podle typu.

Mechanismus provozu

Funkce PHP array_search() porovnává hodnotu jednu po druhé se všemi hodnotami v poli kolekce. Standardně se porovnání provádí bez ohledu na typy operandů. Toto nastavení lze změnit nastavením příznaku striktní na hodnotu TRUE. Porovnání řetězců rozlišuje malá a velká písmena.

Pokud je nalezena shoda, vrátí se klíč odpovídající nalezenému prvku a funkce se zastaví. Proto jej nelze použít k detekci více výskytů požadované hodnoty v poli.

Pokud nebudou nalezeny žádné shody, funkce vrátí booleovskou hodnotu FALSE.

Měli byste zkontrolovat vrácený výsledek pomocí operátoru přísné rovnosti (===). To je důležité, protože funkce může vrátit hodnotu přetypovanou na FALSE, například 0 nebo prázdný řetězec.

Příklady použití

Příklad 1. Při předávání vícerozměrného pole funkci PHP array_search() bude výsledkem práce klíč hledaného prvku.

"zima", "sezóna2" => "jaro", "sezóna3" => "léto", "sezóna4" => "podzim"); $vysledek1 = pole_search("zima", $pole); $result2 = array_search("léto", $pole); $result3 = array_search("duben", $pole); ?>

V tomto příkladu bude $result1 nastaven na "sezóna1", $result2 bude nastaven na "sezóna3" a $result3 bude nastaven na logickou hodnotu FALSE, protože řetězec "duben" se neobjeví ve zdrojovém poli.

Příklad 2. Funkce PHP array_search() může také zpracovat jednorozměrné pole, přičemž jeho klíče považuje za následující číselné indexy.

Proměnná $result bude nastavena na 1, podle indexu prvku "hunter" v poli $array.

Příklad 3. Možná chyba při analýze výsledku.

"Washington", 1 => "Adams", 2 => "Jefferson", 3 => "Madison", 4 => "Monroe"); $result = array_search("Washington", $presidents); if (!$result) ( echo "G. Washington nebyl prvním prezidentem USA"; ) ?>

Takže bez kontroly výsledku s přísnou rovností můžete dostat nečekanou zprávu, že George Washington nebyl prvním prezidentem Spojených států.

Příklad 4: Je vrácen pouze klíč první nalezené shody.

I když se hledaná hodnota vyskytuje v poli třikrát, funkce vrátí pouze první nalezený výsledek - 0. Pro nalezení více shod se doporučuje použít funkci PHP array_keys().

Funkci array_search() používám poměrně dlouho k hledání hodnot v poli, protože jsem opakovaně slyšel a četl, že funguje znatelně rychleji než prohledávání pole ve smyčce, ale neudělal jsem to. vědět, jak je to rychlejší. Konečně jsem se dostal k tomu, abych to zkontroloval a spočítal sám.

Porovnal jsem rychlost prohledávání pole pomocí této funkce s obvyklým prohledáváním pole v cyklech foreach a while. Na 10-100 prvcích pole je rozdíl nepozorovatelný a čas je tak krátký, že jej lze zanedbat. Ale pro velká pole se rozdíl ukázal jako docela významný. Jak se velikost pole řádově zvětšila, výrazně se prodloužila i doba vyhledávání. Se sto tisíci prvky klesla rychlost foreach na 0,013 sekundy a zatímco – na 0,017, zatímco array_search() se také zpomalilo, ale stále zůstalo o řád rychlejší – 0,004 sekundy. U velkého skriptu pracujícího s velkými poli nebude nahrazení hledání ve smyčce hledáním pomocí array_search() vůbec „optimalizací proti blechám“.

V tomto ohledu jsem si vzpomněl na nedávnou diskuzi s jedním mým kolegou v práci o tom, zda programátor potřebuje znát všechny tyto vestavěné jazykové funkce, nebo mu stačí „programátorské myšlení“ a všeobecné znalosti. Aniž bych se pouštěl do diskuse o tomto způsobu myšlení, myslím si, že stále potřebujete znát funkce, možná ne celou syntaxi podrobně, ale alespoň jaké funkce existují a co obecně umí.

UPD: potřebujete také myšlení programátora! A pozor na paměť neuškodí (inspirováno breakem a dosahem:)

Pod hackem je kód skriptu, který byl použit k výpočtu času:

$hmotnost=100000; // počet hodnot v poli, ve kterém budeme hledat
$hledat=50000; // tuto hodnotu budeme hledat v poli
$first_result=array(); // pole výsledků pro výpočet průměrné hodnoty první možnosti
$second_result=array(); // pole výsledků pro výpočet průměrné hodnoty druhé možnosti
$třetí_výsledek=pole(); // pole výsledků pro výpočet průměrné hodnoty třetí možnosti

// vytvořte a vyplňte pole
$test_array = rozsah(0, $hmotnost-1); // díky SelenIT))

/*
$test_array=pole();
pro ($i=0; $i<$mass; $i++)
{
$test_array=$i;
}
*/

// smyčka pro výpočet průměrných hodnot
pro ($d=0; $d<30; $d++) {

//*************** Vyhledávání pomocí array_search *******************

// Zahájení počítání času
$time_start = microtime(1);
// Vyhledávání
$key = array_search($search, $test_array, true);
// pokud je nalezen
if ($key!==FALSE) // potřebujeme přesně!== a ne!=, protože číslo prvního prvku je 0
{
echo $test_array[$key];
}
$time_end = microtime(1);
// konec počítání času

// zápis do pole hodnot
$first_result= $time_end - $time_start;

//*************** Vyhledávání v poli se smyčkou foreach *******************

// Zahájení počítání času
$time_start = microtime(1);
// samotné vyhledávání
foreach ($test_array jako $ta)
{
if ($ta==$search)
{
echo $ta;
přestávka;
}
}
$time_end = microtime(1);
// konec počítání času

// zápis do pole hodnot
$second_result= $time_end - $time_start;

//*************** Prohledávat pole pomocí smyčky while *******************

// Zahájení počítání času
$time_start = microtime(1);

// určení délky pole
$pocet=pocet($test_pole);
$j=0;
// samotné vyhledávání
zatímco ($j<$count)
{
if ($test_array[$j]==$search) // pokud bylo nalezeno
{
echo $test_array[$j];
přestávka;
}
$j++;
}
$time_end = microtime(1);
// konec počítání času

// zápis do pole hodnot
$third_result= $time_end - $time_start;
}

$srednee1=součet_pole($první_výsledek)/počet($první_výsledek);
$srednee2=součet_pole ($second_result)/count($second_result);
$srednee3=součet_pole ($třetí_výsledek)/počet($třetí_výsledek);

Printf("první dokončený kód v průměru: %.7f sekund", $srednee1);
printf("druhý kód dokončen v průměru za: %.7f sekund", $srednee2);
printf("třetí kód dokončen v průměru za: %.7f sekund", $srednee3);

// výsledek:
// první kód dokončen v průměru: 0,0000295 sekund
// druhý kód dokončen v průměru: 0,0153386 sekund
// třetí kód dokončen v průměru: 0,0226001 sekund

(PHP 4 >= 4.0.5, PHP 5)

array_search -- Vyhledá danou hodnotu v poli a v případě úspěchu vrátí odpovídající klíč

Popis

smíšený pole_search(smíšená jehla, pole sena [, bool strict])

Vyhledá v kupce sena hodnotu jehly a vrátí klíč, pokud je v poli přítomen, NEPRAVDIVÉ v opačném případě.

Komentář: Je-li jehla struna, provede se porovnání rozlišující malá a velká písmena.

Komentář: Až do PHP 4.2.0, array_search() v případě neúspěšnosti vrácena NULA namísto NEPRAVDIVÉ .

Pokud předáte hodnotu SKUTEČNÝ jako volitelný třetí parametr funkce strict array_search() také zkontroluje typ jehly v poli kupky sena.

Pokud je jehla v kupce sena více než jednou, vrátí se první nalezený klíč. Chcete-li vrátit klíče pro všechny nalezené hodnoty, použijte funkci array_keys() s volitelným parametrem search_value.


Příklad 1: Příklad použití array_search()

$array = array(0 => "modrá" , ​​1 => "červená" , 2 => 0x000000 , 3 => "zelená" , 4 => "červená" );$key = array_search ("červená" , $array ); // $klíč = 1;
$key = array_search("green" , $array ); // $klíč = 2; (0x000000 == 0 == "zelená")
$key = pole_search ("zelená" , $pole, true ); // $klíč = 3;
?>
Pozornost

Tato funkce se může vrátit jako booleovská hodnota NEPRAVDIVÉ, nelogická hodnota, která je přetypována NEPRAVDIVÉ, například 0 nebo "". Další informace naleznete v části Booleovský typ. Pomocí operátoru === zkontrolujte hodnotu vrácenou touto funkcí.

říct přátelům