2016-04-06 13 views
0

İkilemim var. Amazon'un MWS'sini kullandığım için, dizinin sırasını tam olarak Amazon'un yapacağı gibi almam gerekir. Aksi halde, yaptığım karma miktar ve Amazon'daki karmaları eşleşmeyecek ve Amazon benim beslememi kabul etmeyecek.PHP usort fonksiyonu artan öğeleri olan diziyi sıralamak için

PHP'nin usort'u bildiğim halde, hiç kullanmadım, bu yüzden ihtiyacım olanı yapan bir işlevi nasıl oluşturacağımı tam olarak bilmiyorum.

Array (
    [0] => AWSAccessKeyId=XXXXXXXX 
    [1] => Action=ListInventorySupply 
    [2] => MarketplaceId=XXXXXXX 
    [3] => ResponseGroup=Basic 
    [4] => SellerId=XXXXXX 
    [5] => SellerSkus.member.10=SKU10 
    [6] => SellerSkus.member.11=SKU11 
    [7] => SellerSkus.member.1=SKU1 
    [8] => SellerSkus.member.2=SKU2 
    [9] => SellerSkus.member.3=SKU3 
    [10] => SellerSkus.member.4=SKU4 
    [11] => SellerSkus.member.5=SKU5 
    [12] => SellerSkus.member.6=SKU6 
    [13] => SellerSkus.member.7=SKU7 
    [14] => SellerSkus.member.8=SKU8 
    [15] => SellerSkus.member.9=SKU9 
    [16] => SignatureMethod=HmacSHA256 
    [17] => SignatureVersion=2 
    [18] => Timestamp=2016-04-06T22%3A26%3A41Z 
    [19] => Version=2010-10-01 
) 

sorun Amazon'un sıralama sadece biraz farklı olmasıdır:

İşte dizisidir

Array (
    [0] => AWSAccessKeyId=XXXXXXXX 
    [1] => Action=ListInventorySupply 
    [2] => MarketplaceId=XXXXXXX 
    [3] => ResponseGroup=Basic 
    [4] => SellerId=XXXXXX 
    [5] => SellerSkus.member.1=SKU1 
    [6] => SellerSkus.member.10=SKU10 
    [7] => SellerSkus.member.11=SKU11 
    [8] => SellerSkus.member.2=SKU2 
    [9] => SellerSkus.member.3=SKU3 
    [10] => SellerSkus.member.4=SKU4 
    [11] => SellerSkus.member.5=SKU5 
    [12] => SellerSkus.member.6=SKU6 
    [13] => SellerSkus.member.7=SKU7 
    [14] => SellerSkus.member.8=SKU8 
    [15] => SellerSkus.member.9=SKU9 
    [16] => SignatureMethod=HmacSHA256 
    [17] => SignatureVersion=2 
    [18] => Timestamp=2016-04-06T22%3A26%3A41Z 
    [19] => Version=2010-10-01 
) 

İlk üç SellerSkus.member.{#} elementler için tuşlar farklı olduğunu göreceksiniz. Kalan sıralamada aynı kalmaya ihtiyacım var, ancak Amazon'un sıralamasında olduğu gibi 10 veya daha fazla SKU'sunun olması gerektiğinde.

PHP doc for usort'u okudum, ancak hala 10 öğenin üzerinde çalışan hiçbir şey almıyorum. Doğru şekilde sıralamak için SellerSkus.member.{#} numarasını takip etmem gerekiyor gibi görünüyor, ama ben usort ile nasıl yapılacağı hakkında en ateşli bir fikrim yok. Doğru yönde herhangi bir rehberlik harika olurdu! Teşekkürler.

+1

"natsort" a bakın, dizenin sayısal bölümünü bulur ve sayısal olarak sıralar. – Barmar

+0

@Barmar Teşekkürler. "natsort", bu "SellerSkus.member.10" ve "SellerSkus.member.11" öğelerini alır ve bunları "SellerSkus.member.9" öğesinin arkasına yerleştirir. Garip olan şey, "natsort" sayfasında, değerleri istediğim gibi sıralayan bir "Standart sıralama" bölümünü gösteriyor, ancak bu, 'sort' ya da 'asort' aslında diziyi sıralamak değil. – Michael

+0

Üzgünüm, yanlış okuduğumu, onları sayısal sırada istediğini sanıyordum. – Barmar

cevap

2

Sıradan bir leksikolojik sıralama istediğiniz gibi görünüyor, ancak karşılaştırırken = önce dizenin yalnızca bölümünü kullanıyorsunuz. Böylece karşılaştırma fonksiyonunuz ='u bulmalı, bundan önce alt dizini almalı ve bunları karşılaştırmalısınız.

usort($array, function($a, $b) { 
    $a = substr($a, 0, strpos($a, '=')); 
    $b = substr($b, 0, strpos($b, '=')); 
    return ($a < $b) ? -1 : 1; 
}); 
+1

Her şeyden önce, teşekkür ederim! İkincisi, 'lexographic' nin ne anlama geldiğini anlamak için cevabınızı üç kez okumam gerekiyordu! Hahaha. Bunu takdir ediyorum! – Michael

İlgili konular