Dizesinde var karakterleriyle miktarda bölün, regex via bulundu

3 Cevap php

Ben yapmak ne çalışıyorum miktarının kolayca sorun yaşıyorum olarak güncel bir başlık için Öneriler, bekliyoruz.

Bu soru muhtemelen bir algoritmik veya dil agnostik cevabı vardır ama bu, PHP hesaplamalar yaparken bir web-tabanlı bir formudur.

Essentially, there is an Amount field and a Charge Code field. The Charge code entered represents a short-hand for several 'agents' to whom the Amount is divided by. Most cases are single letters, however there are a couple cases where this varies, and gives a bit of trouble.

Temel olarak, A = AgentType1, J = AgentType2, L = evrak ve kullanıcı gereksinimleri o olurdu AgentType3, ve gibi, "A2" de "J" için geçerli bir yedek.

Bu yüzden, 50 ve bir miktar "AJ" bir şarj Kod 2 (iki ajanlar) ile ayrılmış ve buna uygun olarak dağılmış olan miktarı neden olur. "AA2" gibi bir dize için aynı.

Şu anda bu böyle gider (bu işler) süreci kurdunuz:

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

Sonra "Divide" miktarına göre miktarı bölmek ve sonuç Charge Kanunu'nda mevcut olan her AgentTypevarsayılan için divvied alır.

Ben bunu uygulamak için kolay bir / basit bir yolu olmalı biliyorum, ama o an bana gelmiyor.

Hızlı şarj Kanunu'nda yer AgentTypes sayısını ve hangi onlar türetmek için bir yolu var mı?

3 Cevap

Ben muhtemelen sadece bu gibi basit bir şey yapardı:

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

Şimdi sen count($found) ile ile miktarı bölmek gerekir sayısını ve array_keys($found) ile arasında bölmek için gereken kodları alabilirsiniz.

Eğer alanlarda bir dizi şarj kodu alanını değiştirebilir miyim? Gibi bir şey:

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

Tüm ajanlar izin verir için yapmanız:

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

    //do other stuff
}

Bu regex gibi bir şey ile dize ulaşamasa

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

ve daha sonra oluşturulan maç liste üzerinden çalışabilir? Bölen sadece (belki çiftleri kaldırarak sonra) bu listenin uzunluğu olacaktır.

Ajanlar için haritalama sembolleri (neden AgentTypes?), (Ben PHP kolay kullanılabilir yapıların ne tür bilmiyorum) basit bir ilişkisel listesini veya bir hashmap kullanabilirsiniz.