/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Strpos funktion til returnering af flere p~
Fra : MipZhaP


Dato : 21-06-07 01:23

Hey NG,

Jeg ville lave en lidt udbedret funktion af strpos, lad mig give
et eksempel.

Hvis vi fx har en streng:
$string = "hva,sker,der,her";

Tager jeg så strpos($string, ",") så vil resultatet blive 3..
Men hva med alle de andre kommaner? Dem ville jeg også have deres
position på, i mit tilfælde vil jeg komme ud for situationer hvor
jeg ik aner hvor mange kommaer der er. Så jeg kom på følgende:

$index = 0; $offset = 0;
do
{
   $pos[$index++] = strpos($string, ",", $offset);
   $offset = $pos[$index];
} while(strpos($string, ",", $offset) === false);
   
echo $pos["1"]."<br/>";
echo $pos["2"]."<br/>";
echo $pos["3"]."<br/>";
echo $pos["4"];

Nedenstående med echo $pos["1"] osv. er bare til testen her, mit
problem ligger i at min do-while løkke ikke virker.. Arrayed $pos
bliver aldrig fyldt som jeg havde i tankerne, så min kildekode
bliver bare "<br/><br/><br/>"..

Hvordan kan det være?

På forhånd tak..

-// Marc Poulsen..

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Mads Lie Jensen (21-06-2007)
Kommentar
Fra : Mads Lie Jensen


Dato : 21-06-07 07:37

On 21 Jun 2007 00:22:54 GMT, MipZhaP <mipzhap@mipzhap.dk> wrote:

>Tager jeg så strpos($string, ",") så vil resultatet blive 3..
>Men hva med alle de andre kommaner? Dem ville jeg også have deres
>position på, i mit tilfælde vil jeg komme ud for situationer hvor
>jeg ik aner hvor mange kommaer der er. Så jeg kom på følgende:
>
>$index = 0; $offset = 0;
>do
>{
>   $pos[$index++] = strpos($string, ",", $offset);
>   $offset = $pos[$index];
>} while(strpos($string, ",", $offset) === false);

Mon ikke sidste linie skulle være_
} while(strpos($string, ",", $offset) !== false);

strpos() returnerer false hvis den ikke finder noget. Din løkke skal
køre så længe der _findes_ noget komma.
   
--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
Gartneriet - http://www.gartneriet.dk/

Bertel Lund Hansen (21-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 21-06-07 10:52

MipZhaP skrev:

> $index = 0; $offset = 0;
> do
> {
>    $pos[$index++] = strpos($string, ",", $offset);
>    $offset = $pos[$index];
> } while(strpos($string, ",", $offset) === false);

Du har to fejl. Den ene har Mads påpeget. Den anden er at du
søger fra $offset igen og finder det samme komma uendelig mange
gange.

Følgende er testet:

<?
$string='Dette, er, en, tekst, med, kommaer, i!';
echo $string."<br/>";
$pos=Array();
$offset=strpos($string, ",");
while($offset!==false) {
   $pos[]=$offset;
   $offset=strpos($string, ",", $offset+1);
}
foreach ($pos as $ps) echo $ps."<br/>";
?>

Der søges fra $offset+1 hvilket sikrer at det er næste komma man
finder.

Det er måske ikke nødvendigt at erklære $pos som et array først,
men gør det alligevel. Det letter læsningen af koden.

Det er unødvendigt med et indeks fordi $pos[] automatisk
refererer til næste ledige plads i arrayet.

Start med while-betingelsen. Det er ikke sikkert at der er noget
komma overhovedet, og på den måde sikrer man sig at der i så fald
slet ikke udføres en handling.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

MipZhaP (21-06-2007)
Kommentar
Fra : MipZhaP


Dato : 21-06-07 12:23

> > $index = 0; $offset = 0;
> > do
> > {

> >    $pos[$index] = strpos($string, ",", $offset);
> >    $offset = $pos[$index];
> > } while(strpos($string, ",", $offset) === false);
>
> Du har to fejl. Den ene har Mads påpeget. Den anden er at du
> søger fra $offset igen og finder det samme komma uendelig mange
> gange.
>
> Følgende er testet:
>
> <?
> $string='Dette, er, en, tekst, med, kommaer, i!';
> echo $string."<br/>";
> $pos=Array();
> $offset=strpos($string, ",");
> while($offset!==false) {
>    $pos[]=$offset;
>    $offset=strpos($string, ",", $offset+1);
> }
> foreach ($pos as $ps) echo $ps."<br/>";
> ?>
>

Kan godt se det med false/true, der har jeg sq sovet i timen :)

Det jeg bare ik forstår er, du siger at jeg finder det samme komma
uendeligt mange gange, men jeg får jo ændret $offset hver gang den
gennemgår min do løkke? Så den burde jo ikke finde det samme, ved
godt at den gør det, det kan jeg jo se når jeg tester, men forestår
det ik når jeg nu ændret på $offset..

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (21-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 21-06-07 12:43

MipZhaP skrev:

> Kan godt se det med false/true, der har jeg sq sovet i timen :)

Jeg tager lige et par sætninger:

   $offset=0;
   $string='Dette, er, en, tekst, med, kommaer, i!';
   $offset=strpos($string, ",", $offset);

$offset bliver sat til 5 fordi kommaet står på plads 5 (første
plads er 0). Næste gang bliver det:

   $offset=strpos($string, ",", 5);

men der søges fra og med position 5 - hvor der står et komma.
$offset bliver da igen sat til 5, og løkken standser aldrig.

> Det jeg bare ik forstår er, du siger at jeg finder det samme komma
> uendeligt mange gange, men jeg får jo ændret $offset hver gang den
> gennemgår min do løkke?

Nej, netop ikke. Den bliver udskiftet hver gang, men hele tiden
med samme tal.

Hvis strpos() ikke medtog første position ved sin søgning, ville
den jo springe over et komma på første plads (position 0).

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

MipZhaP (21-06-2007)
Kommentar
Fra : MipZhaP


Dato : 21-06-07 17:03

Så I teorien, ville min do-while-løkke fint fungere, hvis den bare lige
blev rettet lidt til, sådan at den ikke ender med at tjekke samme pos
hele tiden?

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (21-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 21-06-07 17:44

MipZhaP skrev:

> Så I teorien, ville min do-while-løkke fint fungere, hvis den bare lige
> blev rettet lidt til, sådan at den ikke ender med at tjekke samme pos
> hele tiden?

Den grundlæggende tankegang er god nok.

Din løkke vil fejle ved en streng hvor der slet ingen kommaer er.
Det skyldes at du starter med "do" som begynder med en handling
*før* der tjekkes nogen betingelse. Det er ikke altid rigtigt.

Hvis man derimod starter med "while", får man tjekket om
betingelsen er opfyldt *inden* der foretages en handling.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

MipZhaP (21-06-2007)
Kommentar
Fra : MipZhaP


Dato : 21-06-07 22:36

> Din løkke vil fejle ved en streng hvor der slet ingen kommaer er.
> Det skyldes at du starter med "do" som begynder med en handling
> *før* der tjekkes nogen betingelse. Det er ikke altid rigtigt.
>
> Hvis man derimod starter med "while", får man tjekket om
> betingelsen er opfyldt *inden* der foretages en handling.

Okey, mange tak for hjælpen og tiden i hvert fald :) Hjalp mig i hvert
fald.. :)

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Birger (23-06-2007)
Kommentar
Fra : Birger


Dato : 23-06-07 16:03

"MipZhaP" <mipzhap@mipzhap.dk> skrev i en meddelelse
news:467aef3c$0$90269$14726298@news.sunsite.dk...
>> Din løkke vil fejle ved en streng hvor der slet ingen kommaer er.
>> Det skyldes at du starter med "do" som begynder med en handling
>> *før* der tjekkes nogen betingelse. Det er ikke altid rigtigt.
>>
>> Hvis man derimod starter med "while", får man tjekket om
>> betingelsen er opfyldt *inden* der foretages en handling.
>
> Okey, mange tak for hjælpen og tiden i hvert fald :) Hjalp mig i hvert
> fald.. :)

Kan noget i retning af

$pos = array();
$offset = -1;
while ( $offset = strpos( $aString, ',', $offset++) !== false) {
$pos [] = $offset;
}

foreach ($pos as $ps) echo $ps."<br/>\n";

ikke bruges?
Er ikke helt sikker på, hvad der sker når/hvis offset bliver større end
længden af strengen - hvilket vil ske, hvis sidste karakter er et komma.

Birger



Bertel Lund Hansen (23-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 23-06-07 17:23

Birger skrev:

> Kan noget i retning af

Det er muligt at det kan rettes til, men selv om det kunne, ville
jeg ikke skrive så kompakt. Og igen selv om en tildeling og en
forøgelse ved samme variabel i samme linje kunne virke, ville jeg
ikke bruge det.

Men det fejler allerede inden det begynder. -1 er ikke tilladt
som offset i strpos.

> Er ikke helt sikker på, hvad der sker når/hvis offset bliver større end
> længden af strengen - hvilket vil ske, hvis sidste karakter er et komma.

Kan du ikke afprøve det?

I øvrigt virker den 'dobbelte tildeling' ikke. Hvis man sætter
$offset til 0 i starten, går det i en uendelig løkke hvor $offset
er 1.

Og bemærk at det ikke er mere effektivt end min 'udfoldede'
løkke. Det er de samme operationer der skal udføres.

Hvis man ikke har en tidskritisk opgave, bør man gå efter sikker
og letlæselig kode frem for hvad man mener er hurtigt.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (23-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 23-06-07 17:36

Bertel Lund Hansen skrev:

> Det er muligt at det kan rettes til

Det kan det faktisk:

   $pos = Array();
   $offset = 0;
   while (($offset = strpos( $string, ',', $offset)) !== false)
      $pos [] = $offset++;
   foreach ($pos as $ps) echo $ps."<br/>\n";

Bemærk at der er parentes om tildelingen

   ($offset = strpos( $string, ',', $offset))

Den er vigtig.

Men som sagt ville jeg ikke skrive sådan i noget kode der skal bruges.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Birger (24-06-2007)
Kommentar
Fra : Birger


Dato : 24-06-07 09:54

"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i en meddelelse
news:17yteldc9keeh.12by1ayily5zt.dlg@40tude.net...
> Bertel Lund Hansen skrev:
>
>> Det er muligt at det kan rettes til
>
> Det kan det faktisk:
>
> $pos = Array();
> $offset = 0;
> while (($offset = strpos( $string, ',', $offset)) !== false)
> $pos [] = $offset++;
> foreach ($pos as $ps) echo $ps."<br/>\n";
>
> Bemærk at der er parentes om tildelingen
>
> ($offset = strpos( $string, ',', $offset))
>
> Den er vigtig.
>
> Men som sagt ville jeg ikke skrive sådan i noget kode der skal bruges.
>
> --
> Bertel
> http://bertel.lundhansen.dk/ http://fiduso.dk/



$aString = ',her,er,en,tekst,med,komma,i,stedet,for,mellemrum,';
$pos = array();
$offset = -1;
while (( $offset = strpos( $aString, ',', ++$offset)) !== false) {
$pos[] = $offset;
}
foreach ( $pos as $ps) echo "$ps<br/>\n";
echo $aString;

output:
0<br/>
4<br/>
7<br/>
10<br/>
16<br/>
20<br/>
26<br/>
28<br/>
35<br/>
39<br/>
49<br/>
,her,er,en,tekst,med,komma,i,stedet,for,mellemrum,

Så det virker fortrintligt. Både først, sidst og midt imellem. (strpos
returnerer false, hvis offset > længen af strengen).
Oprindelige oplæg var ikke test, og gik lidt hurtigt.
$offset skal selvfølgelig incrementes, før den bruges i strpos - for at
undgå løkken -, og der skal naturligvis være () om assignment'en.

Forstår ikke hvad du mener med "sikker kode" - der er ikke noget usikkert i
ovenstående..?
Og det er - for mig - lige så let læseligt som din udfoldede version.

At du ikke vil "skrive sådan i noget kode der skal bruges", er helt fint.
Hver fugl synger med sit næb.
Men at du ikke bryder dig om melodien, betyder vel ikke at resten af verden
ikke må synge den?

Det har sikkert noget med vane at gøre.. ;>)

Birger



Bertel Lund Hansen (24-06-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-06-07 09:58

Birger skrev:

> Så det virker fortrintligt.

Ja, det fandt jeg også ud af bagefter. Det var (kun) den
manglende parentes der gjorde at det ikke virkede.

> Men at du ikke bryder dig om melodien, betyder vel ikke at
> resten af verden ikke må synge den?

Nej da.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste