Komprimieren und Dekomprimieren

Ensaw

Mitglied
Hey Tutorials.de-Community,

ich hoffe ich bin hier mit meinem Anliegen richtig.

Und zwar habe ich ein kleines Problem. Ich bin noch recht unerfahren im Gebiet "PHP" und möchte mit kleinen Schritten anfangen.

Ich habe ein kleines Skript geschrieben, das mir aus einer Wörterkette also einem String wie z.B. "ABBCCADDDEEEEAFFFFF" automatisch "A 2B 2C A 3D 4E A 5F" ausgibt. Nun möchte ich aber das dieses Skript das auch zurück formen kann. Sprich zu "ABBCCADDDEEEEAFFFFF".

Hier mein Code für den ersten hinweg
PHP:
<?php

$s = "ABBCCCADDDDFFFFFABB";
$char = "";
$count = 0;

for ($i = 0; $i < strlen($s); $i++) { 
	if ($s[$i] == $char) { 
	$count++; 
	}
	
	else {
		if ($char != "") {
			if ($count < 2) {
				echo $char.' | ';
			}
			
			else {
				echo $count.' '.$char.' | '; 
			}
		}
			$count = 1;
			$char = $s[$i];
	}
}
echo $count.' '.$char;
?>

Kann mir da jemand helfen?
 
Ich habe mich auch mal daran ausprobiert und bin auf eine sehr saubere Möglichkeit gestoßen:
PHP:
abstract class CustomCompressor {
  # ABBCCCADDDDFFFFFABB => A B2 C3 A D4 F5 A B2
  public static function compress( $string ) {
    $result = array();
	
    if ( !preg_match_all( '/(.)(\\1*)/', $string, $matches ) ) {
      return '';
    }

    foreach( $matches[0] as $i => $string ) {
      $char = $matches[1][$i];

      if ( strlen( $string ) > 1 ) {
        array_push( $result, $char . strlen( $string ) );
      } else {
        array_push( $result, $char );
      }
    }

    return implode( ' ', $result );
  }

  # A B2 C3 A D4 F5 A B2 => ABBCCCADDDDFFFFFABB
  public static function decompress( $string ) {
    $result = array();

    if ( !preg_match_all( '/([^ ])([0-9]*)/', $string, $matches ) ) {
      return '';
    }

    foreach( $matches[1] as $i => $char ) {
      $occurence = empty( $matches[2][$i] ) ? 1 : (int) $matches[2][$i];
      array_push( $result, str_repeat( $char, $occurence ) );
    }

    return implode( $result );
  }
}
Und du kannst das so verwenden
PHP:
$string = 'ABBCCCADDDDFFFFFABB';

$compressed   = CustomCompressor::compress( $string );
$decompressed = CustomCompressor::decompress( $compressed );

var_dump( $compressed );   # returns 'A B2 C3 A D4 F5 A B2'
var_dump( $decompressed ); # returns 'ABBCCCADDDDFFFFFABB'

var_dump( $decompressed === $string ); # returns true
 
Zuletzt bearbeitet:
Also in der Methode "compress" suche ich mit dem regulären Ausdruck ein Zeichen und schaue dann nach, ob dieses Zeichen danach noch einmal oder mehrmals auftaucht, und zwar solange, bis keine Zeichen mehr vorhanden sind oder ein anderes Zeichen erscheint. Und dann zähle ich, wie oft es auftaucht: bei nur einem wird der Multiplier weggelassen, ansonsten wird er angehängt. Das mache ich mit allen Zeichen und speichere diese jeweils in das Ergebnisarray. Am Ende füge ich die Teile dessen zu einer Zeichenkette zusammen und zwar durch ein Leerzeichen getrennt.

Bei der Methode "decompress" schaue ich nach allen Zeichen, die kein Leerzeichen sind, und schaue nach, ob danach eine oder mehrere Ziffern erscheinen. Falls keine Ziffer angegeben ist, setze ich den Multiplier auf 1. Und mit "str_repeat" wiederholte ich ein Zeichen eben so oft, wie es der Multiplier angegeben hat. Am Ende füge ich diese Fragmente wieder zu einer Zeichenkette zusammen.

Aber eigentlich ist mein Skript aussagekräftig genug.
 

Neue Beiträge

Zurück