我需要动态组成一个具有如下键的数组:
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 有一个函数可以比较这种标准化版本号字符串:
version_compare
。
uksort($Vals, 'version_compare');
从 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',
)