得到字母PHP的序数值

时间:2011-12-08 22:41:21

标签: php

我收到了一个数据文件,原始创建者使用字母而不是数字来显示顺序。

例如,如果有十个项目,则将其命名为:

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

我需要将这些值导入到order作为必需int列的mySQL表中,我需要将该字母转换为数字。

PHP中是否有函数来获取字母的数值?或者我是否需要执行substr来获取尾随字母,并创建一个索引的字母数组并对该数组进行查找?

我对上面这么简单的方法犹豫不决,因为我不知道有多少对象可能存在,我可能需要从A-AAAA或其他东西写一个数组。

5 个答案:

答案 0 :(得分:2)

尝试使用base_convert()将其从base 36转换为base 10,即。 base_convert($str, 36, 10)。您可能需要首先使用strtolower,并且只有在不区分大小写的情况下它才会起作用。

答案 1 :(得分: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

无论如何都是这样的。

祝你好运。

答案 2 :(得分: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.'"';
}

我在循环中添加1到x,假设你不希望任何东西有0的订单 - 如果这不是一个问题,那么你可以使用x。这也是基于没有两行具有相同的字母数字排序值的假设。

如果他们这样做,那么一切都不会丢失!从您的数组开始,如下所示:

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

...数字键表示相应行的唯一/主键。使用sort 保留密钥 - docs)而不是保留密钥的asort,然后您的循环如下所示:

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

如果我的基本假设是错误的,并且你将继续处理这种排序行的方法,那么在我看来你应该重新考虑你的数据设计。

答案 3 :(得分:0)

从上面的内容来看,似乎您的值(至少是最后一位数字)可以被视为十六进制数字。然后,您可以通过hexdec函数将它们转换为十进制数。

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

答案 4 :(得分:0)

ord()与substr一起使用并减去64.这会将A设置为1,B设置为2,等等......