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