注意:我编辑了示例并将所有值替换为1。 值无关紧要,只有键才重要。 我之前写的值导致了误解。 抱歉。
注意:a / b块始终是连续的。 我添加这个是因为不清楚。 如果有3a / 3b和5a / 5b,将始终有4a / 4b而不仅仅是4。
我有包含带前导零的编号键的数组。 有时,这些编号键具有我使用后缀a和b区分的两个变体。 具有或不具有变体的键的数量未知,但从不超过2位数; 即最高数字键为“09”。
问题在于,这些数组键需要按数字顺序排序,但当存在后缀时,应优先考虑这些后缀。 仅使用ksort()无法实现此目的。
例如,ksort()给我这个:
$arr = array(
'01' => 1,
'02' => 1,
'03a' => 1,
'03b' => 1,
'04a' => 1,
'04b' => 1,
'05a' => 1,
'05b' => 1,
'06' => 1,
);
但是,我需要这个:
$arr = array(
'01' => 1,
'02' => 1,
'03a' => 1,
'04a' => 1,
'05a' => 1,
'03b' => 1,
'04b' => 1,
'05b' => 1,
'06' => 1,
);
我使用了一些复杂的编码技巧来获得我想要的结果,但这并不美观。我想知道是否有更好、更干净的方法?
这是我的做法:
1)我使用ksort()函数,得到了上面两个数组中的第一个(还不是我想要的那个)。
2)我创建了两个数组,一个用于'a'后缀,另一个用于'b'后缀。
$arr_a = array();
$arr_b = array();
foreach ($arr as $k => $v) {
if (substr($k, 2) == 'a') {
$arr_a[$k] = $v;
} else if (substr($k, 2) == 'b') {
$arr_b[$k] = $v;
}
}
3) 我合并了这两个后缀数组。
$arr_suffixes = array_merge($arr_a, $arr_b);
4) 我将原始数组切片,以获取后缀之前的部分和后缀之后的部分。
$i = array_search(key($arr_suffixes), array_keys($arr));
$length = count($arr_suffixes);
$arr_before_suffixes = array_slice($arr, 0, $i);
$arr_after_suffixes = array_slice($arr, $i + $length);
5) 使用array_merge函数,我重新组合切片后的数组,以创建所需的数组。
$arr = array_merge($arr_before_suffixes, $arr_suffixes);
$arr = array_merge($arr, $arr_after_suffixes);
最终,我们得到了正确的 $arr。有没有更好的方法来做这件事?感觉很丑陋。