【发布时间】:2014-09-15 07:22:17
【问题描述】:
注意:我编辑了示例并将所有值替换为 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。难道没有更好的方法来做到这一点吗?感觉真的很丑。
【问题讨论】:
-
这不会发生。你要么拥有'04'键,要么拥有'04a'和'04b'。注意:这些值无关紧要。他们在下面抛出了一些答案。只有键很重要。
-
我不明白。 02
-
想象一下,用数字排序,但如果数字也有与字母
a或b比这样的排序0a4,0a5,0b4,0b5 -
@GeorgeGarchagudashvili ,但空格多于或少于字母 a 或 b?
-
@derp - a/b 块总是连续的。我应该提到这一点。所以,如果 3a/3b 和 5a/5b 总是会有 4a/4b 而不仅仅是 4。