2016-04-06 10 views
0

私はジレンマを持っています。私はAmazonのMWSを使用しているので、私はコンテンツをハッシュする前にAmazonのものとまったく同じ順序で配列を取得する必要があります。そうしなければ、ハッシュはAmazonとなり、Amazonはフィードを受け付けません。要素をインクリメントしている配列をソートするPHPのusort関数

私はPHPのusortを知っていましたが、私はこれを使ったことがないので、私が必要とする機能をどのように作成するのかよく分かりません。

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 
) 

問題はAmazonのソートがわずかに異なることである:

は、ここで、アレイの

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 
) 

あなたが最初の3つのSellerSkus.member.{#}の要素のキーが異なっていることがわかります。残りの並べ替えを同じに保つことができる必要があります。ただし、10以上のSKUがある場合は、Amazonの並べ替えのように並べ替える必要があります。

私はPHP doc for usortを読んだことがありますが、10項目以上で動作するものはまだ得られていません。正しく並べ替えるためには、SellerSkus.member.{#}の番号を把握しておく必要があるようですが、私はusortでこれを行う方法を知っているわけではありません。正しい方向へのガイダンスは素晴らしいでしょう!ありがとう。

+1

'natsort'を見て、文字列の数値部分を見つけて数値的にソートします。 – Barmar

+0

@Barmarありがとう。 'natsort'はそれらの要素を' SellerSkus.member.10'と 'SellerSkus.member.11'とし、それらを' SellerSkus.member.9'要素の後ろに置きます。奇妙なのは、 'natsort'ページでは、「ソート」や「ソート」が実際に配列をソートするのではなく、必要に応じて値をソートする「標準ソート」セクションがあることです。 – Michael

+0

申し訳ありませんが、私は間違っている、私はあなたが数字順にそれらを望んだと思った。 – Barmar

答えて

2

通常の辞書編集のソートが必要ですが、比較するときは=の前に文字列の部分のみを使用しているようです。したがって、比較関数は=を見つけ、その前に部分文字列を取得して比較する必要があります。

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

まずは、ありがとう!第二に、「レクソグラフィック」が何を意味するのかを理解するために、私はあなたの答えを3回読まなければなりませんでした!ははは。それは有り難いです! – Michael

関連する問題