2009-03-31 2 views
0

Vorschläge für einen aktualisierten Titel sind willkommen, da ich Schwierigkeiten habe zu quantifizieren, was ich versuche zu tun.Divide Menge von Zeichen in Zeichenfolge, gefunden über Regex

Dies ist eine webbasierte Form mit PHP, die die Berechnungen durchführt, obwohl diese Frage wahrscheinlich eine algorithmische oder sprachunabhängige Antwort hat.

Im Wesentlichen gibt es ein Betragsfeld und ein Gebührencodefeld. Der eingegebene Gebührencode stellt eine Kurznummer für mehrere 'Agenten' dar, an die der Betrag geteilt wird. Die meisten Fälle sind einzelne Buchstaben, aber es gibt ein paar Fälle, wo dies variiert, und gibt ein bisschen Ärger.

Grundsätzlich, A = AgentType1, J = AgentType2, L = AgentType3, und wie Papierkram und Benutzeranforderungen haben, "A2" ist auch ein gültiger Ersatz für "J".

Also würde ein Betrag von 50 und ein Gebühren-Code von "AJ" dazu führen, dass der Betrag durch 2 (zwei Agenten) geteilt und entsprechend verteilt wird. Das Gleiche gilt für eine Saite wie "AA2".

ich zur Zeit eingerichtet haben, Prozess (das funktioniert), das so geht:

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 ... 

Dann teile ich den Betrag, um den „Teilen“ Menge, und das Ergebnis wird in der zu jedem AgentType vorhanden divvied Gebührencode.

Ich weiß, es muss einen einfacheren/einfacheren Weg geben, dies zu implementieren, aber es kommt im Moment nicht zu mir.

Gibt es eine Möglichkeit, schnell die Anzahl der am Gebührencode beteiligten AgentTyps abzuleiten, und welche sind das?

+0

Kann es mehrere desselben Agententyps geben? Zum Beispiel, ist "AJA" gültig, wobei A 2/3 des Betrags und J 1/3 erhält? –

+0

Gute Frage, und tut mir leid, dass ich nicht klarer bin: Die Menge ist gleichmäßig geteilt durch die Anzahl der beteiligten Agenten, keine Duplikate erlaubt. Selbst wenn der Gebührencode sowohl "J" als auch "A2" hat, wird dieser Agententyp nur einmal gezählt. –

Antwort

1

würde ich wahrscheinlich wie dies nur einfach etwas tun:

$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; 
    } 
} 

Jetzt können Sie die Nummer erhalten Sie müssen Sie den Betrag mit count($found) teilen, und die Codes, die Sie teilen müssen mit array_keys($found).

+0

+1 keine Notwendigkeit zu versuchen, Regex hineinzuschlagen!Vielleicht könnte dies als eine einzige Schleife durchgeführt werden, die Strings ersetzt, und "A2" an die Vorderseite der Liste setzen, die zuerst getestet werden soll? – bobince

+0

Könnte auch so gemacht werden, aber mit einer einzelnen Schleife würde es später eine Verarbeitung erfordern, um den Eintrag $ found ['A2'] zu entfernen und in $ found ['J'] zu übertragen, da es im Grunde nur ein Alias ​​ist. –

+0

Dies ist sehr ähnlich zu dem, was bereits passiert. Der Grund, warum RegEx ursprünglich verwendet wurde, war, dass man nicht vor 'A' nach einem 'A2' suchen musste - der Code funktioniert ohne Rücksicht auf die Reihenfolge, in der die Operationen stattfinden. –

1

Können Sie das Feld "Gebührencode" in ein Array von Feldern ändern? Etwas wie:

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

für alle Ihre Agenten würden Sie tun:

$divide = count($_POST["agent"]); 
foreach($_POST["agent"] as $agent) { 
    $sum = $_POST["amount"]/$divide; 

    //do other stuff 
} 
0

Könnten Sie die Zeichenfolge nicht überein durch so etwas wie dieses regex

^([A-Z]\d*)*$ 

und dann durch das generierte Übereinstimmungsliste arbeiten? Der Divisor wäre nur die Länge dieser Liste (vielleicht nach dem Entfernen von Duplikaten).

Für die Zuordnung von Symbolen zu Agents (warum AgentTypes?) Könnten Sie eine einfache assoziative Liste oder eine Hashmap verwenden (ich weiß nicht, welche Art von Konstrukten am einfachsten in PHP verfügbar ist).