按由三个点分隔的整数组成的键对数组进行排序

问题描述 投票:0回答:2

我需要动态组成一个具有如下键的数组:

1.1.2
2.1.3
2.1.13

撰写后,我需要按键对数据进行排序,但得到的结果与所需的不同:

$Vals = array(
    "1.1.2" => "First",
    "2.1.3" => "Second",
    "2.1.13" => "Third"
);
ksort($Vals);

foreach ($Vals as $x => $x_value) {
   echo "Key=" . $x . ", Value=" . $x_value;
   echo "<br>";
}

我得到:

键=1.1.2,值=第一个
键=2.1.13,值=第三
键=2.1.3,值=第二

而不是

键=1.1.2,值=第一个
键=2.1.3,值=第二
键=2.1.13,值=第三

php arrays sorting ksort
2个回答
6
投票

您正在进行简单的字典比较,但您要比较的是版本号标识符,它们有自己的逻辑。 PHP 有一个函数可以比较这种标准化版本号字符串:

version_compare

uksort($Vals, 'version_compare');

0
投票

从 PHP5.4 开始,

SORT_NATURAL
被添加到 PHP 中,成为解决这一挑战的最简单的排序机制。 迭代调用
version_compare()
也可以,但当涉及字母时,它会有细微的行为,并且避免迭代函数调用会更精简。 演示

$Vals = array(
    '2.1.13' => 'c',
    '1.1.2' => 'a',
    '2.1.3' => 'b',
    '2.11.2' => 'e',
    '3.22.22' => 'f',
    '4.1.1' => 'h',
    '3.111.3' => 'g',
    '2.2.2' => 'd',
);
ksort($Vals, SORT_NATURAL);
var_export($Vals);

输出:

array (
  '1.1.2' => 'a',
  '2.1.3' => 'b',
  '2.1.13' => 'c',
  '2.2.2' => 'd',
  '2.11.2' => 'e',
  '3.22.22' => 'f',
  '3.111.3' => 'g',
  '4.1.1' => 'h',
)
© www.soinside.com 2019 - 2024. All rights reserved.