Harry: Inkrementieren bei Buchstaben

Beitrag lesen

Holladiewaldfee,

da ich da grade nicht durchblicke und es auf den ersten Blick auch viel zu einfach aussieht, hier mal meine Funktion:

---
<?php

function fAscciiInc($sString, $iInc)
{ # Hilfsarray
 $aBuchstaben = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');

# String zerlegen
 $aEinzeln = str_split(strrev($sString));

# Zu addierende Zahl in Potenzen der Basis zerlegen
 $aFac = fModB($iInc, count($aBuchstaben));

# Ueberpruefen, ob die Laenge des Basisstrings fuer die Addition ausreicht.
 # Wenn nicht, String mit Nullwerten auffuellen
 if(count($aFac)>count($aEinzeln))
 { for($i=count($aEinzeln); $i<count($aFac); $i++)
   $aEinzeln[$i] = $aBuchstaben[0]; }

# Addition durchfuehren
 for($i=0, $j=count($aEinzeln); $i<$j; $i++)
 { # Buchstaben in Zahl umwandeln
  $aEinzeln[$i] = array_search($aEinzeln[$i], $aBuchstaben);

# Entsprechenden Wert addieren
  $aRes = fZAdd($aEinzeln[$i], $aFac[$i], count($aBuchstaben));

# Neuen Wert zuweisen
  $aEinzeln[$i] = $aRes[0];

# Ueberpruefung, ob die naechste Potenz zusaetzlich erhoeht werden muss
  if($aRes[1]===true)
   $aFac[$i+1]++;

# Zahl wieder in Buchstaben umwandeln
  $aEinzeln[$i] = $aBuchstaben[$aEinzeln[$i]]; }

return strrev(implode('', $aEinzeln));
}

function fModB($iZahl, $iBase)
{ # Zerlegt eine Zahl in Potenzen von $iBase

# Startwert
 $iS = floor(log($iZahl, $iBase));
 $aMult = array();
 for($i=$iS; $i>-1; $i--)
 { # Ganzzahlige Division ohne Rest
  $aMult[$i] = floor($iZahl / pow($iBase, $i));

# Zahl um entsprechenden Betrag vermindern
     $iZahl -= $aMult[$i] * pow($iBase, $i); }
 return $aMult; }

function fZAdd($iZahl, $iInc, $iBase)
{ # Zunaechst einfache Addition
 $iZahl += $iInc;
 $bMod = false;

# Muss die naechste "Zahl" ebenfalls erhoeht werden?
 if($iZahl >= $iBase)
 { $iZahl -= $iBase;
  $bMod = true; }
 return array($iZahl, $bMod); }

echo fAscciiInc('abc', 328);
?>
---

Viel Spaß beim Verdauen, da steckt jede Menge Mathematik drin ;-)
Übrigens hab ich vorher einen Fehler gemacht, den Startwert für die Potenzzerlegung bekommst Du natürlich nicht aus der abgerundeten 26ten Wurzel sondern aus dem abgerundeten Logarithmus zur Basis 26.

Die Funktion oben ist übrigens so ausgelegt, daß sie mit jeder beliebigen Buchstabenbasis funktioniert, die Du in $aBuchstaben vorgibst. Das können auch Sonderzeichen sein. Oder Pommes. Oder Currywürste. Egal. Sie kann aber nur addieren - subtrahieren ist nicht. Du darfst sie aber gerne um die entsprechende Fähigkeit erweitern ;-)

bloss was muss ich mit "$endwert" machen, damit ich nachher "anu" herausbekomme?

Gar nichts ... es kommt nämlich "ans" heraus ;-)

Ciao,

Harry
 (der grade über einen höchstwahrscheinlich überflüssigen Feature-Artikel zum Thema "Rechnen mit abstrakten Gebilden" nachdenkt ...)
 (der die Funktion bei Gelegenheit mal zu einer Klasse erweitern wird, die dann auch subtrahieren und evtl. multiplizieren kann)

--
  Irgendwann kommt die Waldfee - oder auch nicht ... (Projektphase: Keine Ahnung)
  Bis dahin:
  Ski- und Bergtouren in den Tölzer Voralpen und im Karwendel