Php nájsť prvok v hodnote poľa. PHP array_search: Vyhľadajte hodnotu v poli. Syntax PHP a jazykové prostredie

Programovanie je o syntaxi a sémantike. Prvý je určený pravidlami jazyka, druhý skúsenosťami vývojára. Pokiaľ ide o polia, vývojár môže špecificky načítať syntax so sémantikou. Toto ešte nie je objekt, ale už to nie je pole v tradičnom zmysle. PHP vám dáva možnosť vytvárať polia premenných rôznych typov, vrátane nich samotných. Prvok poľa môže byť funkcia, to znamená schopnosť načítať pole skutočným algoritmom, skutočný význam.

Syntax je stabilná, ale mení sa od verzie k verzii a nemusí byť vždy kompatibilná ani zdola nahor. Prenosnosť programu je dobre zabudnutým výdobytkom minulého storočia. Sémantika sa vyvíja a vždy sa dá aplikovať nielen v akejkoľvek verzii akéhokoľvek jazyka; Stalo sa tradíciou používať syntaktické konštrukcie na vyjadrenie toho, čo nebolo ani stanovené v pravidlách jazyka. To možno najjednoduchšie pochopiť na príklade polí.

Konštrukcia polí

Pole v PHP má pohodlnú syntax a funkčnosť. Dá sa to opísať vopred, ale často je vhodné vytvárať polia za chodu podľa potreby.

public $aNone = pole(); // pole je popísané a neobsahuje nič

public $aFact = array("avokádo", "broskyňa", "čerešňa"); // toto pole má tri prvky

Vytvorenie poľa pri kontrole podmienky:

$cSrcLine = "analyzovaný dátový riadok";

pre ($i=0; $i<13; $i++) {

if (checkFunc($cSrcLine, $cUserLine) (

$aResult = "Áno"; // pridať do poľa PHP

$aResult = "Nie";

V dôsledku vykonania tohto príkladu sa vytvorí pole 13 prvkov, ktorých hodnoty budú iba reťazce „Áno“ alebo „Nie“. Prvky dostanú indexy od 0 do 12. Rovnaký efekt možno dosiahnuť, ak najskôr zapíšete „budúce“ pole PHP do reťazca:

$cFutureArray = "";

pre ($i=0; $i<13; $i++) {

$cUserLine = inputUserLine(); // zadajte niečo

if ($i > 0) ( $cFutureArray .= "|"; )

if (checkFunc($cSrcLine, $cUserLine) ( $cFutureArray .= "Áno";

) else ( $cFutureArray .= "Nie"; )

$aResult = explode("|", $cFutureArray);

Viacrozmerné polia

Mnoho redakčných systémov (CMS) využíva polia vo veľkom. Na jednej strane je to dobrá prax, na druhej strane to sťažuje používanie. Aj keď autor rozumie doktríne „PHP pole v poli“, nemal by ju zneužívať: na zložitý zápis si bude musieť zvyknúť nielen vývojár. Samotný tvorca si často po chvíli bude dlho pamätať, čo napísal:

"view_manager" => array(41, "template_path_stack" => array(__DIR__ . "/../view",),

"router" => array("routes" => array("sayhello" => array(

"type" => "Zend\Mvc\Router\Http\Literal",

"options" => array("route" => "/sayhello", "defaults" => array(

"controller" => "Helloworld\Controller\Index", "action" => "index",))))),

"controllers" => array("invokables" => array(

"Helloworld\Controller\Index" => "Ahoj svet\Controller\IndexController"))

Toto je príklad praxe „PHP pole v poli“ zo ZF 2. Spočiatku to nie je príliš inšpirujúce, ale funguje a pravdepodobne robí tento rámec úspešným (príklad zo ZendSkeletonApplication/module/Helloworld/config/module.config.php) .

Pole je dôležitým dátovým konštruktom počas návrhu a vývoja. Jeho viacrozmerná verzia bola kedysi populárna, ale postupom času zostala potreba polí maximálne dvoch alebo troch rozmerov. Takto je to jednoduchšie a prehľadnejšie a z profesionálneho hľadiska, keď sa niečo začne množiť, znamená to, že niečo nie je v poriadku v probléme alebo v kóde.

Jednoduché, prístupné a zrozumiteľné

Pri vytváraní poľa v poli v PHP je najlepšie obmedziť sa na dve alebo tri úrovne. Napriek stabilite a spoľahlivosti PHP robí chyby pri spracovaní syntaktických štruktúr. Môžete sa s tým zmieriť, ak máte dobrý editor kódu a zvyknete si presne počítať zátvorky a čiarky. PHP však neovláda dátové typy (to je karma moderného programovania) a umožňuje vývojárovi precvičiť si sémantické chyby.

Pravidlo na kontrolu typov premenných alebo vlastných nápadov na premenu sémantiky na syntax je často nedostupný luxus. Ide o stratu rýchlosti skriptu, čitateľnosti kódu, ... pretože jednoduchosť v kódovaní je vždy podstatná.

PHP má významnú negatívnu vlastnosť: keď vznikne neistota, skript jednoducho zamrzne. Nie každý debugger si dokáže poradiť s nepredvídanými okolnosťami a veľa závisí od skúseností a intuície vývojára. Čím jednoduchší je algoritmus, čím sú informácie prístupnejšie, tým je väčšia šanca nájsť chybu alebo jej úplne zabrániť.

Je charakteristické, že keď sa objavili prvé polia, boli navrhnuté varianty údajov vo forme štruktúr - nemotorný pokus vytvoriť niečo z rôznych typov údajov. Prvý prežil a získal novú efektívnu syntax, zatiaľ čo druhý sa stal históriou.

Jednoduché a asociatívne polia

Zápis pre dvojrozmerné pole je ďalší pár zátvoriek "[" a "]", napríklad: $aSrcData znamená prístup k prvku poľa zahrnutému v poli $aSrcData. V PHP nie je potrebné vopred deklarovať údaje. Existencia akejkoľvek uvedenej informácie môže byť vždy overená.

Je veľmi efektívne vytvárať niečo len vtedy, keď je to potrebné, v takej forme, v akej sa to vyžadovalo, a ničiť to, keď to potreba pominula. Použitím zmysluplných názvov ako kľúčov (indexov) môžete získať čitateľné konštrukcie, ktoré sú zmysluplné v kontexte aktuálneho miesta v algoritme:

$aAnketa["name"] = "Ivanov";
$aAnketa["vek"] = 42;
$aAnketa["work"] = "Riaditeľ";
$aAnketa["aktívny"] = true;
$aTable = $aAnketa;

$aAnketa["name"] = "Petrov";
$aAnketa["vek"] = 34;
$aAnketa["work"] = "Manažér";
$aAnketa["aktívny"] = true;
$aTable = $aAnketa;

$aAnketa["name"] = "Afanasyev";
$aAnketa["vek"] = 28;
$aAnketa["work"] = "Pracovník";
$aAnketa["aktívny"] = nepravda;
$aTable = $aAnketa;

$sOne .= implode ("; ", $aTable) . "
"; // druhé pole PHP do reťazca
$sOne .= $aTable["práca"]; // prístup k jednému prvku druhého poľa

Výsledok tohto príkladu (prvé pole je normálne, kľúče v ňom začínajú od 0, druhé pole je asociatívne, má štyri kľúče: „meno“, „vek“, „práca“, „aktívny“):

$sOne = "Petrov; 34; manažér; 1
Manažér";

Tento jednoduchý príklad ukazuje, ako možno vytvorený dotazník aplikovať na všetkých zamestnancov. Môžete si vytvoriť pole zamestnancov s indexmi podľa personálnych čísel a ak potrebujete konkrétneho zamestnanca, tak ho vybrať podľa osobného čísla.

Ak má organizácia divízie alebo sú v nej sezónni pracovníci, alebo potrebujete samostatne identifikovať pracujúcich dôchodcov, ... dizajn „Pole PHP v poli“ je veľmi pohodlný, ale nikdy by ste sa nemali nechať uniesť rozmerom. Dva alebo tri rozmery sú limitom pre efektívne riešenie.

Klávesy pre prácu s poliami

Ak predtým záležalo na tom, ako je všetko usporiadané, tak sa v posledných rokoch úplne zabudlo na tradície binárnej éry, keď chcel programátor vedieť, ako presne sú prvky poľa uložené a chcel k nim mať priamy prístup. Objavilo sa mnoho kódovaní znakov, ktoré zaberajú viac ako jeden bajt v pamäti. Slovo „bit“ možno teraz nájsť iba v operáciách vyhľadávania bitov, ale vyhľadávanie poľa PHP je samostatná téma. Prístup k prvkom môže byť jednoduchý a asociatívny. V prvom prípade sú prvky poľa (ktoré majú niektorý z typov dostupných v PHP) očíslované 0, 1, 2, ... V druhom prípade programátor špecifikuje svoj vlastný index, často nazývaný „kľúč“, na prístup požadovanú hodnotu.

$aLine["ovocie"] = "pomaranč"; // tu kľúč poľa PHP = "ovocie"

alebo (aby bolo všetko správne, rešpektujúc kódovanie stránky a kód):

$aLine = iconv("UTF-8", "CP1251", "oranžová");

Pri pridávaní novej hodnoty do poľa $aLine:

$aLine = iconv("UTF-8", "CP1251", "broskyňa");
$aLine = iconv("UTF-8", "CP1251", "uhorka");
$aLine = iconv("UTF-8", "CP1251", "baklažán");

ako výsledok vykonania cyklu:

foreach ($aLine ako $ck => $cv) (
$cOne .= $ck . "=" . $ cv . "
";
}

budú prijaté:

ovocie=pomaranč
0 = broskyňa
zelenina=uhorka
1 = baklažán

Kľúč poľa PHP pri pridávaní prvkov „broskyňa“ a „baklažán“ sa vytvára postupne od 0 a pri zadávaní jeho hodnoty sa bude rovnať tejto hodnote.

Odstránenie prvkov z poľa

Najjednoduchšie je to pri jeho spracovaní. V tomto prípade sa napríklad v dôsledku vykonania slučky naskenuje pôvodné pole a vytvorí sa nové, do ktorého sa nepotrebné prvky jednoducho nezapíšu.

Mohlo by to byť jednoduchšie. Ak použijeme posledný príklad:

unset($aLine); // odstránenie prvku poľa PHP

potom výsledok bude:

ovocie=pomaranč
zelenina=uhorka
1 = baklažán

Existuje veľa možností na manipuláciu s prvkami poľa. Napríklad pomocou funkcií: implode() a explode() môžete zapísať pole PHP do reťazca s jedným oddeľovačom a analyzovať ho späť do iného poľa pomocou iného oddeľovača.

Ak chcete jednoducho odstrániť celé pole v PHP, stačí napísať: unset($aLine);

Je to dosť.

Vyhľadajte v poli

PHP obsahuje špeciálne funkcie vyhľadávania a in_array(), ale predtým, ako sa ich rozhodnete použiť, mali by ste zvážiť, či sami nevykonáte vyhľadávanie polí PHP.

Každý projekt má špecifické konštruované polia, najmä ak je časť sémantiky prenesená do syntaxe a je reprezentovaná množinou veľmi špecifických zmysluplných kľúčov. To vám umožňuje vykonávať vlastné funkcie vyhľadávania, ktoré môžu byť tiež zmysluplne označené.

V PHP môžete volať funkcie, ktorých názov je určený počas vykonávania programu. Veľmi praktický príklad z knižnice PHPWord, ktorá umožňuje čítať a vytvárať dokumenty MS Word:

$elements = array("Text", "Inline", "TextRun", "Link", "PreserveText", "TextBreak",
"ListItem", "ListItemRun", "Tabuľka", "Obrázok", "Objekt", "Poznámka pod čiarou",
"Koncová poznámka", "Začiarkavacie políčko", "Textové pole", "Pole", "Riadka");

$funkcie = pole();

pre ($i = 0; $i< count($elements); $i++) {
$functions[$i] = "pridať" . $elements[$i];
}

Výsledkom je, že pole $functions dostane hodnoty poľa $elements, teda názvy skutočných funkcií, ktoré pracujú so skutočnými prvkami dokumentu.

Volaním $functions na $elements môžete získať perfektné vyhľadávanie a rýchle výsledky.

Triedenie položiek

Úloha triedenia dát je dôležitá a PHP na to ponúka niekoľko funkcií: sort(), rsort(), asort(), ksort(), ... Vzostupné a zostupné prvky, druhé dve funkcie ukladajú vzťahy medzi kľúčmi a hodnotami . Niekedy má zmysel náhodne premiešať hodnoty poľa - shuffle().

Pri používaní funkcií PHP na triedenie by ste nemali zabúdať, že prvky môžu mať nielen rôzne typy, ale aj nie celkom prirodzený obsah. Po prvé, musíte byť veľmi opatrní pri triedení reťazcov obsahujúcich ruské písmená, triedenie dátumov, ako aj čísel, ktoré sú napísané v rôznych formátoch.

Najlepší spôsob, ako si sami napísať ideálne riešenie, aspoň vo fáze testovania skriptu, je manuálne triedenie. Pomôže to predvídať nepredvídané situácie.

String Arrays

Vďaka funkciám implode() a explode() možno pole ľahko premeniť na reťazec a vrátiť ho späť. To vám umožňuje ukladať dáta v kompaktnej reprezentácii a podľa potreby ich rozširovať do vhodného stavu.

Pole prevedené na reťazec otvára nové možnosti. Napríklad úloha hľadania kľúčových slov v texte vyžaduje, aby sa nájdené znova nepridávalo.

$cSrcLine = "Text Text ListItemSpustiť TextBox ListItem TextBox Zaškrtávacie políčko CheckBox TextBox poznámka pod čiarou";

$aSrc = explode(" ", $cSrcLine);
$cDstLine = "";

pre ($i=0; $i< count($aSrc); $i++) {
$cFind = "[" . $aSrc[$i] . "]";
if (! is_integer(strpos($cDstLine, $cFind))) (
$cDstLine .= $cFind;
}
}
$aDst = explode("][", $cDstLine);

$cOne = implode("; ", $aDst);

Výsledkom je, že premenná $cOne dostane iba tie hodnoty zo zdrojového reťazca, ktoré sa tam objavia raz: „Text; ListItemRun; TextBox; ListItem; Check; Box; CheckBox; Poznámka pod čiarou“.

Ruský jazyk v kľúčoch a významoch

V syntaktických štruktúrach sa neodporúča používať nič, čo súvisí s národným kódovaním. Ruština, rovnako ako všetky ostatné jazyky, ktorých znaky presahujú a-z, nespôsobí problémy, pretože sa nachádza v oblasti údajov, ale nie v syntaxi kódu. Niekedy aj jednoduchá úloha v PHP „vytlačiť pole do tlačiarne alebo na obrazovku“ povedie k „bláznivým chybám“ a častejšie sa skript jednoducho zastaví.

PHP je lojálny jazyk a je tolerantný voči národným kódovaniam, ale existuje veľa situácií, keď sa dokončené množstvo práce musí vykonať znova len preto, že kľúčová hodnota sa objaví na správnom mieste a v správnom čase, čo nie je možné. rozpoznať.

Syntax PHP a jazykové prostredie

Malo by sa pamätať na to, že syntax PHP je jedna vec, ale konštrukcie tejto syntaxe sa „zaoberajú“ inými aplikáciami, operačným systémom, hardvérovými možnosťami. Možností je veľa, nikdy nie je možné zabezpečiť všetko.

Pravidlo „v kóde je iba kód, ale na vstupe, vnútri a na výstupe sú všetky druhy informácií“ pomôže vyhnúť sa nepredvídaným prekvapeniam. Hodnota PHP v poli môže byť „ruská“, ale kľúč k nej musí byť syntakticky správny nielen z hľadiska daného jazyka, ale aj z hľadiska jeho operačného prostredia.

z viacrozmerného (18)

Upravil som jeden z nižšie uvedených príkladov na popis funkcie array_search. Funkcia searchItemsByKey vráti všetky hodnoty pomocou $key z viacrozmerného poľa (N úrovní). Možno by to bolo pre niekoho užitočné. Príklad:

$arr = array("XXX"=>array("YYY"=> array("AAA"=> array("keyN" =>"value1")), "ZZZ"=> array("BBB"=> pole ("keyN" => "value2")) //.....)); $vysledok = searchItemsByKey($arr,"keyN"); vytlačiť "

"; print_r($výsledok); tlač " 
"; // OUTPUT Array ( => hodnota1 => hodnota2)

Kód funkcie:

Funkcia searchItemsByKey($array, $key) ( $results = array(); if (is_array($array)) ( if (isset($array[$key]) && key($array)==$key) $results = $pole[$key]; foreach ($pole ako $sub_array) $results = array_merge($results, searchItemsByKey($sub_array, $key)); ) return $results; )

Mám pole, kde chcem vyhľadať uid a získať kľúč poľa.

Príklady

Predpokladajme, že máme nasledujúce dvojrozmerné pole:

$userdb = array(array("uid" => "100", "name" => "Sandra Shush", "pic_square" => "urlof100"), array("uid" => "5465", "name" => "Stefanie Mcmohn", "pic_square" => "urlof100"), array("uid" => "40489", "name" => "Michael", "pic_square" => "urlof40489"));

Volanie search_by_uid(100) (uid prvého používateľa) by malo vrátiť 0.

Volanie funkcie search_by_uid(40489) by malo vrátiť 2 .

Skúšal som vytvárať slučky, ale potrebujem rýchlejší spustiteľný kód.

Na základe Jakubovej vynikajúcej odpovede je tu zovšeobecnené vyhľadávanie, ktoré vám umožní špecifikovať kľúč (nielen pre uid):

Funkcia searcharray($value, $key, $array) (foreach ($pole ako $k => $val) ( if ($val[$key] == $value) (​return $k; ) ) return null ;)

Použitie: $results = searcharray("searchvalue", searchkey, $array);

Funkcia searchForId($id, $array) ( foreach ($array ako $key => $val) ( if ($val["uid"] === $id) ( return $key; ) ) return null; )

Bude to fungovať. Mali by ste to nazvať takto:

$id = searchForId("100", $userdb);

Je dôležité vedieť, že ak použijete === porovnávané typy operátorov musia byť úplne rovnaké, v tomto príklade musíte hľadať reťazec alebo jednoducho použiť == namiesto === .

Na základe odpovede angora. V novších verziách PHP (>= 5.5.0) môžete použiť jednoriadkové.

$key = array_search("100", array_column($userdb, "uid"));

Aj keď je to stará otázka a existuje prijatá odpoveď, myslel som si, že navrhnem jednu zmenu prijatej odpovede. Takže v prvom rade súhlasím s tým, že tu prijatá odpoveď je správna.

Funkcia searchArrayKeyVal($sKey, $id, $array) ( foreach ($array ako $key => $val) ( if ($val[$sKey] == $id) ( return $key; ) ) return false; )

Namiesto toho nahraďte prednastavené "uid" parametrom vo funkcii, takže volanie nižšie uvedeného kódu znamená, že môžete použiť jednu funkciu pre viacero typov polí. Malá zmena, ale je to trochu inak.

// Pole údajov používateľov $userdb = pole (pole ("uid" => "100","name" => "Sandra Shush","url" => "urlof100"), pole ("uid" => " 5465","name" => "Stefanie Mcmohn","url" => "urlof100"), pole ("uid" => "40489","name" => "Michael","url" => "urlof40489" "),); // Získanie kľúča poľa $arrayKey = searchArrayKeyVal("uid", "100", $userdb); if ($arrayKey!==false) ( echo "Výsledok vyhľadávania: ", $userdb[$arrayKey]["name"]; ) else ( echo "Výsledok vyhľadávania sa nepodarilo nájsť"; )

If(! function_exists("arraySearchMulti"))( function arraySearchMulti($search,$key,$array,$returnKey=false) ( foreach ($array ako $k => $val) ( if (isset($val[$ kľúč])) ( if ((reťazec)$val[$key] == (reťazec)$hľadať) ( return ($returnKey ? $k: $val); ) )else( return (is_array($val) ? arraySearchMulti ($search,$key,$val,$returnKey) : null); ) ) return null; ))

môžete použiť túto funkciu; https://github.com/serhatozles/ArrayAdvancedSearch

="2""; $Array = array("a" => array("d" => "2"), array("a" => "Example World","b" => "2"), array("c" => "3"), array("d" => "4"),); $Result = ArraySearch($Array,$query,1); echo "

"; print_r($Result); echo "
"; // Výstup: // Pole // (// => Pole // (// [a] => Príklad sveta // [b] => 2 //) // //)

Ak je otázka, t.j.

$a = [ [ "_id" => "5a96933414d48831a41901f2", "suma_zľavy" => 3,29, "id_skončenia" => "5a92656a14d488570c2c44a2", ], [5ad97d" => "146edis97" => "1 count _amount" => 4,53, "discount_id" => "5a9265b914d488548513b122", ], [ "_id" => "5a98083614d488191304b6c3", "suma_diskontu" => 15,24, "discount_id" => 805d 24539" => 8054 8453 " => "5a982a4914d48824721eafe3", " čiastka_zľavy " => 45,74, "identifikátor_zľavy" => "5a928ce414d488609e73b443", ], [ "_id" => "5a982a4914d48824721eafe55", "suma_zľavy" => 948% zľava 10,26 10. e73b44 3", ], ];

Funkcia searchForId($id, $array) ( $did=0; $dia=0; foreach ($array ako $key => $val) ( if ($val["discount_id"] === $id) ( $ dia +=$val["suma_zľavy"]; $did++; ) ) if($dia != "") ( echo $dia; var_dump($did); ) return null; ); print_r(searchForId("5a928ce414d488609e73b443",$a));

Skúste aj toto

Funkcia search_in_array($srchvalue, $array) ( if (is_array($array) && count($array) > 0) ( $foundkey = array_search($srchvalue, $array); if ($foundkey === FALSE) ( foreach ($array ako $key => $value) ( if (is_array($value) && count($value) > 0) ( $foundkey = search_in_array($srchvalue, $value); if ($foundkey != FALSE ) vrátiť $foundkey; ) ) ) inak vrátiť $foundkey; ) )

$a = ["x" => ["eee", "ccc"], "b" => ["zzz"]]; $found = null; $search = "eee"; array_walk($a, funkcia ($k, $v) použitie ($search, &$found) ( if (in_array($search, $k)) ( $found = $v; ) )); var_dump($found);

Tu je jedna vložka na tú istú vec,

$pic_square = $userdb["pic_square"];

Tu je môj príklad a uvedomte si, že toto je moja prvá odpoveď. Vybral som pole param, pretože som potreboval hľadať iba jedno konkrétne pole, ale môžete ho ľahko pridať. Chcel som v podstate hľadať viac ako len uid.

V mojej situácii tiež môže existovať viacero kľúčov, ktoré sa majú vrátiť v dôsledku vyhľadávania podľa iných polí, ktoré nemusia byť jedinečné.

/** * @param pole multidimenzionálne * @param reťazcová hodnota na vyhľadanie, tj špecifický názov poľa ako name_first * @param string asociatívny kľúč, v ktorom sa má nájsť, tj pole_name * * @return kľúče poľa. */ funkcia search_revisions($dataArray, $search_value, $key_to_search) ( // Táto funkcia vyhľadá v revíziách určitú hodnotu // súvisiacu s asociatívnym kľúčom, ktorý hľadáte. $keys = array(); foreach ($dataArray ako $key => $cur_value) ( ​​if ($cur_value[$key_to_search] == $search_value) ( ​​​​$keys = $key; ) ) vrátiť $keys; )

Neskôr som skončil s písaním tohto, aby som mohol hľadať inú hodnotu a asociatívny kľúč. Takže môj prvý príklad vám umožňuje vyhľadať hodnotu v akomkoľvek konkrétnom asociatívnom kľúči a vrátiť všetky zhody.

Tento druhý príklad ukazuje, kde sa hodnota ("Taylor") nachádza v konkrétnom kľúči asociácie (first_name). A iná hodnota (true) sa nachádza v inom asociatívnom kľúči (použité) a vráti všetky zhody (kľúče, v ktorých sa používajú ľudia s názvom „Taylor“ AND).

/** * @param pole multidimenzionálne * @param string $search_value Hodnota, ktorá sa má hľadať, tj konkrétny "Taylor" * @param string $key_to_search Asociačný kľúč, v ktorom sa má nájsť, tj meno_* @param string $other_matching_key Asociatívne kľúč, ktorý sa má nájsť v zhode pre zamestnaný * @param string $other_matching_value Hodnota, ktorá sa má nájsť v zodpovedajúcom asociatívnom kľúči, tj true * * @return kľúče poľa, tj všetci ľudia s krstným menom "Taylor", ktorí sú zamestnaní. */ function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) ( // Táto funkcia vyhľadá revízie pre určitú hodnotu // súvisiacu s asociatívnym kľúčom, ktorý hľadáte. $ kľúče = array(); foreach ($dataArray ako $key => $cur_value) (​if ($cur_value[$key_to_search] == $search_value) (​if (isset($other_matching_key) && isset($other_matching_value) ) ( if ( $cur_value[$other_matching_key] == $other_matching_value) (​$keys = $key; ) ) else ( // Musím mať na pamäti, že niektoré vyhľadávania môžu mať viacero // zhôd a iné nie, takže nechajte ho otvorené bez ďalšieho . $keys = $key; ) ) ) vráťte $keys; )

Pomocou funkcie

$data = array(array("cust_group" => 6, "price" => 13,21, "price_qty" => 5), array("cust_group" => 8, "price" => 15,25, "price_qty" => 4), array("cust_group" => 8, "price" => 12,75, "price_qty" => 10)); $findKey = search_revisions($data,"8", "cust_group", "10", "price_qty"); print_r($findKey);

Výsledok

Pole ( => 2)

/** * hľadá jednoduché aj viacrozmerné pole * @param typ $needle * @param typ $haystack * @return boolean */ verejná statická funkcia in_array_multi($needle, $haystack)( $needle = trim($needle ); if(!is_array($haystack)) return False; foreach($haystack as $key=>$value)( if(is_array($value))( if(self::in_array_multi($needle, $value)) return True; else self::in_array_multi($needle, $value); ) else if(trim($value) === trim($needle))(//oprava viditeľnosti// error_log("$value === $ nastavenie viditeľnosti ihly na 1 skryté"); return True; ) ) return False; )

Ak používate (PHP 5>=5.5.0), nemusíte na to písať vlastnú funkciu, stačí napísať tento riadok a hotovo.

Ak chcete iba jeden výsledok:

$key = array_search(40489, array_column($userdb, "uid"));

Pre viacero výsledkov

$keys = array_keys(pole_column($userdb, "uid"), 40489);

Ak máte asociatívne pole, ako je uvedené v komentároch, môžete to urobiť pomocou:

$keys = array_keys(array_combine(array_keys($userdb), array_column($userdb, "uid")),40489);

Ak používate PHP<5.5.0, вы можете использовать этот backport , спасибо ramsey!

Aktualizovať. Robím niekoľko jednoduchých testov a formulár s viacerými výsledkami sa zdá byť najrýchlejší, dokonca rýchlejší ako Jakubova vlastná funkcia!

V novších verziách PHP (>=5.5.0) môžete použiť toto jednoriadkové:

$key = array_search("100", array_column($userdb, "uid"));

Rozšírením o vytvorenú funkciu @mayhem by tento príklad bol skôr „fuzzy“ vyhľadávaním, ak by ste len chceli nájsť zhodu s časťou ( veľkýčasť) vyhľadávacie reťazce:

Funkcia searchArrayKeyVal($sKey, $id, $array) ( foreach ($array ako $key => $val) ( if (strpos(strtolower($val[$sKey]), strtolower(trim($id))) ! == false) ( return $key; ) ) return false; )

Napríklad hodnota v poli je Vitajte v New Yorku! a potrebujete iba prvú kópiu "New York!"

Musel som použiť funkciu un, ktorá nájde všetky prvky v poli. Funkciu vykonávanú Jakubom Trunečkom som teda upravil nasledovne:

Funkcia search_in_array_r($needle, $array) ( $found = array(); foreach ($array ako $key => $val) ( if ($val == $needle) ( array_push($found, $val); ) ) if (count($found) != 0) return $found; inak return null; )

$search1 = "demo"; $search2 = "bob"; $arr = array("0" => "ahoj","1" => "test","2" => "john","3" => array("0" => "martin", "1" " => "bob"),"4" => "demo"); foreach ($arr ako $value) (​if (is_array($value)) ( if (in_array($search2, $value)) ( echo "úspešne"; //spustite svoj kód ) ) else ( if ($value == $search1) ( echo "úspech"; ) ) )

Ak je to možné, zadajte typy parametrov. Ale funguje to len s jednoduchými typmi ako int, bool a float.

$unsafe_variable = $_POST["user_id"]; $safe_variable = (int)$unsafe_variable ; mysqli_query($conn, "INSERT INTO tabuľky (stĺpec) VALUES ("" . $safe_variable . "")");

Hľadanie hodnoty v poli vyžaduje takmer každá PHP aplikácia a skript pracujúci s dátami, na čo existuje množstvo metód a špeciálnych funkcií. V závislosti od úlohy a typu vyhľadávania by ste mali používať určité nástroje, berúc do úvahy ich vlastnosti, rýchlosť vykonávania a jednoduchosť použitia. Ďalej sa zoznámime s funkciami PHP na vyhľadávanie prvkov v poli, možnými konštrukciami a metódami a tiež zistíme, ktorá metóda je najrýchlejšia.

Funkcie na vyhľadávanie v poli:
pole_search- používa sa na vyhľadávanie hodnoty v poli. Ak je úspešný, vráti kľúč hľadanej hodnoty, ak sa nič nenájde, vráti FALSE. Pred PHP 4.2.0, array_search() pri zlyhaní vrátilo NULL namiesto FALSE.

Syntax funkcie zmiešané pole_search (mixed needle, pole haystack [, bool strict]).

foreach (array_expression as $value)
vyhlásenie
foreach (array_expression as $key => $value)
vyhlásenie

Príklad použitia funkcie s konštruktom foreach na vyhľadanie prvku poľa, pričom pri úspechu vráti hodnotu TRUE

Konštrukčná syntax
zatiaľ čo (expr)
vyhlásenie

Pri úspechu vráti kľúč prvku poľa

Z tabuľky meraní je vidieť, že funkcia pole_search, ukazuje najlepšie výsledky pri vyhľadávaní v malých aj veľkých poliach. Zároveň sa čas vyhľadávania pomocou slučiek výrazne zvyšuje v závislosti od veľkosti poľa.

Jednou z hlavných operácií pri práci s poliami je vyhľadávanie konkrétnej hodnoty. Na to je určená funkcia PHP array_search(). Je schopný spracovať jednorozmerné aj asociatívne kolekcie, pričom vráti kľúč hľadanej hodnoty, ak sa nájde v poli.

Syntax

Formalizovaný popis funkcie array_search() v PHP je nasledujúci:

Zmiešané pole_search (zmiešaná hodnota, pole $collection [, bool strict])

Vstupné parametre:

  • $kolekcia - pole, v ktorom sa vykoná vyhľadávanie;
  • hodnota - požadovaná hodnota akéhokoľvek typu;
  • strict je voliteľný booleovský príznak, ktorý nastavuje striktný mechanizmus porovnávania s ohľadom na typ.

Mechanizmus fungovania

Funkcia PHP array_search() porovnáva hodnotu jednu po druhej so všetkými hodnotami v poli kolekcie. Štandardne sa porovnanie vykonáva bez ohľadu na typy operandov. Toto nastavenie je možné zmeniť nastavením prísneho príznaku na hodnotu TRUE. Porovnania reťazcov rozlišujú veľké a malé písmená.

Ak sa nájde zhoda, vráti sa kľúč zodpovedajúci nájdenému prvku a funkcia sa zastaví. Preto ho nemožno použiť na detekciu viacerých výskytov požadovanej hodnoty v poli.

Ak sa nenájdu žiadne zhody, funkcia vráti boolovskú hodnotu FALSE.

Vrátený výsledok by ste mali skontrolovať pomocou operátora striktnej rovnosti (===). Je to dôležité, pretože funkcia môže vrátiť hodnotu, ktorá je pretypovaná na FALSE, napríklad 0 alebo prázdny reťazec.

Príklady použitia

Príklad 1. Pri odovzdávaní viacrozmerného poľa funkcii PHP array_search() bude výsledkom práce kľúč hľadaného prvku.

"zima", "sezóna2" => "jar", "sezóna 3" => "leto", "sezóna 4" => "jeseň"); $vysledok1 = pole_vyhladavanie("zima", $pole); $vysledok2 = array_search("leto", $pole); $vysledok3 = pole_search("april", $pole); ?>

V tomto príklade bude $result1 nastavený na "season1", $result2 bude nastavený na "season3" a $result3 bude nastavený na boolovskú hodnotu FALSE, pretože reťazec "april" sa v zdrojovom poli neobjaví.

Príklad 2. Funkcia PHP array_search() dokáže spracovať aj jednorozmerné pole, pričom jeho kľúče považuje za nasledujúce číselné indexy.

Premenná $result bude nastavená na 1, podľa indexu prvku "hunter" v poli $array.

Príklad 3. Možná chyba pri analýze výsledku.

"Washington", 1 => "Adams", 2 => "Jefferson", 3 => "Madison", 4 => "Monroe"); $vysledok = array_search("Washington", $presidents); if (!$result) ( echo „G. Washington nebol prvým prezidentom USA“; ) ?>

Takže bez toho, aby ste skontrolovali výsledok s prísnou rovnosťou, môžete dostať nečakanú správu, že George Washington nebol prvým prezidentom Spojených štátov.

Príklad 4: Vráti sa iba kľúč prvej nájdenej zhody.

Aj keď sa hľadaná hodnota vyskytuje v poli trikrát, funkcia vráti iba prvý nájdený výsledok - 0. Na nájdenie viacerých zhôd sa odporúča použiť funkciu PHP array_keys().

(PHP 4 >= 4.0.5, PHP 5)

array_search -- Vyhľadá danú hodnotu v poli a v prípade úspechu vráti zodpovedajúci kľúč

Popis

zmiešané pole_search(zmiešaná ihla, pole sena [, bool strict])

Vyhľadá v kope sena hodnotu ihly a vráti kľúč, ak je prítomný v poli, FALSE inak.

komentár: Ak je ihla struna, vykoná sa porovnanie s rozlišovaním malých a veľkých písmen.

komentár: Až do PHP 4.2.0, array_search() vrátený v prípade neúspešnosti NULOVÝ namiesto FALSE .

Ak prejdete hodnotou PRAVDA ako voliteľný tretí parameter funkcie strict array_search() skontroluje aj typ ihly v poli kôpky sena.

Ak je ihla prítomná v kope sena viac ako raz, vráti sa prvý nájdený kľúč. Ak chcete vrátiť kľúče pre všetky nájdené hodnoty, použite funkciu array_keys() s voliteľným parametrom search_value.


Príklad 1: Príklad použitia array_search()

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

Táto funkcia sa môže vrátiť ako boolovská hodnota FALSE, nelogická hodnota, na ktorú sa pretypuje FALSE, napríklad 0 alebo "". Ďalšie informácie nájdete v časti Booleovský typ. Pomocou operátora === skontrolujte hodnotu vrátenú touto funkciou.

Pokračovanie v téme:
Android

Týmto článkom otváram sériu – popis práce Social CRM, t.j. softvérové ​​produkty zamerané na prácu so záujmom používateľov o sociálne siete. Rovnako ako ostatné CRM...