PHP -sökning i en associativ matris efter värde. PHP: array_search - snabb array -sökning


Jag har använt funktionen array_search () för att söka efter värden i en array ganska länge, eftersom jag upprepade gånger har hört och läst att det fungerar märkbart snabbare än att söka igenom en array i en loop, men jag visste inte hur mycket snabbare det är. Slutligen fick vi koll på och räkna.

Jag jämförde hastigheten på att söka i en array med den här funktionen med den vanliga iterationen över en array i foreach och while loopar. Vid 10-100 arrayelement är skillnaden omärklig och tiden är så kort att de kan försummas. Men för stora matriser visade sig skillnaden vara mycket signifikant. Med en ökning av gruppens storlek med en storleksordning ökade söktiden också betydligt. Med hundra tusen element sjönk framhastigheten till 0,013 sekunder och medan - till 0,017, medan array_search () också saktade ner, men förblev fortfarande en storleksordning snabbare - 0,004 sekunder. För ett stort skript som fungerar med stora matriser är det inte alls en "loppoptimering" att ersätta sökningen i en loop med en sökning med array_search ().

I detta avseende erinrade jag mig en diskussion nyligen med en av mina kollegor på jobbet - om huruvida en programmerare behöver kunna alla språkets inbyggda funktioner, eller om det räcker med ett "programmeratänk" och allmän kunskap. Utan att gå in i en diskussion om just detta tänk, tror jag att du fortfarande behöver känna till funktionerna, kanske inte alla syntaxen i detalj, men åtminstone vilka funktioner som finns och vad de kan i allmänna termer.

UPD: du behöver ett programmeringssätt, du behöver det också! Och mindfulness med minne kommer inte att skada (inspirerat av paus och räckvidd :)

Under habrakaten används skriptkoden för att beräkna tiden:

$ massa = 100000; // antalet värden i matrisen som vi kommer att söka i
$ sök = 50 000; // vi kommer att söka efter detta värde i matrisen
$ first_result = array (); // array av resultat, för att beräkna medelvärdet för det första alternativet
$ second_result = array (); // array av resultat, för att beräkna medelvärdet för det andra alternativet
$ third_result = array (); // array av resultat, för att beräkna genomsnittet av det tredje alternativet

// skapa och fyll i matrisen
$ test_array = intervall (0, $ mass-1); // tack SelenIT))

/*
$ test_array = array ();
för ($ i = 0; $ i<$mass; $i++)
{
$ test_array = $ i;
}
*/

// loop för att beräkna medelvärden
för ($ d = 0; $ d<30; $d++) {

// **************** Sök med array_search *******************

// Börja tajming
$ time_start = mikrotid (1);
// Sök
$ key = array_search ($ search, $ test_array, true);
// om hittad
if ($ key! == FALSE) // det är nödvändigt! == och inte! =, eftersom numret på det första elementet är 0
{
echo $ test_array [$ key];
}
$ time_end = mikrotid (1);
// räkna ut tid

// skriv till värdena
$ first_result = $ time_end - $ time_start;

// **************** Söker en matris med en foreach -slinga ********************

// Börja tajming
$ time_start = mikrotid (1);
// sök själv
foreach ($ test_array som $ ta)
{
if ($ ta == $ sök)
{
eko $ ta;
ha sönder;
}
}
$ time_end = mikrotid (1);
// räkna ut tid

// skriv till värdena
$ second_result = $ time_end - $ time_start;

// **************** Sök igenom en array med en loop medan ********************

// Börja tajming
$ time_start = mikrotid (1);

// bestämma matrisens längd
$ count = count ($ test_array);
$ j = 0;
// sök själv
medan ($ j<$count)
{
if ($ test_array [$ j] == $ search) // om den hittades
{
eko $ test_array [$ j];
ha sönder;
}
$ j ++;
}
$ time_end = mikrotid (1);
// räkna ut tid

// skriv till värdena
$ third_result = $ time_end - $ time_start;
}

$ srednee1 = array_sum ($ first_result) / count ($ first_result);
$ srednee2 = array_sum ($ second_result) / count ($ second_result);
$ srednee3 = array_sum ($ third_result) / count ($ third_result);

Printf ("första koden körs i:% .7f sekunder i genomsnitt", $ srednee1);
printf ("den andra koden körs i:% .7f sekunder i genomsnitt", $ srednee2);
printf ("tredje koden körs i:% .7f sekunder i genomsnitt", $ srednee3);

// resultat:
// den första koden körs i genomsnitt på: 0.0000295 sekunder
// den andra koden körs i genomsnitt på: 0,0153386 sekunder
// den tredje koden körs i genomsnitt på: 0,0226001 sekunder

När du skriver kod måste du ofta kontrollera om ett visst värde för ett element finns i en array. Idag kommer vi att titta på flera funktioner som du kan göra detta med.

Kontrollera förekomsten av ett elementvärde i en array kan användas för att lösa olika programmeringsproblem.

Vi kan få olika matriser från vår databas och kontrollera om det finns ett eller annat värde i det. Det önskade värdet kan också överföras från användaren av vårt skript när han till exempel letar efter något. Baserat på resultaten av en sådan sökning kan du utföra vissa åtgärder. Allt beror på den specifika uppgiften, men algoritmerna för att hitta ett värde i en array kommer att vara desamma.

Idag ska vi titta på dem.

Kontrollerar om det finns ett värde i en array. In_array () -funktion

Fungera in_array () låter oss kontrollera om det finns något värde i matrisen.

Om resultatet av dess arbete är framgångsrikt och det nödvändiga elementet i arrayen hittas, kommer funktionen att återvända Sann, det är sanningen."

Funktionen tar 2 nödvändiga parametrar:<Что ищем>och<Где ищем>.

Det kan också ta ytterligare en valfri parameter:<Тип данных>... Om denna tredje valfria parameter är Sann, då kontrolleras även datatypen. Det vill säga att '2' och 2 inte kommer att vara desamma. I det första fallet är det en sträng, i det andra är det ett tal. Och sedan hela funktionen in_array () kommer inte att returnera värde Sann.

Du måste också komma ihåg att funktionen utför skiftlägeskänslig jämförelse.

Låt oss se hur den här funktionen fungerar med ett enkelt exempel.
Vi behöver någon form av array. Med funktionen, kontrollera om det finns ett värde i matrisen och visa ett specifikt meddelande.

Efter att funktionen har utförts kommer det att visa meddelandet "Ja", eftersom "Marina" -elementet finns i vår array.

Ändra den första parametern i funktionen till något obefintligt element, så ser du meddelandet "Nej".

Kontrollerar om det finns ett värde i en array. Array_search () -funktion

Det finns ytterligare en funktion för sökning array_search (), som, till skillnad från den föregående, returnerar nyckeln till det hittade elementet. Detta kan i sin tur vara användbart om vi arbetar med en associativ matris.

Funktionen tar samma parametrar som den föregående. I det här fallet är den tredje parametern också valfri.

Låt oss se hur du kan använda det när du arbetar med en associativ matris.

"oktober", "pengar" => 200, "name" => "Mila"); $ key = array_search ("Mila", $ Mass1); om ($ key) echo $ key; ?>

I det här fallet kommer vi att se "namn" på skärmen, det vill säga nyckeln från det sökte elementet med värdet "Mila".

Dessa två funktioner är mycket lika och skiljer sig faktiskt bara i returvärdet.

Hitta ett värde i en flerdimensionell matris

Men vad händer om vi arbetar med en flerdimensionell matris? När allt kommer omkring kommer andra matriser att vara dess element.

De algoritmer som vi redan har övervägt fungerar inte här.

Faktum är att allt inte är så svårt, du behöver bara komplicera hela mekanismen lite och använda en loop, till exempel, för varje () vilket fungerar utmärkt med matriser.

Låt oss säga att vi har en flerdimensionell array. Dess omedelbara värden är andra matriser som kan innehålla det önskade elementvärdet.

Allt som behöver göras är att iterera över elementen i den ursprungliga matrisen i en loop. för varje ()... Varje element i denna matris kommer att analyseras i en nyckel ($ key) och ett värde ($ value).

Värdet kommer att vara var och en av matriserna inuti den huvudsakliga flerdimensionella matrisen. Vi kommer att arbeta med dessa värden och leta efter det önskade elementvärdet i varje intern array.

När det hittas kommer vi att visa ett meddelande om att ett sådant element finns, och om inte, kommer vi att visa ett annat meddelande om att det inte finns något sådant element.

Låt oss se allt detta med en exempelkod:

"anna", "id" => 234); $ Mass2 = array ("name" => "anton", "id" => 24); $ Mass2 = array ("name" => "ivan", "id" => 007); foreach ($ Mass2 som $ key => $ value) ($ name. = in_array ("ivan", $ value);) om ($ name) eko "OK! Element här!"; annars eko "No have element!"; ?>

Som du ser deklarerar vi först själva flerdimensionella matrisen.

I det här fallet är det absolut nödvändigt att skriva här inte bara ett likhetstecken, utan ". =".

Detta görs så att $ namnvariabeln inte skrivs över vid varje iteration utan kompletteras. När allt kommer omkring, om elementet hittas vid den första iterationen och värdet "true" skrivs till variabeln $, och vid den andra iterationen (det vill säga i den andra interna matrisen) är det önskade värdet för elementet inte, då kommer värdet på variabeln $ name helt enkelt att skrivas över, och som ett resultat kommer vi helt enkelt inte att få det korrekta resultatet.

Som du förstår blir resultatet av arbetet med denna kod meddelandet ”OK! Element här! "

Prova att ändra elementet du letar efter till ett obefintligt element så ser du meddelandet "No have element!".

Naturligtvis, när vi hittar eller inte hittar ett visst element, kan vi inte bara visa meddelanden utan göra några andra åtgärder. Allt beror på vad du behöver göra. Om det till exempel finns ett önskat värde i en array kan du ge användaren viss specifik information etc.

Det är allt för idag! Hoppas självstudien var tydlig och hjälpsam! Försök att skriva liknande kod själv för att förstå allting helt.

Och jag väntar på dina kommentarer.

Dela lektionen med dina vänner med de sociala knapparna. nätverk nedan. Och prenumerera också på blogguppdateringar. Vi har redan samlat ett ganska bra arkiv med användbart material, och de kommer bara att fyllas på!

Jag önskar dig framgångsrik programmering!

Anna Kotelnikova var med dig!

En av huvudoperationerna när man arbetar med matriser är att hitta ett specifikt värde. Detta är vad PHP: s array_search () -funktion är till för. Den kan hantera både endimensionella och associativa samlingar och returnera nyckeln till det önskade värdet om det finns i matrisen.

Syntax

Den formaliserade beskrivningen av funktionen array_search () i PHP är följande:

Blandat array_search (blandat värde, array $ collection [, bool strikt])

Ingångsparametrar:

  • $ collection - matrisen som ska sökas;
  • värde - det önskade värdet av vilken typ som helst;
  • strikt är en valfri boolsk flagga som anger en strikt typmedveten jämförelsemekanism.

Arbetsmekanism

PHP: s array_search () -funktion jämför värde ett efter ett med alla värden i samlingsmatrisen. Som standard utförs jämförelsen utan hänsyn till operandens typer. Denna inställning kan ändras genom att den strikta flaggan sätts till TRUE. Strängjämförelser är skiftlägeskänsliga.

Om en matchning hittas returneras nyckeln som motsvarar det hittade elementet och funktionen avslutas. Därför kan den inte upptäcka flera förekomster av det önskade värdet i matrisen med dess hjälp.

Om ingen matchning hittas returnerar funktionen det booleska värdet FALSE.

Du bör testa det returnerade resultatet med operatören för strikt jämställdhet (===). Detta är viktigt eftersom funktionen kan returnera ett värde som kastas till FALSE, till exempel 0 eller en tom sträng.

Exempel på användning

Exempel 1. När en flerdimensionell array skickas till PHP -funktionen array_search () blir resultatet av operationen nyckeln till det nödvändiga elementet.

"vinter", "season2" => "vår", "season3" => "sommar", "season4" => "höst"); $ result1 = array_search ("vinter", $ array); $ result2 = array_search ("sommar", $ array); $ result3 = array_search ("april", $ array); ?>

I det här exemplet kommer variabeln $ result1 att sättas till "season1", $ result2 är lika med "season3" och $ result3 kommer att ställas in på det booleska värdet FALSE, eftersom strängen "april" inte visas i originalet array.

Exempel 2. Funktionen PHP array_search () kan också bearbeta en endimensionell array, med tanke på dess nycklar är nästa numeriska index i ordning.

Variabeln $ resultat kommer att tilldelas värdet 1, enligt indexet för "jägare" -elementet i $ -arrayen.

Exempel 3. Möjligt fel i analysen av resultatet.

"Washington", 1 => "Adams", 2 => "Jefferson", 3 => "Madison", 4 => "Monroe"); $ result = array_search ("Washington", $ presidenter); om (! $ resultat) (eko "G. Washington var inte USA: s första president";)?>

Så utan att kontrollera resultatet genom strikt jämlikhet kan du få ett oväntat meddelande om att George Washington inte var USA: s första president.

Exempel 4. Endast nyckeln till den första matchningen som hittas returneras.

Trots att det önskade värdet inträffar tre gånger i matrisen returnerar funktionen endast det första resultatet som hittats - 0. För att söka efter flera matchningar rekommenderas det att använda funktionen PHP array_keys ().

(PHP 4> = 4.0.5, PHP 5)

array_search - Söker i en array efter det angivna värdet och returnerar motsvarande nyckel om det lyckas

Beskrivning

blandad array_search(blandad nål, array höstack [, bool strikt])

Söker höstack efter nål och returnerar nyckeln, om den finns i matrisen, FALSK annat.

Kommentar: Om nål är en sträng, görs en skiftlägeskänslig jämförelse.

Kommentar: Före PHP 4.2.0, array_search ()återvände vid misslyckande NULL istället för FALSK .

Om du passerar värdet SANN som en valfri tredje parameter strikt, funktionen array_search () kommer också att kontrollera nåltypen i höstackmatrisen.

Om nålen visas mer än en gång i höstacken returneras den första nyckeln som hittades. Använd funktionen för att returnera nycklar för alla hittade värden array_keys () med en valfri parameter search_value.


Exempel 1. Exempel på användning array_search ()

$ array = array (0 => "blå", 1 => "röd", 2 => 0x000000, 3 => "grön", 4 => "röd"); $ key = array_search ("röd", $ array ); // $ key = 1;
$ key = array_search ("grön", $ array); // $ key = 2; (0x000000 == 0 == "grön")
$ key = array_search ("grön", $ array, true); // $ key = 3;
?>
Uppmärksamhet

Denna funktion kan returneras som ett booleskt värde FALSK och ett icke-boolskt värde som kastas till FALSK, till exempel 0 eller "". Mer information finns i avsnittet booleska typen. Använd === operatoren för att testa returvärdet för denna funktion.







2021 gtavrl.ru.