如何在1列上对表进行排序,然后在PHP中对另一列进行排序

时间:2014-08-12 04:57:18

标签: php

我有一个包含3列的表,称为“前缀”,“数字”和“名称”。

我有3个阵列:

$Prefix, $Number, $Name,

其中包含应在我的表格中显示的数据。我必须说$ prefix [0],$ Number [0]和$ Name [0]显示在第一行,依此类推。

我必须对我的表进行排序,以便它们按照前缀进行排序,然后对于具有相同前缀的表,它们应按数字排序。

这是我在表格中的数据示例:

 Prefix       Number       Name

 CIS             8         computer
 CIS            10         Managing Information Technology
 CIS            20         Data Structures
 CIS            30         Cooperative Education
 GEO            6          Managerial Economics
 GEO            12         History of Economic Thought

我知道我可以这样写:        array_multisort($ Prefix,$ Number,$ Name);

并且它们将按$ Prefix排序,但是如何在按$ Prefix排序之后,然后按$ Number对它们进行排序。

1 个答案:

答案 0 :(得分:0)

即使您没有在问题描述中指出这一点,我假设每行代表一个数据记录;也就是说,想要分别对$Prefix$Number$Name数组进行盲目排序,然后将它们一起显示在表格中(如上所示)

相反,您希望将每一行视为记录,并按一些任意顺序(例如,名称,前缀和数字)对记录进行排序。

首先,您要创建一个二维数组,其中外部数组将保存每个记录,每个记录都是关联的数组。看起来像这样:

$classes = array(
    array("Prefix" => "CIS", "Number" => 8, "Name" => "computer"),
    array("Prefix" => "CIS", "Number" => 10, "Name" => "Managing Information Technology")
);

然后,您可以使用usort,在此处定义排序算法,按Prefix进行主要排序,然后按Number进行辅助排序。您所要做的就是首先比较比较函数中的前缀:

function compare_classes($a, $b) {
  if(result = strcmp($a['Prefix'], $b['Prefix']) != 0)
    return result;
  if((result = $a['Number'] - $b['Number']) != 0)
    return result;
  return strcmp($a['Name'], $b['Name']);
}

我没有对此进行测试,但我认为你明白了。这基本上为您提供了二级和三级排序。定义此函数后,将数组和函数传递给usort

usort($classes, "compare_classes");

有关详细信息,请参阅此链接:http://php.net/manual/en/function.usort.php