php: Zahl in Alphabet umwandeln und umgekehrt

Lesezeit: 6 Minuten

Benutzer-Avatar
Lichtsäule

Also ich habe diese Funktion:

function toAlpha($data){
    $alphabet =   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');
    $alpha_flip = array_flip($alphabet);
    if($data <= 25){
      return $alphabet[$data];
    }
    elseif($data > 25){
      $dividend = ($data + 1);
      $alpha="";
      $modulo;
      while ($dividend > 0){
        $modulo = ($dividend - 1) % 26;
        $alpha = $alphabet[$modulo] . $alpha;
        $dividend = floor((($dividend - $modulo) / 26));
      } 
      return $alpha;
    }
}

was eine gegebene Zahl in Zeichen umwandelt und es funktioniert gut

aber dann möchte ich auch eine umgekehrte Funktion davon, die bei jeder Ausgabe dieser Funktion genau die Eingabe zurückgibt, die eingegeben wurde, um diese Ausgabe zu erzeugen, und ich habe Folgendes versucht:

function toNum($data){
$alphabet =   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');
    $alpha_flip = array_flip($alphabet);
  if(strlen($data) == 1){
          return (isset($alpha_flip[$data]) ? $alpha_flip[$data] : FALSE);
        }
        else if(strlen($data) > 1){
          $num = 1;
          for($i = 0; $i < strlen($data); $i++){
            if(($i + 1) < strlen($data)){
              $num *= (26 * ($alpha_flip[$data[$i]] + 1));
            }
            else{
              $num += ($alpha_flip[$data[$i]] + 1);
            }
          }
          return ($num + 25);
        }
}

aber es funktioniert nicht richtig … toAlpha (728) produziert ‘aba’, aber toNum (‘aba’) produziert 1378 statt 728 …

was habe ich falsch gemacht? Wie kann ich die Reverse-Funktion reparieren, damit sie richtig funktioniert?

vielen Dank im Voraus!

  • Sie versuchen also, eine Zahl zur Basis 10 in die Basis 26 umzuwandeln, ist es das?

    – Mathieu Dumoulin

    5. Oktober 2011 um 15:57 Uhr

  • Was soll die ursprüngliche toAlpha-Funktion tun? Was ist das gewünschte Verhalten, wenn die Zahl über 25 liegt?

    – Alex Turpin

    5. Oktober 2011 um 15:57 Uhr

  • es wird zu Doppelbuchstaben, Dreifachbuchstaben usw. z. B.: 26 = aa, 27 = ab usw

    – Lichtsäule

    5. Oktober 2011 um 15:59 Uhr

  • Wenn ‘a’ Ihre 0 ist, sollte aa dann nicht auch 0 sein? Zumindest, wenn Sie nur versuchen, eine direkte Basis-26 mit Buchstaben anstelle von Zahlen zu implementieren.

    – Hammerit

    5. Oktober 2011 um 16:12 Uhr

  • Das gewünschte Ergebnis beider Funktionen ist wirklich unklar. Können Sie erklären, was die Funktionen genau ausgeben sollen und nach welchen Regeln?

    – Anständiger Dabbler

    5. Oktober 2011 um 16:14 Uhr

Benutzer-Avatar
Kyrill

Kürzester Weg, in PHP >= 4.1.0

$alphabet = range('A', 'Z');

echo $alphabet[3]; // returns D

echo array_search('D', $alphabet); // returns 3

  • Hervorragende und zeitsparende Antwort.

    – Schüler

    12. April 2016 um 10:26 Uhr

  • Dies funktioniert nicht mit Ganzzahlen, die die Länge des Alphabet-Arrays überschreiten; zB “42”.

    – kirgisisch

    26. Mai 2016 um 10:37 Uhr

  • @kirgy Ich habe eine Antwort basierend auf diesem Fall gepostet, die mit ganzen Zahlen funktioniert, die die Länge des Alphabet-Arrays überschreiten.

    – rvbarreto

    18. März 2019 um 17:10 Uhr

  • Danke für diese kurze Antwort.

    – Spieler1

    2. Dezember 2019 um 20:29 Uhr

Benutzer-Avatar
Hammerit

Ich verstehe überhaupt nicht die Logik, die Sie in dieser Funktion verwenden möchten. Was Sie zu tun versuchen, scheint sehr seltsam zu sein (warum wird ‘a’ auf Null abgebildet und doch ‘aa’ auf 26 abgebildet?), Aber das scheint zu funktionieren. (Sie werden einige weitere Testfälle verwenden wollen, ich habe nur überprüft, ob es die richtige Ausgabe für den Fall ‘aba’ gibt.)

function toNum($data) {
    $alphabet = 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'
                       );
    $alpha_flip = array_flip($alphabet);
    $return_value = -1;
    $length = strlen($data);
    for ($i = 0; $i < $length; $i++) {
        $return_value +=
            ($alpha_flip[$data[$i]] + 1) * pow(26, ($length - $i - 1));
    }
    return $return_value;
}

  • Zur Basis 10 ist der Nachfolger von 9 nicht 00. Warum also ist aa der Nachfolger von z?

    – Hammerit

    6. Oktober 2011 um 0:39 Uhr

  • Excel macht das. Vielleicht hat @pillarOfLight versucht, etwas mit Tabellenkalkulationen herauszufinden.

    – Stéphane

    13. September 2012 um 3:03 Uhr

  • $alphabet = range(‘a’, ‘z’);

    – Westseite

    9. Oktober 2012 um 20:51 Uhr

  • @Hammerite hat mich verwirrt, aber nach dem einzelnen Zeichen das zweite a in aa verschiebt dies von Basis 26 nach base 27 da es einen Positionswert hat (also az PLUS das Fehlen eines a = 27 Zeichen). Es ist als ob 001 101!

    – Sei nett

    6. November 2018 um 12:11 Uhr

  • Blöde Fragestunde. 1) Warum braucht man ` $alpha_flip = array_flip($alphabet);` und im Original gibt es eine Zeile $modulo;. Beides wirkt überflüssig. 2) Ich habe oben gefragt, werde es aber hier wiederholen: Was macht das %? (Ich habe Goog, PHP.net, SO usw. ausprobiert, aber die Suche mit a % ist ziemlich unterhaltsam.)

    – Sei nett

    6. November 2018 um 15:06 Uhr


Es gibt eine sehr clevere Lösung von Theriault in den Kommentaren von PHPs base_convert-Funktion

/**
* Converts an integer into the alphabet base (A-Z).
*
* @param int $n This is the number to convert.
* @return string The converted number.
* @author Theriault
* 
*/
function num2alpha($n) {
    $r="";
    for ($i = 1; $n >= 0 && $i < 10; $i++) {
    $r = chr(0x41 + ($n % pow(26, $i) / pow(26, $i - 1))) . $r;
    $n -= pow(26, $i);
    }
    return $r;
}
/**
* Converts an alphabetic string into an integer.
*
* @param int $n This is the number to convert.
* @return string The converted number.
* @author Theriault
* 
*/
function alpha2num($a) {
    $r = 0;
    $l = strlen($a);
    for ($i = 0; $i < $l; $i++) {
    $r += pow(26, $i) * (ord($a[$l - $i - 1]) - 0x40);
    }
    return $r - 1;
}

  • Funktioniert hervorragend mit jeder Nummer: num2alpha(25) → “Z”, num2alpha(26) → “AA”, …

    – Philipp

    31. Juli 2020 um 14:42 Uhr

  • Tipp: Verwenden 97 Anstatt von 0x41 und 96 Anstatt von 0x40 um Kleinbuchstaben zu erhalten. Oder verwenden strtolower() um das Ergebnis in Kleinbuchstaben umzuwandeln

    – Philipp

    31. Juli 2020 um 14:44 Uhr

Von Zahl zu Alphabet (mit A=0, B=1, etc…):

function toAlpha($num){
    return chr(substr("000".($num+65),-3));
}

Mit der Funktion können Sie dasselbe vom Alphabet zur Zahl machen ord().

Wenn Sie 65 durch 97 ersetzen, erhalten Sie die Kleinbuchstaben.

Benutzer-Avatar
Mason Lastkahn

Ihre Probleme kommen von Ihrer Karte. Schau dir das an:

$alpha[0] = 'Alphabet';
for ($i = 'a'; $i<'z'; $i++) {
    $alpha[] = $i;
}
$alpha[26] = 'z';

Sie können dies so hoch ausführen, wie Sie möchten und Ihr Serverspeicher dies zulässt. Das PHP ist fehlerhaft, und (zumindest auf meinem Server) wenn Sie den Operator <= verwenden:

$alpha[0] = 'Alphabet';
for ($i = 'a'; $i<='z'; $i++) {
    $alpha[] = $i;
}

dann wird es den ganzen Weg abbilden [676]=> Zeichenkette(2) “yz”! Man muss nur damit spielen.

Ich wollte keinen Buchstaben zuordnen [0] Also habe ich einfach einen Titel hineingegeben. Natürlich können Sie es weglassen, wenn Sie 0 => a, 1 => b usw. wollen.

Sobald das Array korrekt ist, ist die Funktion trivial.

  • eine Linie : range('a', 'z')

    – Panik

    13. Mai 2015 um 14:03 Uhr

Unter Verwendung von Cyrils Antwort habe ich ein wenig für einen Fall mit mehr als einem Buchstaben ausgearbeitet.

function lettersToNumber($letters){
    $alphabet = range('A', 'Z');
    $number = 0;

    foreach(str_split(strrev($letters)) as $key=>$char){
        $number = $number + (array_search($char,$alphabet)+1)*pow(count($alphabet),$key);
    }
    return $number;
}

Nachfolgend werden einige Ergebnisse für die Funktion angezeigt:

lettersToNumber("A"); //returns 1
lettersToNumber("E"); //returns 5
lettersToNumber("Z"); //returns 26
lettersToNumber("AB"); //returns 28
lettersToNumber("AP"); //returns 42
lettersToNumber("CE"); //returns 83

  • eine Linie : range('a', 'z')

    – Panik

    13. Mai 2015 um 14:03 Uhr

Benutzer-Avatar
Jignesh Joisar

Zahl in Alphacode umwandeln

zum Beispiel: 1402 nach bax

function number_to_alpha($num, $code)
{   
    $alphabets = 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');

    $division = floor($num / 26);
    $remainder = $num % 26; 

    if($remainder == 0)
    {
        $division = $division - 1;
        $code .= 'z';
    }
    else
        $code .= $alphabets[$remainder];

    if($division > 26)
        return number_to_alpha($division, $code);   
    else
        $code .= $alphabets[$division];     

    return strrev($code);
}

um Alphacode in Zahl umzuwandeln

zum Beispiel: bax bis 1402

function alpha_to_number($code)
{
    $alphabets = 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');

    $sumval = 0;

    $code = strtolower(trim($code));

    $arr = str_split($code);
    $arr_length = count($arr);

    for($i = 0, $j = $arr_length-1; $i < $arr_length; $i++, $j--)
    {
        $arr_value = array_search($arr[$i], $alphabets);
        $sumval = $sumval + ($arr_value * pow(26, $j));
    }

    return $sumval;
}

1225600cookie-checkphp: Zahl in Alphabet umwandeln und umgekehrt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy