【问题标题】:PHP, sort an array depending its entries (xNUMBERxNUMBERxNUMBER)PHP,根据其条目对数组进行排序(xNUMBERxNUMBERxNUMBER)
【发布时间】:2019-09-01 03:37:58
【问题描述】:

在 PHP 中,下面是一个数组示例:

$version = [
    "x3x3x2",
    "x10x11x0",
    "x180x7x1",
    "x10x1x7",
    "x2x0x4",
    "x3x3x1",
]

每个条目都遵循这种模式'xNxNxN'(一个字符'x'和一个数字N,三次)

我想按数字从左到右对该数组的每个条目进行排序。预期的结果是:

$version = [
    "x2x0x4",
    "x3x3x1",
    "x3x3x2",
    "x10x1x0",
    "x10x11x7",
    "x180x7x1",
]

我该怎么做?

【问题讨论】:

  • 为什么会有这些数据?因为它看起来超级人工,所以如果这只是一个家庭作业,有一个答案,而这个答案不是“真实”代码的正确答案。
  • usort() 函数是为这样的用例创建的。
  • 您是否尝试过任何标准的 PHP 排序函数并发现它们没有按照您的意愿执行?

标签: php arrays algorithm sorting


【解决方案1】:

只保留数字并使用usort对其进行排序的简单解决方案

usort($version,function($a,$b){
    $astr = preg_replace("/[^0-9\.]/", '', $a);
    $bstr = preg_replace("/[^0-9\.]/", '', $b);
    return $astr - $bstr;
});
print_r($version);

usort — 使用用户定义的比较函数按值对数组进行排序。

Demo.

【讨论】:

  • 这将在x2x1x1 之后对x1x10x10 进行排序。我假设这是不可取的,因为它暗示字符串是版本号。
  • @MattRaines 我测试过你可以查看here。它工作正常。
【解决方案2】:

有一个built-in function to compare version numbers。只需将其与usort 结合即可。

usort($version, 'version_compare');

结果:

var_dump($version);
array(6) {
  [0]=>
  string(6) "x2x0x4"
  [1]=>
  string(6) "x3x3x1"
  [2]=>
  string(6) "x3x3x2"
  [3]=>
  string(7) "x10x1x7"
  [4]=>
  string(8) "x10x11x0"
  [5]=>
  string(8) "x180x7x1"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 2019-06-23
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2011-10-28
    相关资源
    最近更新 更多