affe90 Skrevet 7. oktober 2011 Del Skrevet 7. oktober 2011 Hei! Holder på med et prosjekt der vi skal behandle stringer på ulike måter. Nesten en slags odalizer. Har litt problemer med å få brukt ulike stringfunksjoner. Må jeg eksplodere/implodere string for hver gang jeg skal behandle den? 1. Har en string med tekst som jeg eksploderer til en array. Dette fungerer 2. Går igjennom en "ordbok"-array med foreach hvor jeg erstatter ord i tekstreng. Dete fungerer. Problemet er at vi skal teste ut ulike stringfunksjoner. Jeg vil for eksempel at alle ord, større enn seks i lengde skal bli til uppercase. Dette får jeg ikke til, og det ødeleger veldig mye. Tror det er pure logikkproblemer. Noen som kan hjelpe? På forhånd takk. <?php // String, tekst for endring $userInput = strtolower("jeg liker ikke deg. Jeg er glad i vann og kaffe og tronderlagen"); // Lager array av string $tekst = explode(" ", $userInput); // Definerer en "ordbok $ordbok = array("ikke" => "itj", "jeg" => "eg"); foreach($ordbok as $k => $e) { $tekst = str_replace($k, $e, $tekst); } // Imploderer array tilbake til string for videre behandling. $tekst = implode(" ", $tekst); //Eksploderer string for behandling $tekst = explode(" ", $tekst); // ### HER BLIR DET PROBLEMER foreach($tekst as $e) { if(strlen($e) > 6) { $e = sttoupper($e) // HVORDAN SKAL JEG TENKE HER?! } } $tekst = implode(" ", $tekst); echo $tekst; ?> Lenke til kommentar
torbjørn marø Skrevet 7. oktober 2011 Del Skrevet 7. oktober 2011 // ### HER BLIR DET PROBLEMER foreach($tekst as $e) { if(strlen($e) > 6) { $e = sttoupper($e) // HVORDAN SKAL JEG TENKE HER?! } } Bruk en for-løkke, ikke foreach, og så setter du $tekst[$index] = sttoupper($tekst[$index]) i loopen (inne i if'en), hvor $index er løkke-variabelen. Slå opp dokumentasjonen på for om du ikke skjønner det. Ser forresten ingen grunn til at du må implodere og så explodere igjen.. Lenke til kommentar
affe90 Skrevet 7. oktober 2011 Forfatter Del Skrevet 7. oktober 2011 Hei, og takk for svar! Ser poenget ditt, men det endrer vel bare en bestem posisjon som jeg angir og ikke de ordene som ER STØRRE enn seks? Har du et annet eksempel? // ### HER BLIR DET PROBLEMER foreach($tekst as $e) { if(strlen($e) > 6) { $e = sttoupper($e) // HVORDAN SKAL JEG TENKE HER?! } } Bruk en for-løkke, ikke foreach, og så setter du $tekst[$index] = sttoupper($tekst[$index]) i loopen (inne i if'en), hvor $index er løkke-variabelen. Slå opp dokumentasjonen på for om du ikke skjønner det. Ser forresten ingen grunn til at du må implodere og så explodere igjen.. Lenke til kommentar
TT88 Skrevet 7. oktober 2011 Del Skrevet 7. oktober 2011 (endret) // ### HER BLIR DET PROBLEMER for ($i = 0; $i < $tekst.size(); $i++){ if ( strlen($tekst[$i]) > 6) $tekst[$i] = sttoupper($tekst[$i]) } Noe slikt Torbjørn foreslo. Mulig jeg blander java og php her, men give it a try Endret 7. oktober 2011 av TT88 Lenke til kommentar
FraXinuS Skrevet 7. oktober 2011 Del Skrevet 7. oktober 2011 En enkel måte å gjøre det på er: ### HER BLIR DET PROBLEMER foreach($tekst as &$e) { if(strlen($e) > 6) { $e = strtoupper($e); // HVORDAN SKAL JEG TENKE HER?! } } Legg merke til "&" som er satt foran $e. Dette gjør at du jobber med en referanse til innholdet som er lagret i $e, istedenfor en kopi. Lenke til kommentar
torbjørn marø Skrevet 7. oktober 2011 Del Skrevet 7. oktober 2011 Legg merke til "&" som er satt foran $e. Dette gjør at du jobber med en referanse til innholdet som er lagret i $e, istedenfor en kopi. Oy, det var både en spennende og skummel feature! :o Lenke til kommentar
torbjørn marø Skrevet 7. oktober 2011 Del Skrevet 7. oktober 2011 Hvis du ikke vil loope så kan du også bruke map: <?php function longWordsToUpper($word) { if (strlen($word) > 6) { return(strtoupper($word)); } else { return($word); } } $tekst = array_map("longWordsToUpper", $tekst); ?> Koder ikke noe særlig PHP selv, men map er en typisk funksjon som finnes i de fleste språk. Lenke til kommentar
affe90 Skrevet 8. oktober 2011 Forfatter Del Skrevet 8. oktober 2011 Takk for svar, alle sammen! Løste det enkelt med en FOR-løkke. Har nå lært nye nytt, og forstått at med foreach jobber du kun med av en kopi av det faktiske elementet og ikke kan endre på det, mens med en FOR-løkke kan man gå direkte inn i elementet å endre. Lenke til kommentar
torbjørn marø Skrevet 8. oktober 2011 Del Skrevet 8. oktober 2011 Har nå lært nye nytt, og forstått at med foreach jobber du kun med av en kopi av det faktiske elementet og ikke kan endre på det, mens med en FOR-løkke kan man gå direkte inn i elementet å endre. Du må gjerne tenke sånn, men det er ikke helt nøyaktig. Vil gjerne forsøke å forklare... Når du sier f.eks.: $foo = "hello"; Hva er $foo for noe da? Det er ikke strengen "hello". Det er en variabel som peker til et sted i minnet hvor strengen "hello" er lagret. Sier jeg videre: $foo = "bye!" så har jeg ikke endret strengen "hello". Jeg har endret varabelen $foo til å peke til en ny verdi! Og det er derfor for-løkken fungerer, men foreach ikke gjør det, fordi: foreach($tekst as $e) { // her er $e en ny variabel som peker til en verdi i arrayet } .. mens .. for ($i = 0; $i < $tekst.size(); $i++) { // her jobber du med pekerne i $tekst-variabelen direkte $tekst[$i] = .... } Gav det mening? 2 Lenke til kommentar
affe90 Skrevet 8. oktober 2011 Forfatter Del Skrevet 8. oktober 2011 For en superenkel og oversiktlig forklaring. Det gav absolutt mening! Igjen, tusen takk. Du er vel en av de største programmeringsguruene på Freak/HW jeg vet om, stå på Lenke til kommentar
JohndoeMAKT Skrevet 10. oktober 2011 Del Skrevet 10. oktober 2011 Mens jeg ikke får sove skrev jeg hvordan dette ikke bør gjøres. One-line-style. <?php var_dump(preg_replace('/(\w\w\w\w+)/e', "strtoupper('\\1')", str_replace(array(' er ', ' en '), array(' e ', ' ein '), 'dette er en streng'))); 1 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå