多维数组按值排序,同时将其转换为整数


Multidimensional array sorting by value while casting it as integer

我有一个这样的数组,它来自ElasticSearch。因为我不能从elasticsearch中订购这个聚合。Elasticsearch只支持按计数或按字母顺序排序。我决定在PHP端做这件事。

"buckets" => array:8 [
  0 => array:2 [
    "key" => "1 Ft."
    "doc_count" => 6
  ]
  1 => array:2 [
    "key" => "10 Ft."
    "doc_count" => 10
  ]
  2 => array:2 [
    "key" => "15 Ft."
    "doc_count" => 10
  ]
  3 => array:2 [
    "key" => "20 Ft."
    "doc_count" => 10
  ]
  4 => array:2 [
    "key" => "25 Ft."
    "doc_count" => 10
  ]
  5 => array:2 [
    "key" => "3 Ft."
    "doc_count" => 10
  ]
  6 => array:2 [
    "key" => "5 Ft."
    "doc_count" => 10
  ]
  7 => array:2 [
    "key" => "7 Ft."
    "doc_count" => 10
  ]
]

可以看到,这个数组是按字母顺序排列的。我想做的是按键字段排序这个数组但排序时把它当成一个整数值。预期结果为:

"buckets" => array:8 [
  0 => array:2 [
    "key" => "1 Ft."
    "doc_count" => 6
  ]
  1 => array:2 [
    "key" => "3 Ft."
    "doc_count" => 10
  ]
  2 => array:2 [
    "key" => "5 Ft."
    "doc_count" => 10
  ]
  3 => array:2 [
    "key" => "7 Ft."
    "doc_count" => 10
  ]
  4 => array:2 [
    "key" => "10 Ft."
    "doc_count" => 10
  ]
  5 => array:2 [
    "key" => "15 Ft."
    "doc_count" => 10
  ]
  6 => array:2 [
    "key" => "20 Ft."
    "doc_count" => 10
  ]
  7 => array:2 [
    "key" => "25 Ft."
    "doc_count" => 10
  ]
]

尝试natsort

natsort -使用"自然排序"算法对数组进行排序。

您可以将自然比较与ussort函数一起使用:

usort($buckets, function($a, $b) {
    return strnatcmp($a->key, $b->key);
});

是的,你可以使用ussort…下面是如何做到这一点的一个例子:

usort($a['buckets'], function($a, $b) {
  $a_int = (integer) $a['key'];
  $b_int = (integer) $b['key'];
  if ($a_int === $b_int) return 0;
  return ($a_int > $b_int) ? 1 : -1;
});