考虑到我的另一个问题,我决定甚至不能创建一个匹配罗马数字的正则表达式(更不用说将生成它们的无上下文语法)
问题是只匹配有效的罗马数字.例如,990不是"XM",它是"CMXC"
我为此制作正则表达式的问题是,为了允许或不允许某些字符,我需要回顾一下.例如,让我们花费成千上万.
我可以允许M {0,2} C?M(允许900,1000,1900,2000,2900和3000).但是,如果匹配在CM上,我不能允许跟随字符为C或D(因为我已经在900).
我怎样才能在正则表达式中表达这一点?
如果它在正则表达式中根本无法表达,它是否可以在无上下文语法中表达出来?
我有一个包含罗马数字的数组(当然是字符串).像这样:
$a = array('XIX', 'LII', 'V', 'MCCXCIV', 'III', 'XIII');
Run Code Online (Sandbox Code Playgroud)
我想根据这些数字的数值对它们进行排序,因此结果应该类似于:
$sorted_a = array('III', 'V', 'XIII', 'XIX', 'LII', 'MCCXCIV');
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:对罗马数字数组进行排序的最佳方法是什么?我知道如何使用PHP的数组排序函数,我对比较函数内部的逻辑感兴趣.
编辑:为简单起见,我只是寻找一种方法来处理以标准方式构建的基本数字字符串(CCCC例如):
I, V, X, L, C, D, M
Run Code Online (Sandbox Code Playgroud)
检测结果
我花时间广泛测试了发布的所有代码示例.进行了两次测试,一次是随机排列的20个罗马数字,第二次是一个包含4000个罗马数字的阵列.相同的机器,大量的迭代,平均花费的时间,以及所有这些运行几次.当然这不是官方的,只是我自己的测试.
测试20个数字:
测试4000个数字:
我需要用PHP将普通数字转换为罗马数字,我有这样的代码:
<?php
function roman2number($roman){
$conv = array(
array("letter" => 'I', "number" => 1),
array("letter" => 'V', "number" => 5),
array("letter" => 'X', "number" => 10),
array("letter" => 'L', "number" => 50),
array("letter" => 'C', "number" => 100),
array("letter" => 'D', "number" => 500),
array("letter" => 'M', "number" => 1000),
array("letter" => 0, "number" => 0)
);
$arabic = 0;
$state = 0;
$sidx = 0;
$len = strlen($roman);
while ($len >= 0) {
$i = 0;
$sidx = $len;
while …Run Code Online (Sandbox Code Playgroud) 基本上我正在尝试创建一个将罗马数字转换为整数的函数.
我有一个数组:
$roman_numerals=[
'M' => 1000,
'CM' => 900,
'D' => 500,
'CD' => 400,
'C' => 100,
'XC' => 90,
'L' => 50,
'XL' => 40,
'X' => 10,
'IX' => 9,
'V' => 5,
'IV' => 4,
'I' => 1
];
Run Code Online (Sandbox Code Playgroud)
我对PHP很新,所以我仍然习惯于思考的方式,所以请记住我还在学习:)
这是我的功能 - 或者我到目前为止:
//Array
function romanToInteger($key)
{
$roman_numerals=[
'M' => 1000,
'CM' => 900,
'D' => 500,
'CD' => 400,
'C' => 100,
'XC' => 90,
'L' => 50,
'XL' => 40,
'X' => 10,
'IX' …Run Code Online (Sandbox Code Playgroud)