[英]sort php multidimensional array by specified set of values
我在这种结构中有一个多维数组:
$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),但这些
函数
似乎无法处理字母数字值
。
任何帮助表示赞赏。 谢谢!
此代码应执行您想要的操作。 它使用具有比较功能的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
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.