Php-index op waarde. PHP array_search: zoeken naar een waarde in een array

van multidimensionaal (18)

Ik heb een van de onderstaande voorbeelden aangepast om de array_search-functie te beschrijven. De functie searchItemsByKey retourneert alle waarden per $key uit een multidimensionale array (N niveaus). Misschien is dit voor iemand nuttig. Voorbeeld:

$arr = array("XXX"=>array("YYY"=> array("AAA"=> array("keyN" =>"waarde1")), "ZZZ"=> array("BBB"=> array ("sleutelN" => "waarde2")) //.....)); $result = searchItemsByKey($arr,"keyN"); afdrukken "

"; print_r($result); print " 
"; // OUTPUT-matrix ( => waarde1 => waarde2)

Functiecode:

Functie searchItemsByKey($array, $key) ( $results = array(); if (is_array($array)) ( if (isset($array[$key]) && key($array)==$key) $results = $array[$key]; foreach ($array als $sub_array) $results = array_merge($results, searchItemsByKey($sub_array, $key));

Ik heb een array waarin ik de uid wil opzoeken en de sleutel van de array wil ophalen.

Voorbeelden

Laten we aannemen dat we de volgende tweedimensionale array hebben:

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

Het aanroepen van search_by_uid(100) (de uid van de eerste gebruiker) zou 0 moeten retourneren.

De functieaanroep search_by_uid(40489) zou 2 moeten retourneren.

Ik heb geprobeerd loops te maken, maar ik heb een snellere uitvoering van code nodig.

Voortbouwend op het uitstekende antwoord van Jakub, is hier een meer algemene zoekopdracht waarmee u de sleutel kunt specificeren (niet alleen voor de uid):

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

Gebruik: $results = searcharray("searchvalue", zoeksleutel, $array);

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

Het zal werken. Je zou het zo moeten noemen:

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

Het is belangrijk om te weten dat als u === gebruikt, de operatortypen die worden vergeleken exact hetzelfde moeten zijn. In dit voorbeeld moet u zoeken naar string of gewoon == gebruiken in plaats van === .

Gebaseerd op het antwoord Angora. In latere versies van PHP (>= 5.5.0) kun je een oneliner gebruiken.

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

Hoewel dit een oude vraag is en er een geaccepteerd antwoord is, dacht ik dat ik één wijziging in het geaccepteerde antwoord zou voorstellen. Dus allereerst ben ik het ermee eens dat het geaccepteerde antwoord hier correct is.

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

Vervang in plaats daarvan de vooraf ingestelde "uid" door een parameter in de functie, dus nu u de onderstaande code aanroept, betekent dit dat u één functie voor meerdere arraytypen kunt gebruiken. Kleine verandering, maar het is toch een beetje anders.

// Arraygegevens van gebruikers $userdb = array (array ("uid" => "100", "name" => "Sandra Shush", "url" => "urlof100"), array ("uid" => " 5465", "naam" => "Stefanie Mcmohn", "url" => "urlof100"), array ("uid" => "40489", "naam" => "Michael", "url" => "urlof40489 "),); // Verkrijg de sleutel van de array $arrayKey = searchArrayKeyVal("uid", "100", $userdb); if ($arrayKey!==false) ( echo "Zoekresultaat: ", $userdb[$arrayKey]["naam"]; ) else ( echo "Zoekresultaat kan niet worden gevonden"; )

If(! function_exists("arraySearchMulti"))( function arraySearchMulti($search,$key,$array,$returnKey=false) ( foreach ($array as $k => $val) ( if (isset($val[$ key])) ( if ((string)$val[$key] == (string)$search) ( return ($returnKey ? $k: $val); ) )else( return (is_array($val) ? arraySearchMulti ($search,$key,$val,$returnKey) : null);

u kunt deze functie gebruiken; https://github.com/serhatozles/ArrayAdvancedSearch

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

"; print_r($Resultaat); echo "
"; // Uitvoer: // Array // (// => Array // (// [a] => Voorbeeldwereld // [b] => 2 //) // //)

Als de vraag, d.w.z.

$a = [ [ "_id" => "5a96933414d48831a41901f2", "discount_amount" => 3,29, "discount_id" => "5a92656a14d488570c2c44a2", ], [ "_id" => "5a9790fd14d48879cf16a9e8", " dis count_amount" => 4,53, " discount_id" => "5a9265b914d488548513b122", ], [ "_id" => "5a98083614d488191304b6c3", "discount_amount" => 15,24, "discount_id" => "5a92806a14d48858ff5c2ec3", ], [ id" > "5a982a4914d48824721eafe3", "kortingsbedrag " => 45,74, "discount_id" => "5a928ce414d488609e73b443", ], [ "_id" => "5a982a4914d48824721eafe55", "discount_amount" => 10,26, "discount_id" => "5a928ce414d488609e73 b4 43", ], ];

Functie searchForId($id, $array) ( $did=0; $dia=0; foreach ($array as $key => $val) ( if ($val["discount_id"] === $id) ( $ dia +=$val["discount_amount"]; $did++ ) if($dia != "") ( echo $dia; var_dump($did); ) return null); print_r(searchForId("5a928ce414d488609e73b443",$a));

Probeer dit ook

Functie search_in_array($srchvalue, $array) ( if (is_array($array) && count($array) > 0) ( $foundkey = array_search($srchvalue, $array); if ($foundkey === FALSE) ( foreach ($array as $key => $value) ( ​​if (is_array($value) && count($value) > 0) ( $foundkey = search_in_array($srchvalue, $value); if ($foundkey != FALSE ) retourneer $foundkey; ) ) anders retourneer $foundkey;

$a = ["x" => ["eee", "ccc"], "b" => ["zzz"]]; $gevonden = nul; $search = "eee"; array_walk($a, function ($k, $v) use ($search, &$found) ( if (in_array($search, $k)) ( $found = $v; ) )); var_dump($gevonden);

Hier is één voering voor hetzelfde,

$pic_square = $userdb["pic_square"];

Hier is mijn voorbeeld en houd er rekening mee dat dit mijn eerste antwoord is. Ik heb de param-array eruit gehaald omdat ik maar naar één specifieke array hoefde te zoeken, maar je kon er gemakkelijk een toevoegen. Ik wilde in wezen zoeken naar meer dan alleen de uid.

In mijn situatie kunnen er ook meerdere sleutels zijn die moeten worden geretourneerd als resultaat van de zoekopdracht op andere velden die mogelijk niet uniek zijn.

/** * @param array multidimensionaal * @param tekenreekswaarde waarnaar moet worden gezocht, dwz een specifieke veldnaam zoals naam_eerst * @param tekenreeks associatieve sleutel waarin deze moet worden gevonden, dwz veldnaam * * @return arraysleutels.

*/ function search_revisions($dataArray, $search_value, $key_to_search) ( // Deze functie doorzoekt de revisies op een bepaalde waarde // gerelateerd aan de associatieve sleutel die u zoekt. $keys = array(); foreach ($dataArray as $key => $cur_value) ( ​​if ($cur_value[$key_to_search] == $search_value) ( ​​$keys = $key; ) ) retourneert $keys;

Later heb ik dit uiteindelijk geschreven zodat ik naar een andere waarde en associatieve sleutel kon zoeken. Met mijn eerste voorbeeld kunt u dus een waarde opzoeken in een specifieke associatieve sleutel en alle overeenkomsten retourneren. Dit tweede voorbeeld laat zien waar de waarde ("Taylor") wordt gevonden in een specifieke associatiesleutel (voornaam). EN

/** * @param array multidimensionaal * @param string $search_value De waarde waarnaar moet worden gezocht, dwz een specifieke "Taylor" * @param string $key_to_search De associatieve sleutel waarin deze moet worden gevonden, dwz voornaam * @param string $other_matching_key De associatieve sleutel die moet worden gevonden in de overeenkomsten voor gebruikte * @param string $other_matching_value De waarde die moet worden gevonden in die overeenkomende associatieve sleutel, dwz true * * @return arraysleutels, dwz alle mensen met de voornaam "Taylor" die in dienst zijn.

*/ function search_revisions($dataArray, $search_value, $key_to_search, $other_matching_value = null, $other_matching_key = null) ( // Deze functie doorzoekt de revisies op een bepaalde waarde // gerelateerd aan de associatieve sleutel die u zoekt. $ sleutels = array(); foreach ($dataArray as $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 ( // Ik moet er rekening mee houden dat sommige zoekopdrachten meerdere // overeenkomsten kunnen hebben en andere niet, dus laat het open zonder vervolg $keys = $key;

De functie gebruiken

$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, "prijs" => 12,75, "prijs_aantal" => 10)); $findKey = search_revisions($data,"8", "cust_group", "10", "price_qty"); print_r($findKey);

Resultaat

Array ( => 2)

/** * doorzoekt zowel een eenvoudige als meerdimensionale array * @param type $needle * @param type $haystack * @return boolean */ public static function 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))(//visibility fix// error_log("$value === $ Needle zichtbaarheid) instelling op 1 verborgen"); return True; ) ) return False; )

Als u (PHP 5>=5.5.0) gebruikt, hoeft u hiervoor geen eigen functie te schrijven. Schrijf gewoon deze regel en u bent klaar.

Als u slechts één resultaat wilt:

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

Voor meerdere resultaten

Als je een associatieve array hebt zoals vermeld in de opmerkingen, kun je dit doen met:

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

Als je PHP gebruikt<5.5.0, вы можете использовать этот backport , спасибо ramsey!

Update. Ik doe een paar eenvoudige tests en het formulier met meerdere resultaten lijkt het snelst, zelfs sneller dan de aangepaste functie van Jakub!

In latere versies van PHP (>=5.5.0) kun je deze oneliner gebruiken:

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

Als uitbreiding op de door @mayhem gemaakte functie zou dit voorbeeld meer een "vage" zoekopdracht zijn als je slechts een deel van ( groot deel) zoekreeksen:

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

De waarde in de array is bijvoorbeeld Welkom in New York! en je hebt alleen het eerste exemplaar van "New York!"

Ik moest de un-functie gebruiken, die alle elementen in de array vindt. Daarom heb ik de functie van Jakub Truneček als volgt aangepast:

Functie search_in_array_r($needle, $array) ( $found = array(); foreach ($array as $key => $val) ( if ($val == $needle) ( array_push($found, $val); ) ) if (count($found) != 0) retourneert $found; anders retourneert null;

$search1 = "demo"; $zoek2 = "bob"; $arr = array("0" => "hallo", "1" => "test", "2" => "john", "3" => array("0" => "martin", "1 " => "bob"),"4" => "demonstratie"); foreach ($arr as $value) ( ​​if (is_array($value)) ( if (in_array($search2, $value)) ( echo "succesvol"; //voer je code uit ) ) else ( if ($value == $search1) ( echo "succes"; ) ) )

Voer indien mogelijk de parametertypen in. Maar het werkt alleen met eenvoudige typen zoals int, bool en float.

$unsafe_variable = $_POST["gebruikersnaam"]; $veilige_variabele = (int)$onveilige_variabele ; mysqli_query($conn, "INSERT INTO tabel (kolom) VALUES ("" . $safe_variable . "")");

(PHP 4 >= 4.0.5, PHP 5)

array_search - Zoekt naar een bepaalde waarde in een array en retourneert de bijbehorende sleutel als dit lukt

Beschrijving

gemengd array_zoeken(gemengde naald, array hooiberg [, bool strict])

Zoekt in de hooiberg naar de naaldwaarde en retourneert de sleutel als deze aanwezig is in de array, ONWAAR anders.

Opmerking: Als 'naald' een string is, wordt een hoofdlettergevoelige vergelijking uitgevoerd.

Opmerking: Tot PHP 4.2.0, array_search() teruggestuurd als het niet lukt NUL in plaats van ONWAAR .

Als u de waarde doorgeeft WAAR als optionele derde parameter voor strict , de functie array_search() zal ook het type naald in de hooiberg controleren.

Indien er meerdere keren een naald in de hooiberg aanwezig is, wordt de eerst gevonden sleutel teruggegeven. Gebruik de functie om de sleutels voor alle gevonden waarden terug te geven array_keys() met een optionele parameter search_value.


Voorbeeld 1: Gebruiksvoorbeeld array_search()

$array = array(0 => "blauw" , 1 => "rood" , 2 => 0x000000 , 3 => "groen" , 4 => "rood" );$key = array_search ("rood" , $matrix); // $sleutel = 1;
$key = array_search("groen" , $array); // $sleutel = 2; (0x000000 == 0 == "groen")
$key = array_search ("groen" , $array , true ); // $sleutel = 3;
?>
Aandacht

Deze functie kan retourneren als een Booleaanse waarde ONWAAR, een niet-Booleaanse waarde waarnaar wordt gecast ONWAAR, bijvoorbeeld 0 of "". Zie de sectie Booleaans type voor meer informatie. Gebruik de operator === om de waarde te controleren die door deze functie wordt geretourneerd.

Een van de belangrijkste handelingen bij het werken met arrays is het zoeken naar een specifieke waarde. De PHP array_search() functie is hiervoor ontworpen. Het is in staat om zowel eendimensionale als associatieve verzamelingen te verwerken, waarbij de sleutel van de gezochte waarde wordt geretourneerd als deze in de array wordt gevonden.

Syntaxis

De geformaliseerde beschrijving van de functie array_search() in PHP is als volgt:

Gemengde array_search (gemengde waarde, array $collection [, bool strict])

Invoerparameters:

  • $collection - de array waarin de zoekopdracht zal worden uitgevoerd;
  • waarde - de gewenste waarde van elk type;
  • strict is een optionele Booleaanse vlag die een strikt typebewust vergelijkingsmechanisme instelt.

Werkingsmechanisme

De PHP array_search() functie vergelijkt de waarde één voor één met alle waarden in de verzamelingsarray. Standaard wordt de vergelijking uitgevoerd zonder rekening te houden met de typen operanden. Deze instelling kan worden gewijzigd door de strikte vlag in te stellen op TRUE. Tekenreeksvergelijkingen zijn hoofdlettergevoelig.

Als er een match wordt gevonden, wordt de sleutel die overeenkomt met het gevonden element geretourneerd en werkt de functie niet meer. Daarom kan het niet worden gebruikt om meerdere keren voorkomen van de gewenste waarde in een array te detecteren.

Als er geen overeenkomsten worden gevonden, retourneert de functie de Booleaanse waarde FALSE.

U moet het geretourneerde resultaat controleren met behulp van de operator voor strikte gelijkheid (===). Dit is belangrijk omdat de functie mogelijk een waarde retourneert die is omgezet naar FALSE, zoals 0 of de lege tekenreeks.

Voorbeelden van gebruik

Voorbeeld 1. Wanneer u een multidimensionale array doorgeeft aan de PHP array_search() functie, zal het resultaat van het werk de sleutel van het gezochte element zijn.

"winter", "seizoen2" => "lente", "seizoen3" => "zomer", "seizoen4" => "herfst"); $result1 = array_search("winter", $array); $result2 = array_search("zomer", $array); $result3 = array_search("april", $array); ?>

In dit voorbeeld wordt $result1 ingesteld op "season1", $result2 op "season3" en $result3 op de Booleaanse waarde FALSE omdat de tekenreeks "april" niet in de bronarray voorkomt.

Voorbeeld 2. De PHP-functie array_search() kan ook een eendimensionale array verwerken, waarbij de sleutels ervan als de volgende numerieke indices worden beschouwd.

De variabele $result wordt ingesteld op 1, afhankelijk van de index van het element "hunter" in de $array.

Voorbeeld 3. Mogelijke fout bij het analyseren van het resultaat.

"Washington", 1 => "Adams", 2 => "Jefferson", 3 => "Madison", 4 => "Monroe"); $result = array_search("Washington", $presidenten); if (!$result) ( echo "G. Washington was niet de eerste president van de VS"; ) ?>

Dus zonder het resultaat met strikte gelijkheid te controleren, kun je een onverwachte boodschap krijgen dat George Washington niet de eerste president van de Verenigde Staten was.

Voorbeeld 4: Alleen de sleutel van de eerste gevonden match wordt teruggegeven.

Hoewel de waarde die u zoekt drie keer voorkomt in de array, retourneert de functie alleen het eerste gevonden resultaat - 0. Om meerdere overeenkomsten te vinden, wordt aanbevolen om de PHP-functie array_keys() te gebruiken.

Het zoeken naar een waarde in een array is vereist in vrijwel elke PHP-applicatie en -script dat met gegevens werkt, waarvoor vele methoden en speciale functies bestaan. Afhankelijk van de taak en het type zoekopdracht moet u bepaalde tools gebruiken, rekening houdend met hun kenmerken, snelheid van uitvoering en gebruiksgemak. Vervolgens maken we kennis met PHP-functies voor het zoeken naar elementen in een array, mogelijke constructies en methoden, en ontdekken we ook welke methode de snelste is.

Functies voor het zoeken in een array:
array_zoeken- gebruikt om naar een waarde in een array te zoeken. Indien succesvol, retourneert het de sleutel van de gezochte waarde; als er niets wordt gevonden, retourneert het FALSE. Vóór PHP 4.2.0 retourneerde array_search() NULL in plaats van FALSE bij een fout.

De syntaxis van de functie mixed array_search (gemengde naald, array hooiberg [, bool strict]).

foreach (array_expressie als $waarde)
stelling
foreach (array_expressie als $key => $value)
stelling

Een voorbeeld van het gebruik van een functie met de foreach-constructie om naar een array-element te zoeken, waarbij bij succes TRUE wordt geretourneerd

Constructie syntaxis
terwijl (expr)
stelling

Retourneert de sleutel van een array-element bij succes

Uit de tabel met metingen blijkt dat de functie array_zoeken, toont de beste resultaten bij het zoeken in kleine en grote arrays. Tegelijkertijd neemt de zoektijd met behulp van lussen aanzienlijk toe, afhankelijk van de grootte van de array.