Gå til innhold

Må jeg eksplodere/implodere string for hver gang jeg skal behandle den?


Anbefalte innlegg

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
Videoannonse
Annonse

  // ### 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

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

// ### 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 av TT88
Lenke til kommentar

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

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

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

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?

  • Liker 2
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...