我收到了一个数据文件,原始创建者使用字母而不是数字来显示顺序。
例如,如果有十个项目,则将其命名为:
12342313A
12342313B
12342313C
12342313D
12342313E
...
我需要将这些值导入到order
作为必需int
列的mySQL表中,我需要将该字母转换为数字。
PHP中是否有函数来获取字母的数值?或者我是否需要执行substr
来获取尾随字母,并创建一个索引的字母数组并对该数组进行查找?
我对上面这么简单的方法犹豫不决,因为我不知道有多少对象可能存在,我可能需要从A-AAAA或其他东西写一个数组。
答案 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'
);
这些都是混乱的,而不是有序的。但是,你可以在该数组上调用函数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
的字段。循环已排序的数组并更新数据库(例如):
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函数将它们转换为十进制数。
答案 4 :(得分:0)
将ord()与substr一起使用并减去64.这会将A设置为1,B设置为2,等等......