在PHP中按第n个字符排序

时间:2013-06-23 11:30:59

标签: php arrays sorting

我正在尝试使用学校班级名称对数组进行排序,但是当我使用字母排序功能时,他们不会按年级排序。

按字母顺序排序:

Array
(
   "LA2A",
   "LB1A",
   "LG2A",
   "LG3A",
   "LH2A",
   "LH3A",
   "LH4A",
   "LH5A",
   "LV4A",
   "LV5A",
   "LV6A"
)

这就是我想要实现的目标:

Array
( 
   "LB1A",
   "LA2A",
   "LG2A",
   "LH2A",
   "LG3A",
   "LH3A",
   "LH4A",
   "LV4A",
   "LH5A",
   "LV5A",
   "LV6A"
)

那么,我怎么能先按第三个字符排序数组(在PHP中),然后是第四个字符,最后是第二个字符。

2 个答案:

答案 0 :(得分:2)

最简单的方法是应用类似https://en.wikipedia.org/wiki/Schwartzian_transform

的内容
$arr = ...;
function add_key($x) { return $x[2] . $x[3] . $x[1] . $x; }
function rem_key($x) { return substr($x, 3); }
$tmp = array_map("add_key",$arr);
sort($tmp);
$res = array_map("rem_key",$tmp);

add_key通过将排序键复制到前面来调整每个字符串。然后我们对它进行排序rem_key摆脱了关键。

答案 1 :(得分:2)

Demo使用usort

$test = array(
   "LA2A",
   "LB1A",
   "LG2A",
   "LG3A",
   "LH2A",
   "LH3A",
   "LH4A",
   "LH5A",
   "LV4A",
   "LV5A",
   "LV6A"
  );



//sort by first the third character, then the fourth and finally the second character.  
function mySort($left, $right) {

   $left = $left[2].$left[3].$left[1];
   $right = $right[2].$right[3].$right[1];

   return strcmp($left, $right);
}


usort($test, 'mySort');
现在

$ test:

Array (
   [0]  => LB1A
   [1]  => LA2A
   [2]  => LG2A
   [3]  => LH2A
   [4]  => LG3A
   [5]  => LH3A
   [6]  => LH4A
   [7]  => LV4A
   [8]  => LH5A
   [9]  => LV5A
   [10] => LV6A
)