2013-01-16 11 views
6

मैं एक समारोह है कि मुझे चरित्र है कि यहपीएचपी समारोह प्राप्त करने के लिए चरित्र संख्या

उदाहरण के लिए करने के लिए पारित हो जाता है की संख्या देता है कैसे लिख सकता है, अगर funciton नाम GetCharacterNumber है और मैं B इसे करने के लिए पारित तो यह देना चाहिए मुझे 2

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 

क्या यह हासिल करना भी संभव है?

+0

क्या यह एक कस्टम ऑर्डर है? क्या आपके पास सभी संभावित मूल्यों वाला एक टेबल है? – Deleteman

+0

क्या आप चाहते हैं कि यह "एएए", "अहजेंडजेएस" आदि के लिए मूल्य वापस करे? –

+0

'बीए' वापसी क्या होनी चाहिए? – h2ooooooo

उत्तर

3

बहुत ही कुशल नहीं लेकिन काम किया हो जाता है , 'डी', ... 'जेड', 'एए', 'एबी' और इसी तरह।

ध्यान दें कि यह धीमा हो जाएगा $end है। मैं 'ZZZZ' (475254 पुनरावृत्तियों) से परे किसी भी चीज़ के लिए इसकी अनुशंसा नहीं करता हूं या यदि आपको इस तरह के कई लुकअप की आवश्यकता है।

एक बेहतर प्रदर्शन करने वाले विकल्प

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

यह शानदार है .. धन्यवाद पर्याप्त – skos

+0

@Sachyn [ord] के साथ संस्करण (http://stackoverflow.com/a/14358603/956397) तेज़ और क्लीनर है। – PiTheNumber

+0

अधिक इष्टतम समाधान के लिए मेरा उत्तर जांचें, उदाहरण के लिए यह 'ZZASDAASDAA' के लिए काम करता है, परिणाम 0.0001 सेकंड में उत्पन्न हुआ था। –

11

ord नामक एक फ़ंक्शन है जो आपको चरित्र की ASCII संख्या देता है।

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

आपको एक चरित्र के लिए सही परिणाम देता है। लंबे तारों के लिए, आप एक लूप का उपयोग कर सकते हैं।

<?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

में कॉलमइंडेक्सफ्रॉमस्ट्रिंग() विधि को देखें IAA के लिए मेरे लूप – Dutow

+1

को सही करता है, यह जेनरेट करता है (((0 * 26) +1) * 26) +1, जो सही उत्तर है। बीए के लिए, यह है ((0 * 26) +2) * 26) +1, जो भी सही है, मुझे लगता है। तो डबल अक्षर सही हैं। "एएए" के लिए, यह 26 * 27 + 1 की गणना करता है, जो भी सही होना चाहिए (एकल अक्षरों के लिए 26, डबल अक्षरों के लिए 26 * 26, और यह पहला तीन अक्षर कोड है) – Dutow

1

यहां पूरा कोड है जो आप चाहते हैं।

इसका परीक्षण किया और आपके द्वारा दिए गए उदाहरणों के लिए पूरी तरह से काम करता है।

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

उपयोग रेंज और strpos:

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

डबल पत्र के लिए (जैसे ZZ) आप शायद एक कस्टम समारोह का उपयोग कर अपनी खुद की वर्णमाला बनाने की आवश्यकता होगी:

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

तब का उपयोग $ वर्णमाला के स्थान पर $ शब्दकोश।

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

यह काम करता है, क्योंकि जब आप $char = 'A' की तरह कुछ हो गया और $char++ करते हैं, यह 'बी' के लिए बदल जाएगा, तो 'सी':

0

होगा मुझे लगता है कि ord अपना नंबर करने के लिए एक अधिक कुशल तरीका होना चाहिए:

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

और परिणाम होते हैं कि आप क्या चाहते ।

संबंधित मुद्दे