Mittels FOR-Schleife Alphabet erzeugen, abhängig von INT[] Wert

Mik3e hat gesagt.:
1. Ist deine Funktion nicht unendlich
Doch ist sie, zumindest gültig für alle Int-Werte, die in den Wertebereich der Ganzzahlen in PHP fallen.
Mik3e hat gesagt.:
2. Ist sie mit der For-Schleife sicher bedeudent langsamer als eine rekursive Funktion wie meine :))
Die for-Schleife ist zum testweisen erzeugen einer ganzen Reihe von Dezimalzahlen dargestellt als "Alpha"-Zahlen.
(Die while-Schleife dient der Formatierung, um den Text mit Nullen (=A) aufzufüllen.)
Die eigentliche Funktion ist nur diese:
PHP:
function decToAlpha($int) {
    return ((floor($int/26)>0)
                ?decToAlpha(floor($int/26))
                :'')
            .chr($int%26+65);
}
Die ist auch rekursiv.

Mik3e hat gesagt.:
Außerdem haben wir beide folgendes Problem:

chr() müsste das alphabet folgendermaßen mappen:
A = 0
B = 1...
als chr()=chr()-1

DENN:
In Deinem Fall würde "Z" nicht funktionieren...
Da "Z" modulo 26 = 0 ergibt..
Und 0 ist kein ordinaler Wert...
Ich habe noch gar keine Funktion geschrieben, die aus "Alpha" einen Dezimalwert macht.

Zur Erklärung, wie ich mir das gedacht habe:
Bei mir steht A für 0, B für 1, usw. und Z für 25. Entsprechend dem Dezimalsystem steht die letzte Stelle für "Ziffer" mal 26 hoch 0, die vorletzte für "Ziffer" mal 26 hoch 1 usw. BC entspricht somit 2 * 26^0 + 1 * 26^1 = 28.
Die führenden A's haben somit keine Bedeutung, da sie 0 repräsentieren.

Dass ich die Funktion mit "Schleifenvariable" - 1 (=$z) aufrufe, liegt daran, dass Du die 1 auf A Mappen wolltest.

Vielleicht habe ich das dargestellte Problem auch noch nicht verstanden.

Gruß hpvw
 
Mik3e hat gesagt.:
Hi!

Kann sein, dass Du gerade die funktion chr() nachgebaut hast

LG
Mike
Nein, ich habe eine Funktion, ähnlich wie [phpf]dechex[/phpf] gebaut, nur dass Dezimalzahlen nicht in Zahlen mit 0 bis F als Ziffern umgewandelt werden, sondern in "Zahlen" mit A bis Z als Ziffern.

Gruß hpvw
 
Habe mir deine Funktion nun näher angesehen..
Irgendwo ist noch der Hund drin..

Habe es mit 731 getestet (=ABC)..
mit
PHP:
echo decToAlpha(731);
erhalte ich BCD statt ABC (also genau um 1 versetzt).

Weiters erzeugt er beim Durchlauf:

X
Y
Z
BA
..

Also verkehrt herum (du musst den bestehende string immer hinten anhängen) und er lässt AA aus (Da 26%26==0 ist und damit die Funktion ausgehebelt ist).

Das ist der Grund, warum meine Funktion so lange ist. Kann man aber sicher noch kürzen..
 
Zuletzt bearbeitet:
Mik3e hat gesagt.:
Habe es mit 731 getestet (=ABC)..
mit
PHP:
echo decToAlpha(731);
erhalte ich BCD statt ABC (also genau um 1 versetzt).
Nicht so, wie ich es beschrieben habe:
A=0, B=1, C=2, D=3 usw.

B*26^2+C*26^1+D*26^0
=1*26^2+2*26^1+3*26^0
=26^2+2*26+3
=676+52+3
=731

Mik3e hat gesagt.:
Weiters erzeugt er beim Durchlauf:

X
Y
Z
BA
..

Also verkehrt herum (du musst den bestehende string immer hinten anhängen)
Nicht nach den Zahlensystemen, die ich kenne (z.B: Binär, Hexadezimal, Dezimal, Oktal). In allen Systemen steht die kleinste Einheit hinten.

Mik3e hat gesagt.:
und er lässt AA aus (Da 26%26==0 ist und damit die Funktion ausgehebelt ist).
AA ist nach meiner Rechnung 0, genauso, wie A und genauso, wie 00 in allen anderen Zahlensystemen.

Gruß hpvw
 
hpvw hat gesagt.:
AA ist nach meiner Rechnung 0, genauso, wie A und genauso, wie 00 in allen anderen Zahlensystemen.

Genau das darf eben nicht sein.
Denn AA ist in meinem Fall der Wert 27 und nicht der Wert 00.

LG
Mike
 
Mik3e hat gesagt.:
Genau das darf eben nicht sein.
Denn AA ist in meinem Fall der Wert 27 und nicht der Wert 00.
Aha, Definitionsfrage. Jetzt bin ich mir relativ sicher, was Du meinst:
PHP:
function decToAlphaStart1($int) {
    return ((floor(($int-1)/26)>0)
                ?decToAlphaStart1(floor(($int-1)/26))
                :'')
            .chr(($int-1)%26+65);
}
Gruß hpvw

EDIT: Ich habe jetzt zur Übung auch noch mal die Umkehrfunktionen geschrieben, einmal als "Zahlensystem", mit 'A' als 0 und einmal mit Deinem System, wobei 'A' "bevorzugt" verwendet wird und 1 repräsentiert. Hier die 4 Funktionen:
PHP:
function decToAlpha($dec) {
    return ((floor($dec/26) > 0)
                ?decToAlpha(floor($dec/26))
                :'')
            .chr($dec%26 + 65);
}

function alphaToDec($alpha) {
    $a = strtoupper(trim($alpha));
    $dec = 0;
    for ($i = 0; $i < strlen($a); $i++) {
        $dec += (ord($a{$i}) - 65)
                * pow(26,strlen($a)-$i-1);
    }
    return $dec;
}

function decToAlphaStart1($dec) {
    return ((floor(($dec-1)/26) > 0)
                ?decToAlphaStart1(floor(($dec-1)/26))
                :'')
            .chr(($dec-1)%26 + 65);
}

function alphaToDecStart1($alpha) {
    $a = strtoupper(trim($alpha));
    $dec = 0;
    for ($i = 0; $i < strlen($a); $i++) {
        $dec += (ord($a{$i}) - 64)
                * pow(26,strlen($a)-$i-1);
    }
    return $dec;
}
(Zugegebenermaßen sieht die Rückumwandlung Deiner Funktion erstaunlich ähnlich.)
 
Zuletzt bearbeitet:
Zurück