2013-01-16 24 views
6

Làm thế nào tôi có thể viết một hàm cung cấp cho tôi số điện thoại của nhân vật đó được truyền cho nóPHP Function Để Nhận Character Số

Ví dụ, nếu tên funciton là GetCharacterNumber và tôi vượt qua B với nó thì nó sẽ cho me 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 

Thậm chí có thể đạt được điều này không?

+0

Đây có phải là đơn hàng tùy chỉnh không? Bạn có một bảng với tất cả các giá trị có thể? – Deleteman

+0

Bạn có muốn nó trả về các giá trị cho "AAA", "AAHJSNDJS" không? –

+0

Điều gì nên 'BA' trở lại? – h2ooooooo

Trả lời

3

Không rất hiệu quả nhưng được công việc làm:

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

này hoạt động bởi vì khi bạn có một cái gì đó giống như $char = 'A' và làm $char++, nó sẽ thay đổi để 'B', sau đó 'C' , 'D',… 'Z', 'AA', 'AB', v.v.

Lưu ý rằng điều này sẽ trở thành chậm hơn, số $end càng dài. Tôi sẽ không khuyên bạn nên điều này cho bất cứ điều gì vượt quá 'ZZZZ' (475254 lặp) hoặc nếu bạn cần nhiều tra cứu như thế.

Một biểu diễn thay thế tốt hơn sẽ là

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

Điều này thật tuyệt .. không thể cảm ơn bạn đủ – skos

+0

@Sachyn Phiên bản với [ord] (http://stackoverflow.com/a/14358603/956397) nhanh hơn và sạch hơn. – PiTheNumber

+0

Để có giải pháp tối ưu hơn, hãy kiểm tra câu trả lời của tôi, ví dụ như nó hoạt động cho 'ZZASDAASDAA', kết quả được tạo ra trong 0,0001 giây. –

11

Có chức năng gọi là ord cung cấp cho bạn số ASCII của ký tự.

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

cung cấp cho bạn kết quả chính xác cho một ký tự. Đối với các chuỗi dài hơn, bạn có thể sử dụng vòng lặp.

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

Tôi đã sửa vòng lặp – Dutow

+1

cho AA, nó sinh ra (((0 * 26) +1) * 26) +1, đó là câu trả lời đúng. Đối với BA, đó là (((0 * 26) +2) * 26) +1, cũng đúng, tôi nghĩ vậy. Vì vậy, hai chữ cái là chính xác. Đối với "AAA", nó tính 26 * 27 + 1, cũng phải chính xác (26 cho các chữ cái đơn, 26 * 26 cho chữ cái kép, và đây là ba chữ cái đầu tiên) – Dutow

1

Đây là mã đầy đủ thực hiện những gì bạn muốn.

Đã thử nghiệm và hoạt động hoàn hảo cho các ví dụ bạn đã cung cấp.

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

Sử dụng phạm vi và strpos:

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

Đối với chữ kép (ví dụ như zz) có lẽ bạn sẽ cần phải tạo ra bảng chữ cái của riêng bạn bằng cách sử dụng chức năng tùy chỉnh:

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

Sau đó sử dụng $ dictionary thay cho $ alphabet.

0

Tôi nghĩ ord nên có một cách hiệu quả hơn để có số điện thoại:

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

và kết quả sẽ chứa những gì bạn muốn .

Các vấn đề liên quan