2011-12-08 8 views
0

元の作成者が順序を示すために数値ではなくアルファベットを使用したデータファイルが与えられました。手紙の序数を取得PHP

例えば、10個の項目があります場合、彼らは命名されたい:

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

私は必要なint列としてorderを持っているMySQLのテーブルにこれらの値をインポートする必要がある、と私は変換する必要があり数字への手紙。

PHPに文字の数値を取得する関数はありますか?または、末尾の文字を取得するためにsubstrを実行し、文字のインデックス付き配列を作成し、その配列に対してルックアップを実行する必要がありますか?

私は上記の単純な方法を実行することを躊躇しています。なぜなら、オブジェクトの数が潜在的に存在する可能性があり、A-AAAAなどの配列を記述する必要があるからです。

+0

注:文字の数値(ASCIIの表現など)を探しているのではなく、**の序数**の値文字。非常にはっきりと違う - 私はそれを書くことができたら、私はあなたの質問のタイトルを変更することをお勧めします。 –

+0

@ Chris--はい、あなたは正しいです。先端に感謝します – julio

+0

手紙はどれくらいの高さですか? 'F'? 'Z'?彼らは '1'や' A'に折り返されますか? – webbiedave

答えて

0

SUBSTRと共に使用ord()とこれが等、2、1にBを設定します64を引く...

+0

@ Galen- 私はこのアプローチを使って良い値を得ていません: $ var = array( 'a'、 'b'、 'c'、 'd'、 'e'、 'f' ); foreach($ varとして$ v){ echo(ord($ v) - 64); //結果33 34 35 36 37 38 } ' – julio

+0

thats小文字を使用しているためです。あなたの例の文字は大文字です。もしそれらがすべての文字であれば、これを使用してください。文字と数字があり、おそらく16進数で、 'hexdec'を使用する必要があります。 – Galen

+0

@ Galen - そうです。ありがとう – julio

0

上記のことから、値(最後の数字)は16進数と考えることができます。その後、hexdec関数を使って10進数に変換することができます。

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

+0

彼はおそらくFを超える文字を持っているとうまくいかないでしょう。 – shesek

+0

あなたのコメントは理にかなっています。私の答えはもちろん、「値は16進数と考えることができる」場合にのみ有効です。もちろん、F以上の手紙はこの仮定を無効にする。 ;-) – maraspin

2

は、)(base_convertを使用して10のベースにベース36からそれを変換してみてくださいすなわちbase_convert($str, 36, 10)。最初にstrtolowerする必要があるかもしれません。大文字と小文字を区別しない場合にのみ動作します。

1

PHPはあなたのためにすべてのことを把握し、ような何かをする関数を書くことができますので、その配列を作成する簡単な方法があります。

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

次にあなたがSUBSTRを行うことができ、で手紙を見つけます最後に、それを関数に渡します:

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' 
); 

ものがすべてではないために、混同されています。しかし、あなたはその配列に機能sortdocs)を呼び出すことができますし、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と呼びました。ループあなたのソートされた配列と(例えば)データベースを更新します。

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

私はあなたの順序のため0を持っているために何かをしたくないという仮定に基づいて、ループ内でxに1を追加 - 「はISNの場合心配しなければ、xを使うことができます。これは、2行に同じ英数字ソート値がないことを前提にしています。

もしそうなら、すべてが失われません!

$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、の行の並べ替えの方法に対処するには、私の謙虚な視点でデータ設計を再検討する必要があります。

関連する問題