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()
|
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í. |