Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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]

Geschrieben

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]

Geschrieben

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

Geschrieben
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]

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...