PHP usort函数对具有递增元素的数组进行排序

PHP usort函数对具有递增元素的数组进行排序,php,sorting,usort,Php,Sorting,Usort,我左右为难。因为我使用的是Amazon的MWS,所以在散列内容之前,我必须像Amazon一样获得数组的顺序,否则我生成的散列和Amazon生成的散列将不匹配,Amazon将不接受我的提要 虽然我知道PHP的usort,但我从未使用过它,所以我不确定如何创建一个满足我需要的函数 以下是阵列: Array ( [0] => AWSAccessKeyId=XXXXXXXX [1] => Action=ListInventorySupply [2] => Mar

我左右为难。因为我使用的是Amazon的MWS,所以在散列内容之前,我必须像Amazon一样获得数组的顺序,否则我生成的散列和Amazon生成的散列将不匹配,Amazon将不接受我的提要

虽然我知道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
)
问题是亚马逊的分类只是略有不同:

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
)
您将看到前三个
SellerSkus.member.{#}
元素的键是不同的。我需要能够保持其余的排序相同,除了当有10个或更多SKU时,它需要像Amazon的排序一样排序


我已经读过了,但是我仍然没有得到任何超过10项的东西。似乎我必须跟踪
SellerSkus.member.{#}
编号,以便对它们进行正确排序,但我对如何使用
usort
进行排序一无所知。任何正确方向的指导都会很棒!谢谢。

看起来您需要一个普通的字典排序,但在比较时只使用
=
之前的字符串部分。因此,您的比较函数应该找到
=
,获取前面的子字符串,并对它们进行比较

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

看起来您需要一个普通的字典排序,但在比较时只使用
=
之前的字符串部分。因此,您的比较函数应该找到
=
,获取前面的子字符串,并对它们进行比较

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

看看
natsort
,它会找到字符串的数字部分并对其进行数字排序。@Barmar谢谢
natsort
获取那些元素
SellerSkus.member.10
SellerSkus.member.11
并将它们放置在元素
SellerSkus.member.9
后面。奇怪的是,在
natsort
页面上,它显示了一个“标准排序”部分,按照我的需要对值进行排序,但是
sort
甚至
asort
实际上并不是这样对数组进行排序的。对不起,我读错了,我以为您想要的是数字顺序。请看
natsort
,它会找到字符串的数字部分并对其进行数字排序。@Barmar谢谢
natsort
获取那些元素
SellerSkus.member.10
SellerSkus.member.11
并将它们放置在元素
SellerSkus.member.9
后面。奇怪的是,在
natsort
页面上,它显示了一个“标准排序”部分,按照我的需要对值进行排序,但是
sort
甚至
asort
实际上并不是这样对数组进行排序的。对不起,我读错了,我以为您想要按数字顺序排序。首先,谢谢!第二,我必须把你的答案读三遍才能弄明白“lexographic”是什么意思!哈哈哈。我很感激!首先,谢谢你!第二,我必须把你的答案读三遍才能弄明白“lexographic”是什么意思!哈哈哈。我很感激!