Avatar billede klovnefisken Nybegynder
09. november 2011 - 18:47 Der er 24 kommentarer og
1 løsning

søge i et array

array (en lang tekst, en tekst mere, en tekst mere)

kan nogen hjælpe mig med at lave en søgning i denne

hvis jeg søger på 'kst'(de sidste 3 bogstaver i tekst) skal der komme ud at den er fundet, jeg er lige glad med hvor , skal bare vide om det er i arrayet

på forhånd tak

Bruno
Avatar billede olebole Juniormester
09. november 2011 - 19:02 #1
<ole>


function isInArray($arr, $find) {   
    for ($i=0,$j=count($arr); $i<$j; $i++) {
        if (strpos($arr[$i], $find)!==false) return true;
    }
    return false;
}


/mvh
</bole>
Avatar billede olebole Juniormester
09. november 2011 - 19:11 #2
- og hvis bogstaverne skal stå sidst i en tekst, må det nok nærmere være:


function isInArray($arr, $find) {   
    for ($i=0,$j=count($arr); $i<$j; $i++) {
        if (preg_match("/".$find."$/", $arr[$i])) return true;
    }
    return false;
}

Avatar billede klovnefisken Nybegynder
09. november 2011 - 19:31 #3
takker den første klarede lige sagen
så send et svar og få dine point
M.V.H. Bruno
Avatar billede Qobra Nybegynder
09. november 2011 - 19:42 #4
olebole: Husk at escape $find, evt. med preg_quote, i din preg_match. Alternativt, så test om substr($arr[$i], -strlen($find)) == $find.
Avatar billede Qobra Nybegynder
09. november 2011 - 19:50 #5
I øvrigt kører count i konstant tid, så du vinder meget lidt ved at cache count i variablen $j. Men der er selvfølgelig ikke noget i vejen for at gøre det sådan, ville bare lige nævne det.
Avatar billede klovnefisken Nybegynder
09. november 2011 - 19:57 #6
nej det virker fint som det er lavet lige nu , men Qobra  jeg kan godt se hvad du mener
Avatar billede olebole Juniormester
09. november 2011 - 20:15 #7
@Qobra: Om count så kørte i bulgarsk sommertid, så tager det væsentligt længere tid at slå array'ets længde op i hvert gennemløb af løkken. Er du i tvivl, kan du jo teste  =)

Hvis kravet bliver udvidet fra, at "en tekst skal ende på 'kst'" til, at "en tekst skal ende på 'kst', men ikke må bestå af 'kst'", så skal man naturligvis teste, som du foreslår.
Avatar billede olebole Juniormester
09. november 2011 - 20:24 #8
- og en lille test viser, at besparelsen ved at cache længden af array'et ligger på ca. 80%
Avatar billede JensPeterSvensson Nybegynder
09. november 2011 - 21:22 #9
Hvis tid er relevant:

Ville du så spare endnu mere tid, hvis du erklæret den som en konstant?

Eller hvis du evt. tæller ned i stedet for op og sammen ligner mod en konstant værdi -1
Avatar billede Qobra Nybegynder
09. november 2011 - 21:28 #10
Det vigtige er bare at bemærke at besparelsen er konstant, altså uafhængig af antallet af elementer i arrayet. Man kunne nemlig blive fristet til at tro at count gennemløber arrayet hver gang man kalder count, men faktisk returnerer den bare en variabel. Det er helt i orden lige at spare lidt tid, ville som sagt bare lige nævne det :-)

olebole: Jeg forstår ikke hvad du mener med din sidste kommentar? Så vidt jeg kan se gør min substr sammenligning præcis det samme som din preg_match?
Avatar billede JensPeterSvensson Nybegynder
09. november 2011 - 21:38 #11
Hvis besparelsen var konstant, ville den ikke være 80%.

80% af 1time er ikke det samme som 80% af 1minut.
Avatar billede olebole Juniormester
09. november 2011 - 21:50 #12
#9 >> Den forstod jeg ikke.

#10 >> Uanset, om den returnerer en variabel eller ej, så giver det jo samme resultat: Det tager væsentligt længere tid og beslaglægger mindre ressourcer  =)
Avatar billede Qobra Nybegynder
09. november 2011 - 21:54 #13
JensPeterSvensson:
I princippet er det faktisk hurtigere at sammenligne med 0, så sparer du en minus operation. Så du kan bygge dit loop op sådan her: for ($i=count($a); $i--;) {}. Den gennemgår også elementerne {$a-1, $a-2, ..., 0}, men i omvendt rækkefølge. Om det giver en besparelse du nemt kan måle tvivler jeg på :-) I begge tilfælde sparer du dog overheadet i at kalde funktionen count.

Og ja, du sparer naturligvis tiden hver gang du ikke kalder funktionen. Men at hente værdien af $j tager langt under et ms., og at kalde count tager måske 5 gange så lang tid, altså stadig under et ms. Så dit loop skal virkelig være stort før det gør en forskel. Min pointe er, hvis count i stedet tæller elementerne i arrayet, så vil det tage længere tid at kalde count jo større arrayet er. Sådan er det heldigvis ikke, men hvis det var burde man altid gøre som olebole gør.
Avatar billede olebole Juniormester
09. november 2011 - 21:55 #14
#10 >> Nu forstår jeg, hvad du mente substr - og den er langt at foretrække for en RegExp-funktion  =)
Avatar billede Qobra Nybegynder
09. november 2011 - 21:57 #15
Hov, den gennemgår altså alle elementerne i $a, så hvis count($a) er 10 antager $i værdierne {9, 8, 7, ..., 0}, og ikke den andet jeg fik skrevet.
Avatar billede olebole Juniormester
09. november 2011 - 22:03 #16
@Qobra: Med et array med 50.000 elementer kan jeg ikke måle nogen forskel på at tælle ned à la #13 og mit forslag
Avatar billede Qobra Nybegynder
09. november 2011 - 22:04 #17
#12 b) Korrekt, jeg siger heller ikke at man ikke må gøre det, eller at det er en dårlig ide. Ville bare lige nævne at count ikke gør det man tror den gør :-) Personligt går jeg ikke så meget op i at lave sådan nogle små-optimeringer i php, da det i forvejen er meget langsomt og resursekrævende.
Avatar billede olebole Juniormester
09. november 2011 - 22:12 #18
#17 >> Nej, hvis man næsten ingen penge, skulle pokker da stå i at spare på dem!  :D
Avatar billede olebole Juniormester
09. november 2011 - 22:13 #19
"Nej, hvis man næsten ingen penge her"
Avatar billede Qobra Nybegynder
09. november 2011 - 22:14 #20
@olebole: Som sagt taler vi om en meget lille optimering, men hvis dit loop, ikke nødvendigvis gennem et array, skal køre 10^8 gange, så giver det faktisk en besparelse man kan måle. Helt præcist 2,8 sek. mod 4,6 sek. på min maskine:

$ cat testup.php   
<?
$j = 100000000;
for ($i = 0; $i < $j; $i++);
?>
$ time php testup.php
php testup.php  4.59s user 0.00s system 99% cpu 4.601 total
$ cat testdown.php
<?
$j = 100000000;
for ($i = $j; $i--;);
?>
$ time php testdown.php
php testdown.php  2.79s user 0.01s system 99% cpu 2.823 total
Avatar billede olebole Juniormester
09. november 2011 - 23:28 #21
Jamen, det kan du da! Men kan du ikke måle forskelle med mindre antal - eller har du en speciel trang til astronomiske overdrivelser?  =)

Derudover er det jo totalt uinteressant, at et enkelt loop ikke suger enorme mængder ressourcer - med mindre, man selvfølgelig kun afvikler sine sider lokalt, eller skriver/administrerer sider, ingen gider bruge. Med mange brugere og store applikationer har alle optimeringer interesse
Avatar billede Qobra Nybegynder
10. november 2011 - 09:43 #22
Den optimering med at tælle ned til nul nævner jeg kun fordi JensPeterSvensson spurgte om det i #9. Da man skal lave over en million iterationer for at mærke ændringen er den ligegyldig i praksis. Jeg bruger altid selv foreach når jeg gennemløber et array.
Avatar billede klovnefisken Nybegynder
24. januar 2012 - 16:29 #23
nu er det tid for at lukke denne , hvem vil have point for dette
Avatar billede olebole Juniormester
24. januar 2012 - 16:43 #24
Jeg samler ikke - ellers tak  =)
Avatar billede Qobra Nybegynder
24. januar 2012 - 17:00 #25
Så vil jeg da gerne tage dem :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester