Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将金额除以通过正则表达式找到的字符串中的字符_Php_Algorithm_Language Agnostic - Fatal编程技术网

Php 将金额除以通过正则表达式找到的字符串中的字符

Php 将金额除以通过正则表达式找到的字符串中的字符,php,algorithm,language-agnostic,Php,Algorithm,Language Agnostic,更新标题的建议是受欢迎的,因为我很难轻易地量化我想做的事情 这是一个基于web的表单,由PHP进行计算,尽管这个问题可能有一个算法或语言不可知的答案 本质上,有一个金额字段和一个费用代码字段。 输入的费用代码表示将金额除以的几个“代理人”的简写。大多数情况下是单字母,但也有一些情况下,这会有所不同,并给一些麻烦 基本上,A=AgentType1,J=AgentType2,L=AgentType3,正如文书工作和用户需求所示,“A2”也是“J”的有效替代品 因此,50的金额和“AJ”的收费代码将导

更新标题的建议是受欢迎的,因为我很难轻易地量化我想做的事情

这是一个基于web的表单,由PHP进行计算,尽管这个问题可能有一个算法或语言不可知的答案

本质上,有一个金额字段和一个费用代码字段。 输入的费用代码表示将金额除以的几个“代理人”的简写。大多数情况下是单字母,但也有一些情况下,这会有所不同,并给一些麻烦

基本上,A=AgentType1,J=AgentType2,L=AgentType3,正如文书工作和用户需求所示,“A2”也是“J”的有效替代品

因此,50的金额和“AJ”的收费代码将导致金额除以2(两个代理),并相应地分散。对于像“AA2”这样的字符串也是如此

我目前已经建立了如下流程(有效):

Divide = 0;
RegEx check for AgentType1 in Charge Code: 
 Divide++;
 Set This-AgentType-Gets-Return; 
RegEx check for AgentType2 in Charge Code: 
 Devide++;
 Set This-AgentType-Gets-Return;
... etc ...
然后,我将金额除以“divide”金额,结果将被分摊到费用代码中的每个AgentType

我知道必须有一种更简单的方法来实现这一点,但目前我还没有想到


有没有办法快速得出费用代码中涉及的代理类型的数量,以及它们是什么?

能否将费用代码字段更改为字段数组?比如:

<input type="hidden" name="agent[]" value="A" />

我可能会做一些简单的事情,比如:

$valid_codes = array('A', 'J', 'L');

// deal with the special A2 case first, to get it out of the string
// this code could be generalized if more special cases need to be handled
if (stripos($charge_code, 'A2') !== FALSE)
{
    $found['J'] = true;
    str_ireplace('A2', '', $charge_code);
}

foreach ($valid_codes as $code)
{
    if (stripos($charge_code, $code) !== FALSE) // if the code was in the string
    {
        $found[$code] = true;
    }
}

现在,您可以使用
count($found)
获得需要除以金额的数字,以及使用
array\u键($found)

需要除以的代码。您不能用类似于此正则表达式的东西来匹配字符串吗

^([A-Z]\d*)*$
然后处理生成的匹配列表?除数就是这个列表的长度(可能在删除重复项之后)


要将符号映射到代理(为什么是代理类型?),可以使用简单的关联列表或hashmap(我不知道PHP中最容易使用哪种构造)。

是否可以有多个相同的代理类型?例如,“AJA”是否有效,得到金额的2/3和J 1/3?好问题,很抱歉没有说得更清楚:金额除以涉及的代理数量,不允许重复。因此,即使收费代码同时包含“J”和“A2”,该代理类型也只计算一次。+1无需尝试将正则表达式塞入其中!也许这可以作为一个单循环来替换字符串,并将“A2”放在要首先测试的列表的前面?也可以这样做,但如果是单循环,则需要在之后进行一些处理,以删除$found['A2']条目并将其转换为$found['J'],因为它基本上只是一个别名。这与已经发生的事情非常相似。最初使用RegEx的原因是不必在“A”之前检查“A2”——代码工作时不考虑操作发生的顺序。
^([A-Z]\d*)*$