2011-12-08 3 views
0

원래 작성자가 숫자 값보다는 알파벳 값을 사용하여 순서를 표시하는 데이터 파일을 받았습니다.문자의 서수 값을 얻으십시오. PHP

12342313A 
12342313B 
12342313C 
12342313D 
12342313E 
... 

내가 필요한 int 열로 order이있는 MySQL의 테이블에이 값을 가져와야하고 나는 변환해야 : 열 개 항목이 있는지

는 예를 들어, 그들은 지명 될 것 번호에 편지.

PHP에 글자의 숫자 값을 가져 오는 함수가 있습니까? 또는 후행 문자를 가져 오기 위해 substr을 수행하고 색인화 된 문자 배열을 만들고 해당 배열을 조회하면됩니까?

얼마나 많은 객체가 잠재적으로 존재할 수 있는지 알지 못하기 때문에 위의 간단한 방법을 수행하는 것을 주저합니다. A-AAAA 또는 다른 것으로 배열을 작성해야 할 수도 있습니다.

+0

메모 : 문자의 숫자 값 (ASCII 표현 등)을 찾는 것이 아니라 오히려 ** 서수 ** 값을 찾고있는 것처럼 보입니다. 편지. 아주 뚜렷하게 다른 점은 - 글을 쓰면 질문의 제목을 다시 지정하는 것이 좋습니다. –

+0

@ Chris-- 네, 맞습니다. 팁 주셔서 감사합니다 – julio

+0

글자는 얼마나 큽니까? 'F'? 'Z'? 그들은'1' 또는'A'로 돌아 다니는가? – webbiedave

답변

0

사용 ord() 뺀다 64. 이것은)

+0

@ Galen-- 이 접근법을 사용하여 좋은 값을 얻지 못했습니다 : '$ var = array ('a', 'b', 'c', 'd', 'e', ​​'f'); foreach ($ var as $ v) { echo (ord ($ v) - 64); // 결과 33 34 35 36 37 38 }' – julio

+0

그 소문자를 사용하기 때문에. 당신의 예문은 대문자였습니다. 만약 그들이 모든 글자라면 문자와 숫자가 있고 아마 16 진수이고'hexdec'을 사용해야한다면 이것을 사용하십시오 – Galen

+0

@ Galen - 맞아요. 감사 – julio

0

위에서 보았 듯이 값 (마지막 숫자)은 16 진수로 생각할 수 있습니다. 그런 다음 hexdec 함수를 통해 10 진수로 변환 할 수 있습니다. SUBSTR와

http://php.net/manual/en/function.hexdec.php

+0

그가 F를 초과하는 문자를 사용하면 작동하지 않습니다. – shesek

+0

의견이 맞습니다. 내 대답은 물론 "값이 16 진수로 간주 될 수있는 경우에만 유효합니다." F를 통한 문자는 물론이 가정을 무효로 만들 것입니다. ;-) – maraspin

2

베이스 (36)로 변환하는 단계 (base_convert를 사용하여 10 기지하려고 ... 등, (2), (1) B를 설정한다 즉 base_convert($str, 36, 10). 먼저 strtolower해야 할 수도 있습니다. 대소 문자를 구분하지 않는 경우에만 작동합니다.

1

PHP는 배열을 제작하는 간단한 방법이있다, 그래서 당신은 당신을 위해 모든 것을 파악하고 같은 것을 할 수있는 기능을 작성할 수 있습니다, 그리고 당신은 SUBSTR을 할 수

function str_to_num($letters, $max = 'ZZZZZZ') { 
     $count = 0; 
     for ($i = 'A'; $i < $max; $i++) { 
      $count++; 
      if ($letters == $i) 
       return $count; 
     } 
    } 

을에서 문자를 찾을 수 마지막으로 함수에 전달하십시오.

str_to_num('A'); // returns 1 
    str_to_num('AB'); // returns 28 
    str_to_num('AC'); // returns 29 
    str_to_num('ABC'); // returns 731 

어쨌든.

행운을 빈다.

1

당신이 수정해야 할 일회성 문제이며 앞으로 나아갈 생각이 없다고 가정하면 sort을 사용하여 문제를 해결하십시오. 다음과 같이 배열에 모든 영숫자 주문 입력란이 있다고 가정 해 보겠습니다.

$vals = array (
    '12342313A', 
    '12342313D', 
    '12342313E', 
    '12342313B', 
    '12342313C' 
); 

이러한 것들은 모두 순서가 뒤섞여 있지 않습니다. 그러나, 당신은 배열의 기능 sort (docs)를 호출 할 수 있습니다 및 PHP는 그것의 감각을 만드는 좋은 직업을 수행

print '<pre>Unsorted: '; 
    print_r($vals); 
    print '</pre>'; 

    sort($vals); 

    print '<pre>Sorted: '; 
    print_r($vals); 
    print '</pre>'; 

/* 
Unsorted: Array 
(
    [0] => 12342313A 
    [1] => 12342313D 
    [2] => 12342313E 
    [3] => 12342313B 
    [4] => 12342313C 
) 

Sorted: Array 
(
    [0] => 12342313A 
    [1] => 12342313B 
    [2] => 12342313C 
    [3] => 12342313D 
    [4] => 12342313E 
) 
*/ 

지금까지 너무 좋아. 이제 주문을 받았고 보너스로 데이터베이스의 새 필드로 배열 색인을 사용할 수 있습니다. 테이블을 변경하고 새 값을 보유 할 필드를 추가하십시오. 우리는이 필드를 numeric_order이라고 부를 것이고, 내 샘플에서는 현재 영숫자 정렬 데이터가 들어있는 필드를 호출했습니다 string_order.루프 당신의 정렬 된 배열하고 (예를 들어) 데이터베이스를 업데이트 : 나는 당신이 무엇이든은 주문 0를 갖고 싶어하지 않는 가정에 기초 루프에 x에 1을 추가

foreach ($vals as $x=>$v) { 
    $sql = 'UPDATE myTable SET numeric_order = '.($x+1).' WHERE string_order = "'.$v.'"'; 
} 

- 그 ISN 경우 ' 걱정할 필요가 없다면 x을 사용해도됩니다. 이것은 또한 두 행에 동일한 영숫자 정렬 값이 없다는 가정에 근거합니다.

만약 그렇다면 모두 손실되지 않습니다! 배열은 다음과 같습니다.

$vals = array (
    3=>'12342313A', 
    15=>'12342313D', 
    66=>'12342313E', 
    101=>'12342313B', 
    200=>'12342313C' 
); 

... 숫자 키는 해당 행의 고유/기본 키를 나타냅니다. 내 기본 가정이 잘못하고있는 경우

$ord = 1 
foreach ($vals as $x=>$v) { 
    $sql = 'UPDATE myTable SET numeric_order = '.$ord.' WHERE id = "'.$x.'"'; 
    $ord++; 
} 

계속 것 : 다음 루프는 다음과 같습니다 - 대신 (docs을 키를 보존 않는 ) asort를 사용하여 키를 보존하지 않습니다 sort의 행을 정렬하는이 방법을 처리하기 위해 내 겸손한 견해에서 데이터 디자인을 다시 고려해야합니다.