webForumDet fria alternativet

A, B, C.... är ingen bokstav?

PHP

5 svar · 433 visningar · startad av aasah

Medlem sedan mars 20034 471 inlägg
Frågan#1

Jag läser in en fil med fält avgränsade på bestämt sätt. Tolkar infon baserat på dessa taggar och ska stoppa in dem i min databas i slutändan. Eftersom filen skrivs av människor och ska tolkas av en maskin har jag en REJÄL koll i början av att innehållet är angivet på avsett format. Denna koll fungerar inte direkt som jag hade tänkt mig... :OO A, B, C... et c är inga bokstäver!?

Utdrag ur filen skrev:

...

A¤5¤A (5-6)¤
........¤

B¤1¤B (1-7)¤
.........¤

//Ovanstående ligger i $filstr
function recursiveTrimCW(&$cw) {
   if (!is_array($cw))
      trim($cw);
   else {
      foreach($cw as $key => $i) {
          recursiveTrimCW($i);
      }
   }
}

function display(&$cw) {
   foreach($cw as $key => $wordInfo)  
      echo "cw[$key] => $wordInfo<--<br>";
}

  $cw = explode("[*]", $filStr);
   foreach($cw as $key => $wordInfo) { 
      if ($key == 0) {
         //....
      }
      else { 
         $cw[$key] = explode('¤', $cw[$key]);
         //.......
      }
   }
   recursiveTrimCW($cw);
   display($cw);

Detta ger utskriften

Utskrift i utdrag skrev:

cw[1][0] => A<--
cw[1][1] => 5<--
cw[1][2] => A (5-6)<--
...
cw[2][0] => B<--
cw[2][1] => 1<--
cw[2][2] => B (1-7)<--
...

Att se till borde mellanslaget före A resp B vara det mellanslag som själva echo-satsen innehåller. Inga konstiga tecken, inget underligt alls. Ändå skriker följande koll fel:

if (!preg_match('/^[A-Z]$/', $wordInfo[0]))
   $error[$wordIx] .= "The StartRow, ({$wordInfo[0]}), should be a letter.

Och utskriften blir:

Utdrag av felmeddelande skrev:

The StartRow ( A) should be one letter.
The StartRow ( B) should be one letter.

Va? Var kommer detta extra mellanslag ifrån? Och hur har det klarat sig undan trimningen? :q

Vad är det jag inte ser?

Medlem sedan aug. 20039 340 inlägg
#2

När du anropar trim som du gör skrivs den trimmade strängen aldrig tillbaka till arrayen. (trim opererar inte på pekare utan ger svaret som returvärde) Att du inte ser mellanslaget annars beror på att HTML sammanfogar flera mellanslag på raken. (Du har ju redan ett precis innnan strängen i utskriften) Ändra utskriften till

echo "cw[$key] =>$wordInfo<--<br>";

så bör du se det. (Eller sätt ut pre-taggar runt hela det utskrivna blocket.)

Jag skulle rekommendera något sådant här istället:

function recursiveTrimCW(&$cw) { 
   foreach($cw as $key => $i) { 
      if (is_array($i))
         recursiveTrimCW($i);
      else
         $cw[$key] = trim($i);
   }
}

(Edit: Fixade en liten bugg)

Medlem sedan mars 20034 471 inlägg
#3

nitro2k01 skrev:

När du anropar trim som du gör skrivs den trimmade strängen aldrig tillbaka till arrayen. (trim opererar inte på pekare utan ger svaret som returvärde) Att du inte ser mellanslaget annars beror på att HTML sammanfogar flera mellanslag på raken. (Du har ju redan ett precis innnan strängen i utskriften) ...

Åhå! Tusen tack! Inte minst för den uttömmande förklaringen! :bire :birp

Medlem sedan mars 20034 471 inlägg
#4

Nu var jag lite väl snabb... trots att jag ersatte min trimfunktion med din, som dessutom gör det hela i en bättre ordning, så kvarstår felet.

Medlem sedan aug. 20039 340 inlägg
#5

Hoppsan... Jag hade glömt att lägga till ett & till $i i foreach-loopen, vilket gör att $i behandlas som en pekare. När man gör det kan man till och med utelämna $key och köra bara med $i.

function recursiveTrimCW(&$cw) { 
   foreach($cw as &$i) { 
      if (is_array($i))
         recursiveTrimCW($i);
      else
         $i = trim($i);
   }
}
Medlem sedan mars 20034 471 inlägg
#6

Nu funkar det! Tackar! :D

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)