Tool-Time Geschrieben 11. Juni 2010 Geschrieben 11. Juni 2010 Hi, ich brauche eimal euren Rat, vermutlich habe mich aktuell total verbaut Ich bin dabei eine Funktion zu schreiben die folgendes erledigen soll. 1) einen Übergeben String in ein Array Überführen (explode) 2) die länge jedes Wortes ermitteln 3) den String neu zusammensetzten, so das eine maximal Anzahl an Zeichen pro Array Feld nicht überschritten wird. 4) Array zurück geben. Soweit so gut, hört sich am Anfang nicht so schwierig an. Jedoch bekomme ich den 3ten Teil nicht sauber gelöst. Im Nachfolgenden Codeauszug wird die Wort länge überprüft und beibedarf das Wort gekürzt und im Array angefügt (diese wird richtig aufgebaut). Das Zielarray mit den fertigen String dagegen wird nicht richtig aufgebaut. Ich erhalte z.B. nach dem zerlegen jedesmal das Zerlegte Wort doppelt, ohne das ich mir einen Reihm daraus machen kann. Vermutlich sehe ich vor lauter Code den Fehler nicht. $i_arrExplode = 0; $i_Linecount = 1; $lineSize = 0; $runWhile = TRUE; $lineWord = ""; $Word = ""; $WordSize = 0; $maxChar = 16; $BreakMarker = FALSE; $lineSize_tmp = 0; while($runWhile === TRUE){ $WordSize = strlen($arrExplode['array'][$i_arrExplode]); if($WordSize>$maxChar){ $arrSplitWord = str_split($arrExplode['array'][$i_arrExplode], $maxChar-1); // slicen $slicePoint = $i_arrExplode+1; $arrExplode['array'] = array_slice($arrExplode['array'], $slicePoint); // Zusammenfügen $arrExplode['array'] = array_merge($arrSplitWord, $arrExplode['array']); $arrExplode['arraySize'] = count($arrExplode['array']); $this->setWordLengt($arrExplode); $BreakMarker = TRUE; $i_arrExplode = 0; }//ende maxChar $Word = $arrExplode['array'][$i_arrExplode]; $WordSize = strlen($arrExplode['array'][$i_arrExplode]); $lineSize_tmp = 0; $lineSize_tmp = $lineSize+$WordSize+1; //+1 für Blankzeichen beim zusammenfügen $this->opMSG("".$lineSize." | ".$lineSize_tmp." ", 2); $lineWord_tmp = $lineWord." ".$Word; switch(TRUE){ case $lineSize_tmp>$maxChar: print "switch 2 case 1 $lineWord <br> "; $LineSet['range'][$i_Linecount] = $i_arrExplode; $LineSet['word'][$i_Linecount] = trim($lineWord); $lineSize = 0; $lineSize_tmp = 0; $lineWord = ""; $lineWord_tmp = ""; $i_Linecount++; break; case $i_arrExplode==($arrExplode['arraySize']): print "switch 2 case 2 <br>"; $LineSet['range'][$i_Linecount] = $i_arrExplode; $LineSet['word'][$i_Linecount] = trim($lineWord); $lineWord = ""; $lineWord_tmp = ""; $lineSize = 0; $lineSize_tmp = 0; $runWhile=FALSE; break; default: print "switch 2 default <br>"; $lineSize = $lineSize_tmp; $lineWord = $lineWord_tmp; $i_arrExplode++; if($BreakMarker==TRUE){ $BreakMarker = FALSE; }else{ $i_arrExplode++; } break; }// ende switch if($runWhile==FALSE){ break; } }// ende while schleife [/PHP] Schon einmal danke für jeden Denkanstoss . Viele Grüße Tool-Time Zitieren
Mike1990 Geschrieben 11. Juni 2010 Geschrieben 11. Juni 2010 Hallo, ich verstehe ehrlich gesagt nicht wieso du so langen Quellcode hast. Zum einen ist der bissl unübersichtlich und ich blicke da nicht wirklich durch. Du willst einen Array übergeben und Pro Array Feld mit Text Darf maximal 16Zeichen stehen und die restlichen sollen abgeschnitten werden? Hier ist eine Funktion die einen Array Rekusriv (Auch Mehrdimensionale Arrays) durchläuft und überall Maximal 16 Zeichen stehen lässt. <?php function parseArray($array) { $maxLength = 16; foreach ($array as $key => $value) { if (gettype($array[$key]) == "array") { $array[$key] = parseArray($value); } else { if (strlen($array[$key]) > $maxLength) { $array[$key] = substr($value,0,$maxLength); } } } return $array; } ?>[/PHP] Zitieren
flashpixx Geschrieben 11. Juni 2010 Geschrieben 11. Juni 2010 Ist Dein Code nicht etwas "oversized"? Wenn ich Dich richtig verstehe, willst Du, dass jedes Wort eine bestimmte Länge nicht überschreitet function setWordLength( $pstr, $pwordlength, $pseperator=" " ) { if (!is_string($pstr) || !is_string($pseperator) || !is_int($pwordlength) || $pwordlength < 1) return null; $larr = explode($pseperator, $pstr); foreach ($larr as &$lword) $lword = substr($lword, 0, $pwordlength); return implode($pseperator, $larr); } [/PHP] Zitieren
Tool-Time Geschrieben 11. Juni 2010 Autor Geschrieben 11. Juni 2010 Danke für deine Antwort, ich geb dir recht, durch's viele experementieren ist der code ganz schön unübersichtlich geworden und oversized. Ich versuch mein Problem einmal anders zu schildern : Es gibt einen String, dieser besteht aus "Am Freitag geht die Fußball-WM endlich los. Dummerweise". Dieser wird per explode in ein Array überführt $arrExplode[0] = "Am" $arrExplode[1] = "Freitag" .... [/PHP] Jetzt soll anahnd einer maximalen Zeichenlänge der String verlegt und neu ins Array überführt werden. Was möchte ich damit erreichen ? Am ende soll ein Array stehen was pro Array[n] eine gewisse Wörter bzw. Zeichenanzahl enthält. Das könnte dann so aussehen [PHP] $maxZeichen = 10 $arrExplode[0] = "Am Freita" $arrExplode[1] = "g geht die Fuß" $arrExplode[n] = ..... Hoffe ich konnte meine Gedanken damit etwas besser erklären. Viele Grüße Tool-Time Zitieren
flashpixx Geschrieben 11. Juni 2010 Geschrieben 11. Juni 2010 function setWordLength( $pstr, $pwordlength, $pseperator=" " ) { if (!is_string($pstr) || !is_string($pseperator) || !is_int($pwordlength) || $pwordlength < 1) return null; $larr = explode($pseperator, $pstr); for($i=0; $i < count($larr)-1; ++$i) { $larr[$i+1] = substr($larr[$i], $pwordlength).$pseperator.$larr[$i+1]; $larr[$i] = substr($larr[$i], 0, $pwordlength); } $la = null; $last = count($larr)-1; if (strlen($larr[$last]) > $pwordlength) $la = setWordLength(substr($larr[$last], $pwordlength), $pwordlength, $pseperator); $larr[$last] = substr($larr[$last], 0, $pwordlength); if (!empty($la)) $larr = array_merge($larr, $la); return $larr; }[/PHP] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.