我有这样一个数组:
[
['number' => '419-1'],
['number' => '302-1'],
['number' => '102-1'],
['number' => '102-11'],
['number' => '203-1'],
['number' => '508-1'],
['number' => '105-1'],
['number' => '102-2'],
['number' => '302-2'],
]我想要这样的产出:
[
['number' => '102-1'],
['number' => '102-2'],
['number' => '102-11'],
['number' => '105-1'],
['number' => '203-1'],
['number' => '302-1'],
['number' => '302-2'],
['number' => '419-1'],
['number' => '508-1']
]问题是数字存储为字符串。我想把数字看作整数。排序需要在数字上完成。不是字符串比较,,我试过用usort,但这没有帮助。
有人能帮帮我吗?
发布于 2019-04-23 12:44:33
您希望自然地对数组值进行排序,1, 2, 10, 20,这样它们就不会被排序为数字字符串1, 10, 2, 20。其结果在PHP 5和PHP 7中应该是相同的。
您可以使用array_multisort和SORT_ASC和SORT_NATURAL标志,以及array_column检索要排序的值。
PHP 5.5+
array_multisort(array_column($ar, 'number'), SORT_ASC, SORT_NATURAL, $ar);
var_export($ar);或者,您可以将strnatcmp与usort结合使用。
PHP 5.3+
usort($ar, function($a, $b) {
return strnatcmp($a['number'], $b['number']);
});
var_export($ar);结果
array (
0 =>
array (
'number' => '102-1',
),
1 =>
array (
'number' => '102-2',
),
2 =>
array (
'number' => '102-11',
),
3 =>
array (
'number' => '105-1',
),
4 =>
array (
'number' => '203-1',
),
5 =>
array (
'number' => '302-1',
),
6 =>
array (
'number' => '302-2',
),
7 =>
array (
'number' => '419-1',
),
8 =>
array (
'number' => '508-1',
),
)发布于 2019-04-23 12:35:46
$arr = [
['number' => '419-1'],
['number' => '419-11'],
['number' => '102-1'],
['number' => '203-1'],
['number' => '508-1'],
['number' => '105-1'],
['number' => '102-2'],
['number' => '302-2'],
];
usort($arr, function($a,$b){
$an = explode('-',$a['number']);
$bn = explode('-',$b['number']);
if($an[0] == $bn[0]){
return $an[1]*1 > $bn[1]*1;
}
return $an[0]*1 > $bn[0]*1;
});
print_r($arr);https://stackoverflow.com/questions/55811303
复制相似问题