我在此结构中具有多维数组:
$arr = Array
(
[0] => Array
(
[ref] => Q1
)
[1] => Array
(
[ref] => C6
)
[2] => Array
(
[ref] => C13
)
[3] => Array
(
[ref] => S3
)
[4] => Array
(
[ref] => Q11
)
[8] => Array
(
[ref] => S7
)
[9] => Array
(
[ref] => C4
)
);
我想对数组进行排序,以使值的顺序为S,Q,D,C,P,E,并且如果可能的话,使每个字母数字升序,同时还要保持关联键[ref],如下所示:
Array
(
[0] => Array
(
[ref] => S3
)
[1] => Array
(
[ref] => S7
)
[2] => Array
(
[ref] => Q1
)
[3] => Array
(
[ref] => Q11
)
[4] => Array
(
[ref] => C4
)
[8] => Array
(
[ref] => C6
)
[9] => Array
(
[ref] => C13
)
)
我已经研究了可用的php函数,例如 usort和uasort,但这些函数似乎无法处理字母数字值。
我们将为您提供帮助。谢谢!
答案 0 :(得分:1)
此代码应执行您想要的操作。它使用usort
和一个比较功能,该功能首先查看前导字符并根据您指定的顺序对它进行排序:S,Q,D,C,P,E。如果字符相同,则将其比较值的整数部分。现在的问题是,这会丢失密钥。我们无法使用uasort
来解决此问题,因为它将移动具有相应值的键。为了解决这个问题,我们首先获取数组的键,然后在最后将键与排序后的数组组合:
function mysort($a, $b) {
$sort_order = ['S', 'Q', 'D', 'C', 'P', 'E'];
// first, sort by leading character
$s = array_search($a['ref'][0], $sort_order) - array_search($b['ref'][0], $sort_order);
if ($s != 0) return $s;
// if the same, sort by numeric part
return (int)substr($a['ref'], 1) - (int)substr($b['ref'], 1);
}
$keys = array_keys($arr);
usort($arr, 'mysort');
$arr = array_combine($keys, $arr);
输出:
Array
(
[0] => Array
(
[ref] => S3
)
[1] => Array
(
[ref] => S7
)
[2] => Array
(
[ref] => Q1
)
[3] => Array
(
[ref] => Q11
)
[4] => Array
(
[ref] => C4
)
[8] => Array
(
[ref] => C6
)
[9] => Array
(
[ref] => C13
)
)