webForumDet fria alternativet

beskära array

7 svar · 414 visningar · startad av mappo

mappoMedlem sedan apr. 2001664 inlägg
#1

Jag vill beskära en array på samma sätt som en bild beskärs i ett ritprogram,
d.v.s. kasta bort allt som ligger utanför intervallet.
Säg att $array är en 100 celler lång lista med ord.
Jag vill bevara alla celler mellan den som innehåller ordet foo och den som innehåller ordet bar.

Typ såhär:

$foo_plats = findValue("foo" , $array) ;
$bar_plats = findValue("bar" , $array) ;
$beskuren = cropArray($array , $foo_plats , $bar_plats) ;

Nu ska första värdet i $beskuren vara foo och det sista bar. De mellanliggande
cellerna ska ha kopierats med bibehållen inbördes ordning ur $array.

Har någon värsta fiffiga idén?
Jag är inte ute efter de påhittade funktionerna i kodexemplet, bara resultatet.
Det verkar som array_splice är en bra kandidat till det jag kallade cropArray i mitt exempel...

SPiNMedlem sedan mars 20007 896 inlägg
#2
$foo_plats = array_search('foo', $array);
$bar_plats = array_search('bar', $array);
$beskuren = array_slice($array, $foo_plats, $bar_plats).

Inte array_splice(), men array_slice().

Du borde också lägga in felkontroller, vad händer om inte foo hittas? Vad händer om inte bar hittas? Vad händer om bar har ett lägre index än vad foo har?

mappoMedlem sedan apr. 2001664 inlägg
#3

Ja, sånt där ska finnas, men det får bli senare.
Jag vill få koden att fungera med "triviala" tillrättalagda fall först.

Jag var nog lite snål med informationen förut. Det är inte nödvändigtvis en array
som ska beskäras - det är en (extern) html-fil, jag har bara valt att läsa in
den till en array med file().

Jag vill alltså bevara alla rader som står mellan <pre> och </pre>.

Jag har testat med array_search() men den verkar bara klara av att hitta text,
inte taggar.

Idéer någon?

SPiNMedlem sedan mars 20007 896 inlägg
#4

Du borde läsa in filen med file_get_contents() så att du har sidan som en hel sträng, och därefter använda reguljära uttryck för att hämta information mellan pre-taggar.

$content = file_get_contents("http://domain.com/file.html");
preg_match_all("/<pre>(.*?)<\/pre>/ims", $content, $matches);
echo "Träffar:<br />";
print_r($matches);
mappoMedlem sedan apr. 2001664 inlägg
#5

Ok.
Jag tror jag fattar. Funkar det även om <pre> och </pre> står på olika rader?
I så fall vill jag ju att $matches ska bli de raderna.

SPiNMedlem sedan mars 20007 896 inlägg
#6

Nu ska den göra det. ;)

mappoMedlem sedan apr. 2001664 inlägg
#7

Najs! tack
Jag gjorde en egen ful-lösning oxå:

$content = file_get_contents("http://domain.com/file.html") ;
$content = explode("<pre>" , $content) ;
$content = explode("</pre>" , $content[1]) ;
$content = $content[0] ;

Alltså:
1. splitta på <pre>
2. splitta andra halvan av första splitten på </pre>
3. spara undan första halvan av senaste splitten

Nu har vi ju bara sparat mittendelen. Resultatet blir nog identiskt med ditt
regExp. Detta ska bli en funktion som tar en url som argument. Den kommer
sedan anropas 10-15 gånger, så frågan är:
Vad är effektivast - 20-30 explode med tillhörande överskrivningar, eller
10-15 regExp?

Å andra sidan spelar det nog ingen roll, för det som kommer ta tid blir ju att
hämta de externa html-filerna...

SPiNMedlem sedan mars 20007 896 inlägg
#8

Om du istället för regex använder explode(), så fungerar inte multipla pre-element. Med din explode-lösning så förutsätter du att det enbart finns ett element av typen pre.

Ang. prestanda så är reguljära uttryck sega, så det blir nog hugget som stucket vilket som är effektivast. Men som du säger är ju I/O den stora boven i prestandaförlust, så det kanske inte spelar någon roll. :)

137 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)