2016-04-06 16 views
0

Ich habe ein Dilemma hat inkrementieren. Da ich Amazons MWS benutze, muss ich die Reihenfolge des Arrays genau so erhalten, wie es bei Amazon der Fall wäre, bevor ich den Inhalt hashe, sonst wird der Hash, den ich mache und der Hash Amazon, nicht übereinstimmen und Amazon wird meinen Feed nicht akzeptieren.PHP usort Array Sortierfunktion, die Elemente

Während ich PHP usort kenne, habe ich es nie benutzt, also bin ich nicht sicher, ziemlich, wie man eine Funktion schafft, die tut, was ich brauche.

Hier ist das Array:

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 
) 

Das Problem ist, dass Art Amazon nur etwas anders:

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 
) 

Sie werden sehen, dass die Schlüssel für die ersten drei SellerSkus.member.{#} Elemente unterschiedlich sind. Ich muss in der Lage sein, die verbleibende Sorte gleich zu halten, außer dass es, wenn es 10 oder mehr SKUs gibt, nach Amazon sortiert werden muss.

Ich habe die PHP doc for usort gelesen, aber ich bin immer noch nicht alles bekommen, die über 10 Stück funktioniert. Es scheint, als ob ich den Überblick über die SellerSkus.member.{#} Nummer zu behalten habe, um sie richtig zu sortieren, aber ich habe nicht die leiseste Vorstellung davon, wie das zu tun mit usort. Jede Führung in die richtige Richtung wäre großartig! Vielen Dank.

+1

Schauen Sie sich 'natsort' an, es findet den numerischen Teil der Zeichenkette und sortiert ihn numerisch. – Barmar

+0

@Barmar Danke. 'natsort' nimmt diese Elemente' SellerSkus.member.10' und 'SellerSkus.member.11' und platziert sie hinter dem Element' SellerSkus.member.9'. Was merkwürdig ist, ist, dass auf der 'natsort'-Seite ein Abschnitt" Standardsortierung "angezeigt wird, der die Werte genau so sortiert, wie ich es brauche, aber das ist nicht so, wie" sortieren "oder sogar" sortieren "das Array tatsächlich sortiert. – Michael

+0

Entschuldigung, ich habe falsch gelesen, ich dachte, Sie wollten sie in numerischer Reihenfolge. – Barmar

Antwort

2

Es sieht aus wie Sie eine normale lexicographic sortieren wollen, aber nur mit dem Teil der Zeichenfolge vor = beim Vergleich. Ihre Vergleichsfunktion sollte daher die = finden, die Teilzeichenfolge davor abrufen und sie vergleichen.

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

Zunächst einmal, danke! Zweitens musste ich deine Antwort dreimal lesen, um herauszufinden, was "Lexografie" bedeutete! Hahaha. Ich schätze es! – Michael