【问题标题】:PHP usort function to sort array that has incrementing elementsPHP usort函数对具有递增元素的数组进行排序
【发布时间】:2016-04-07 07:04:27
【问题描述】:

我有一个难题。因为我使用的是亚马逊的 MWS,所以在对内容进行哈希处理之前,我必须完全按照亚马逊的方式获取数组的顺序,否则我制作的哈希值和亚马逊制作的哈希值将不匹配,亚马逊也不会接受我的提要。

虽然我知道 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 时,它需要像亚马逊的排序一样排序。

我已经阅读了PHP doc for usort,但我仍然没有得到任何超过 10 个项目的东西。似乎我必须跟踪SellerSkus.member.{#} 号码,以便正确排序它们,但我不知道如何使用usort 做到这一点。任何正确方向的指导都会很棒!谢谢。

【问题讨论】:

  • 看一下natsort,它会找到字符串的数字部分并按数字排序。
  • @Barmar 谢谢。 natsort 将这些元素 SellerSkus.member.10 & SellerSkus.member.11 放在元素 SellerSkus.member.9 后面。奇怪的是,在natsort 页面上,它显示了一个“标准排序”部分,可以根据我的需要对值进行排序,但是,sort 甚至asort 实际上并不是对数组进行排序的。跨度>
  • 抱歉,我看错了,我以为你希望它们按数字顺序排列。

标签: php sorting usort


【解决方案1】:

看起来你想要一个普通的字典排序,但在比较时只使用=之前的字符串部分。所以你的比较函数应该找到=,获取之前的子字符串,然后比较它们。

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

【讨论】:

  • 首先,谢谢!其次,我必须阅读您的答案三遍才能弄清楚“lexographic”是什么意思!哈哈哈。我很感激!