我有一个数组,其键的格式为[A1] - > [A20],[B1] - > [B20]等,我正在尝试使用第一个ksort()
(以正确的顺序获取字母)然后uksort()
对该数组进行排序。
但是,我无法弄清楚应该如何编写uksort()
函数,并且我的数组键以奇怪的顺序返回。有人可以看一看并告知我做错了什么吗?感谢。
function _sort_selection_keys($a, $b){
$let_a = substr($a, 0, 1);
$let_b = substr($b, 0, 1);
$num_a = intval(substr($a, 1));
$num_a = intval(substr($b, 1));
/** Check that the first letter is the same. It should be, as the array has already been through 'ksort()', but it's worth checking any way */
if($let_a !== $let_b) :
return strcasecmp($a, $b);
endif;
if($num_a > $num_b) :
return -1;
elseif($num_a = $num_b) :
return 0;
elseif($num_a < $num_b) :
return 1;
endif;
}
答案 0 :(得分:4)
您可以使用符合您需求的 strnatcmp 功能:
uksort($array, 'strnatcmp');
@ M8R-1jmw5r提到的另一个解决方案
ksort($array, SORT_NATURAL);
答案 1 :(得分:1)
如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。
也就是说,您应该返回true
(或进行比较并返回false
,$num_a - $num_b
或{而不是返回-1
或1
。 {1}}。
答案 2 :(得分:1)
首先,我认为您需要做的就是将第二个“$ num_a”行更改为“$ num_b”。 除此之外,我只是在键上使用strnatcasecmp()而不是你正在尝试的所有解剖。
答案 3 :(得分:1)
如果不在那里调试代码,您可以使用uksort
的内置功能,使用'strnatcmp'按字母顺序对键进行排序。
未排序的数组代码
$array = array(
'A1' => array(),
'A2' => array(),
'A3' => array(),
'A4' => array(),
'C1' => array(),
'B2' => array(),
'B1' => array(),
'D1' => array(),
'C2' => array(),
'B3' => array(),
'D3' => array(),
'D2' => array(),
);
uksort($array, 'strnatcmp');
var_dump($array);
<强>结果强>
array (size=12)
'A1' =>
array (size=0)
empty
'A2' =>
array (size=0)
empty
'A3' =>
array (size=0)
empty
'A4' =>
array (size=0)
empty
'B1' =>
array (size=0)
empty
'B2' =>
array (size=0)
empty
'B3' =>
array (size=0)
empty
'C1' =>
array (size=0)
empty
'C2' =>
array (size=0)
empty
'D1' =>
array (size=0)
empty
'D2' =>
array (size=0)
empty
'D3' =>
array (size=0)
empty
答案 4 :(得分:1)
您希望按自然顺序中的键对数组进行排序:
ksort($array, SORT_NATURAL);
请参阅ksort()
。
自然排序顺序是:
regular: A1, A10, A11, A2, A20, A21, ... A3, ...
natural: A1, A2, A3, ..., A10, A11, ... A20, A21