---
title: "A, B, C.... är ingen bokstav?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/178005-a-b-c-är-ingen-bokstav"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "aasah"
published: "2009-04-13T15:19:50.000Z"
updated: "2009-04-13T16:28:22.000Z"
replies: 5
views: 438
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/178005-a-b-c-är-ingen-bokstav"
---

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

## #1 — aasah, 2009-04-13T15:19Z

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)¤
> .........¤

```php
//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:

```php
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?

Permalänk: https://www.webforum.nu/p/178005

## #2 — nitro2k01, 2009-04-13T15:35Z

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)

Permalänk: https://www.webforum.nu/p/2181738

## #3 — aasah, 2009-04-13T15:43Z

> **[nitro2k01 skrev:](https://www.webforum.nu/p/1464204)**
>
> 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

Permalänk: https://www.webforum.nu/p/2181740

## #4 — aasah, 2009-04-13T15:54Z

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.

Permalänk: https://www.webforum.nu/p/2181743

## #5 — nitro2k01, 2009-04-13T16:09Z

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);
   }
}
```

Permalänk: https://www.webforum.nu/p/2181745

## #6 — aasah, 2009-04-13T16:28Z

Nu funkar det! Tackar! :D

Permalänk: https://www.webforum.nu/p/2181747

---

Tråden på webben: https://www.webforum.nu/amne/php/178005-a-b-c-är-ingen-bokstav
