2013-01-16 8 views
6

Wie kann ich eine Funktion schreiben, die mir Anzahl der Zeichen gibt, diePHP Funktion Get Character Nummer

Zum Beispiel an sie übergeben wird, wenn der funciton Name GetCharacterNumber ist und ich B es passieren, dann sollte es geben 2 ich

GetCharacterNumber("A") // should print 1 
GetCharacterNumber("C") // should print 3 
GetCharacterNumber("Z") // should print 26 
GetCharacterNumber("AA") // should print 27 
GetCharacterNumber("AA") // should print 27 
GetCharacterNumber("AC") // should print 29 

Ist es sogar möglich, dies zu erreichen?

+0

Ist dies eine benutzerdefinierte Bestellung? Hast du eine Tabelle mit allen möglichen Werten? – Deleteman

+0

Möchten Sie Werte für "AAA", "AAHJSNDJS" usw. zurückgeben? –

+0

Was soll 'BA' zurückgeben? – h2ooooooo

Antwort

3

nicht sehr effizient, aber erhält die Arbeit erledigt:

function get_character_number($end) 
{ 
    $count = 1; 
    $char = 'A'; 
    $end = strtoupper($end); 
    while ($char !== $end) { 
     $count++; 
     $char++; 
    } 
    return $count; 
} 

echo get_character_number('AA'); // 27 

demo

Dies funktioniert, weil, wenn Sie so etwas wie $char = 'A' bekommen und tun $char++, wird es auf ‚B‘ ändern, dann ‚C‘ , 'D', ... 'Z', 'AA', 'AB' und so weiter.

Beachten Sie, dass dies umso langsamer wird, je länger $end ist. Ich würde dies nicht für etwas anderes als 'ZZZZ' (475254 Iterationen) empfehlen oder wenn Sie so viele Lookups benötigen.

$string = strtolower($string); 
$result = 0; 
$length = strlen($string); 
foreach($string as $key=>$value){ 
    $result = ($length -$key - 1)*(ord($value)-ord(a)+1); 
} 

und Ergebnis enthalten würde, was Sie wollen:

Eine Alternative mit besserer Leistung

function get_character_number($string) { 
    $number = 0; 
    $string = strtoupper($string); 
    $dictionary = array_combine(range('A', 'Z'), range(1, 26)); 
    for ($pos = 0; isset($string[$pos]); $pos++) { 
     $number += $dictionary[$string[$pos]] + $pos * 26 - $pos; 
    } 
    return $number; 
} 

echo get_character_number(''), PHP_EOL; // 0 
echo get_character_number('Z'), PHP_EOL; // 26 
echo get_character_number('AA'), PHP_EOL; // 27 

demo

+0

Das ist fantastisch .. kann ich nicht danken genug – skos

+0

@Sachyn Die Version mit [ord] (http://stackoverflow.com/a/14358603/956397) ist schneller und sauberer. – PiTheNumber

+0

Für eine optimale Lösung überprüfen Sie meine Antwort, zum Beispiel funktionierte es für 'ZZASDAASDAA', das Ergebnis wurde in 0,0001 Sekunden generiert. –

11

Es gibt eine Funktion namens ord, die Ihnen die ASCII-Nummer des Zeichens gibt.

ord($chr) - ord('A') + 1 

gibt Ihnen das richtige Ergebnis für ein Zeichen. Für längere Strings können Sie eine Schleife verwenden.

<?php 
    function GetCharacterNumber($str) { 
     $num = 0; 
     for ($i = 0; $i < strlen($str); $i++) { 
      $num = 26 * $num + ord($str[$i]) - 64; 
     } 
     return $num; 
    } 
    GetCharacterNumber("A"); //1 
    GetCharacterNumber("C"); //3 
    GetCharacterNumber("Z"); //26 
    GetCharacterNumber("AA"); //27 
    GetCharacterNumber("AC"); //29 
    GetCharacterNumber("BA"); //53 
?> 
+0

Ich korrigierte meine Schleife – Dutow

+1

für AA, es geniert (((* 26) +1) * 26) +1, was die richtige Antwort ist. Für BA ist es (((0 * 26) +2) * 26) +1, was auch richtig ist, denke ich. Also sind Doppelbuchstaben korrekt. Für "AAA" berechnet es 26 * 27 + 1, was auch korrekt sein sollte (26 für einzelne Buchstabenvariationen, 26 * 26 für Doppelbuchstaben, und dies ist der erste Drei-Buchstaben-Code) – Dutow

1

Hier ist der vollständige Code, der das tut, was Sie wollen.

Getestet und funktioniert perfekt für die Beispiele, die Sie gaben.

define('BASE', 26); 

function singleOrd($chr) { 
    if (strlen($chr) == 1) { 
     return (ord($chr)-64); 
    } else{ 
     return 0; 
    } 
} 


function multiOrd($string) { 
    if (strlen($string) == 0) { 
     return 0; 
    } elseif (strlen($string) == 1) { 
     return singleOrd($string); 
    } else{ 
     $sum = 0; 
     for($i = strlen($string) - 1; $i >= 0; $i--) { 
      $sum += singleOrd($string[$i]) * pow(BASE, $i); 
     } 
    } 
    return $sum; 
} 
3

Nutzungsbereich und strpos:

$letter = 'z'; 
$alphabet = range('a', 'z'); 
$position = strpos($alphabet, $letter); 

Für Doppelbuchstaben (zB zz) Sie wahrscheinlich benötigen, um Ihre eigenen Alphabet mit einer benutzerdefinierten Funktion zu erstellen:

$alphabet = range('a', 'z'); 
$dictionary = range('a','z'); 
foreach($alphabet AS $a1){ 
    foreach($alphabet AS $a2) { 
     $dictionary[] = $a1 . $a2; 
    } 
} 

Dann nutzen $ Wörterbuch anstelle von $ alphabet.

0

Ich denke, ord ein effizienter Weg sein, sollten Sie Ihre Nummer haben würde .