• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何在PHP中对数组进行排序

从排序的数据中获取特定信息总是更容易,否则您必须一次遍历数组的每个元素。 

例如,假设您已将班级中不同学生的分数存储在数组或表格中。如果数据不是按获得的分数排序的,则必须先查看班级中每个学生的分数,然后才能判断谁获得了最高分和最低分。如果表格已经根据分数从低到高排序,只看第一个学生的分数就会告诉你最低的分数。

排序使许多需要访问或获取特定数据集的任务变得非常简单和高效。在本教程中,我们将学习如何使用内置的 php 函数对不同类型的数组进行排序。

按值对数组进行排序

在 PHP 中按元素的值对数组进行排序非常容易。您可以选择维护或丢弃键值关联,还可以定义自己的函数来指示元素的排序方式。我将在本教程的这一部分向您展示如何操作。

您可以使用该sort(&$array, $sort_flags)函数将数组的值从低到高排序。但是,它在对数组进行排序时不会保持任何键值关联。新键被分配给已排序的元素,而不是简单的重新排序。可选的第二个参数允许您指定元素的排序方式。它可以有六个不同的值:

  1. SORT_REGULAR— 这将对值进行排序而不更改它们的类型。

  2. SORT_NUMERIC- 这将通过数值比较来对值进行排序。

  3. SORT_STRING— 这将通过将值作为字符串进行比较来对值进行排序。

  4. SORT_LOCALE_STRING—这将根据当前语言环境将值作为字符串进行比较。您可以使用setlocale().

  5. SORT_NATURAL— 这将使用“自然排序”对项目进行排序,同时将它们作为字符串进行比较。

  6. SORT_FLAG_CASE— 这可以与排序字符串时结合使用SORT_STRING或SORT_NATURAL关闭区分大小写。

这里有几个排序示例,可帮助您快速掌握所有排序标志之间的区别。

<?php

$random_data = [32508, 98134, "234984", "3249832", "38", 123, "Apple"];

sort($random_data);
echo "Regular Sorting  — ";
foreach($random_data as $element) {
    echo str_pad($element, 9)." ";
}
// Regular Sorting  — 38        123       32508     98134     234984    3249832   Apple

sort($random_data, SORT_NUMERIC);
echo "\nNumeric Sorting  — ";
foreach($random_data as $element) {
    echo str_pad($element, 9)." ";
}
// Numeric Sorting  — Apple     38        123       32508     98134     234984    3249832

sort($random_data, SORT_STRING);
echo "\nString Sorting   — ";
foreach($random_data as $element) {
    echo str_pad($element, 9)." ";
}
// String Sorting   — 123       234984    3249832   32508     38        98134     Apple

在第一个示例中,常规排序,将数字字符串转换为它们的数值,并相应地进行排序。“Apple”字符串是非数字的,因此它保持不变并作为字符串进行比较。

在第二个例子中,数值排序,我们希望数据按照数值进行排序,所以“Apple”被转换为数值0并排在第一位。其余值按预期排序。

在第三个示例中,所有值都被视为字符串。这意味着不是将数值 123 或 3249832 与 38 进行比较,而是将它们作为字符串进行比较——一次一个字符。由于“1”在“3”之前,因此值 123 被认为低于 38。

如果要将数组值从高到低而不是从低到高排序,可以在rsort()函数的帮助下进行。它接受所有相同的参数,sort()但以相反的顺序对值进行排序。它也不维护任何键值关联,因此它不是对关联数组进行排序的好选择。

对关联数组进行排序

在处理关联数组时,键值关联变得很重要。 

考虑以下示例,其中一个关联数组用于存储不同人的姓名和他们最喜欢的水果。如果您想按水果名称的字母顺序对列表进行排序,使用sort()上一节中的函数将导致相关键丢失。

<?php

$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];

echo "Before Sorting — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}

/*
Before Sorting — 
James likes Orange
John likes Banana
Patricia likes Apple
Jennifer likes Mango
Mary likes Grapes
*/

sort($fruit_preferences);

echo "After Sorting  — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}

/*
After Sorting  — 
0 likes Apple
1 likes Banana
2 likes Grapes
3 likes Mango
4 likes Orange
*/

?>

正如你所看到的,我们不仅失去了人们与他们最喜欢的水果的联系,我们也失去了不同人的名字。每个排序值都已根据其在排序数组中的位置分配了一个新的数字索引。

为了帮助您轻松解决这个问题,PHP 有两个不同的函数,它们在按值对数组进行排序时维护键值关联。这两个函数是asort()和arsort()。以下代码片段对相同的$fruit_preferences数组进行排序,但用于asort()这样做。

<?php

$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"];

echo "Before Sorting — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}

/*
Before Sorting — 
James likes Orange
John likes Banana
Patricia likes Apple
Jennifer likes Mango
Mary likes Grapes
*/

asort($fruit_preferences);

echo "After Sorting  — \n";
foreach($fruit_preferences as $person=>$preference) {
    echo $person." likes ".$preference."\n";
}

/*
After Sorting  — 
Patricia likes Apple
John likes Banana
Mary likes Grapes
Jennifer likes Mango
James likes Orange
*/

?>

从上面的例子可以明显看出,Apple的价值上升到顶部,同时仍保持与Patricia的关联。使用该arsort()函数可以很容易地对水果名称进行反向排序。

这两个函数都接受与它们可选的第二个参数的值相同的排序标志sort()和rsort()。

使用用户定义的函数按值对数组元素进行排序

四种排序功能可以借助不同的标志轻松处理您常见的排序需求。但是,有时您比较数组元素的标准可能不同。

假设您有一组需要按字母顺序排序的随机单词。但是,您还希望在按字母顺序排序之前根据它们的长度对它们进行排序。例如,zoo在传统的字母排序中会排在苹果之后。但是,如果您想在较长的单词之前显示短词,则zoo将出现在apple之前。在同一组字母中,由于字母顺序,猿会排在动物园之前。

基本上,首先根据单词的长度对单词进行排序,然后将具有相同字母数的单词在其自己的组中按字母顺序排序。这种类型的排序不是内置在 PHP 中的,所以我们必须编写自己的排序函数。

在这种情况下,PHP 所做的是为您提供几个函数,这些函数可用于传递您想要排序的数组以及您自己的排序函数的名称。

您可以使用该usort()函数对常规数组中的数组值进行排序。同样,您可以使用该uasort()函数对关联数组中的值进行排序,同时还可以维护键值关联。

下面的代码片段显示了完成此行为的一种方法。

<?php

$random_words = ["ape", "apple", "zoo", "pie", "elephant", "banana", "picnic", "eye"];

sort($random_words);
echo "Regular Sort Function: \n";
foreach($random_words as $element) {
    echo str_pad($element, 9)." ";
}

/*
Regular Sort Function: 
ape       apple     banana    elephant  eye       picnic    pie       zoo
*/

function custom_sort($word_a, $word_b) {
    if (strlen($word_a) < strlen($word_b)) {
        return -1;
    }
    if (strlen($word_a) == strlen($word_b)) {
        return strcmp($word_a, $word_b);
    }
    if (strlen($word_a) > strlen($word_b)) {
        return 1;
    }
}

usort($random_words, "custom_sort");
echo "\nCustom Sort Function: \n";
foreach($random_words as $element) {
    echo str_pad($element, 9)." ";
}

/*
Custom Sort Function: 
ape       eye       pie       zoo       apple     banana    picnic    elephant
*/

?>

在用于自定义排序的回调函数中,我们必须返回一个小于 0 的整数来表示第一个值小于第二个值。如果第一个值等于第二个值,则返回 0。如果第一个值大于第二个,则返回一个大于 0 的整数。

由于我们的主要排序标准是字符串长度,如果第一个单词比第二个单词短,我们直接返回 -1。同样,如果第一个单词比第二个单词长,我们直接返回 1。如果两个单词的长度相等,我们使用函数按字母顺序比较它们并strcmp()返回它的值。

正如您在输出中看到的那样,我们的自定义排序功能完全按照我们想要的方式重新排序单词。

按键排序数组

在处理关联数组时,根据其键对数组进行排序通常很有用。 

例如,您可能有一个数组,其中包含有关各个***/地区的机场总数的信息。假设不同***的名称是键,机场的数量是值,您可能希望按字母顺序对***名称进行排序。ksort()使用andkrsort() 函数很容易做到这一点 。这两个函数都会在排序后维护数组元素的键值关联。该 ksort() 函数将键从低到高krsort()排序,并将键从高到低排序。

这是一个基本的排序示例:

<?php

$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, 
"Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, 
"Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];
ksort($airport_count);
foreach($airport_count as $country=>$count) {
    echo str_pad($country, 15)." ".$count."\n";
}

/*
Argentina       1138
Bolivia         855
Brazil          4093
Canada          1467
Colombia        836
Indonesia       673
Mexico          1714
Paraguay        799
Russia          1218
United States   13513
*/

?>

您还可以为 PHP 提供您自己的自定义函数,以便使用该uksort()函数对数组键进行排序。就像 一样usort(),如果第一个键被认为小于第二个键,则回调函数uksort()还要求您返回一个小于 0 的整数,如果第一个键大于第二个键,则返回一个大于 0 的整数。该函数还维护数组元素的键值关联。

<?php

$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, 
"Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, 
"Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673];

function custom_sort($word_a, $word_b) {
    if (strlen($word_a) < strlen($word_b)) {
        return -1;
    }
    if (strlen($word_a) == strlen($word_b)) {
        return strcmp($word_a, $word_b);
    }
    if (strlen($word_a) > strlen($word_b)) {
        return 1;
    }
}

uksort($airport_count, "custom_sort");

foreach($airport_count as $country=>$count) {
    echo str_pad($country, 15)." ".$count."\n";
}

/*
Brazil          4093
Canada          1467
Mexico          1714
Russia          1218
Bolivia         855
Colombia        836
Paraguay        799
Argentina       1138
Indonesia       673
United States   13513
*/

?>

在上面的示例中,我们使用了上一节中的自定义排序功能,首先按***名称的长度然后按字母顺序对***名称进行排序。

在 PHP 中对多维数组进行排序

在现实生活中处理多维信息更为常见。例如,机构会将所有学生在各种科目中的分数存储在一个表中,而不是为每个科目创建新表。如果您必须在 PHP 中存储相同的信息,您还希望使用多维数组而不是每个主题的单独数组来完成。

在本教程中,我们将以世界上最高的建筑物列表为例,学习如何对多维数组进行排序。我们的数组将包含有关建筑物名称、所在城市和***/地区、楼层数、以米为单位的总高度以及建造年份的信息。

当您想根据特定字段对多维数组中的值进行排序时,您可以简单地使用该usort()函数。下面的示例应该可以帮助您更好地理解这种技术。

<?php

$tallest_buildings = [
    ["Building" => "Burj Khalifa","City" => "Dubai","Country" => "United Arab Emirates",
    "Height" => 828,"Floors" => 163,"Year" => 2010],
    ["Building" => "Shanghai Tower","City" => "Shanghai","Country" => "***","Height" => 632,
    "Floors" => 128,"Year" => 2015],
    ["Building" => "Abraj Al-Bait Towers","City" => "Mecca","Country" => "Saudi Arabia",
    "Height" => 601,"Floors" => 120,"Year" => 2012],
    ["Building" => "Ping An Finance Center","City" => "Shenzhen","Country" => "***",
    "Height" => 599,"Floors" => 115,"Year" => 2017],
    ["Building" => "Lotte World Tower","City" => "seoul","Country" => "South Korea" ,
    "Height" => 554,"Floors" => 123,"Year" => 2016]
];

function storey_sort($building_a, $building_b) {
    return $building_a["Floors"] - $building_b["Floors"];
}

usort($tallest_buildings, "storey_sort");

foreach($tallest_buildings as $tall_building) {
    list($building, $city, $country, $height, $floors) = array_values($tall_building);
    echo $building." is in ".$city.", ".$country.". It is ".$height." meters tall with ".$floors." floors.\n";
}

/*
Ping An Finance Center is in Shenzhen, ***. It is 599 meters tall with 115 floors.
Abraj Al-Bait Towers is in Mecca, Saudi Arabia. It is 601 meters tall with 120 floors.
Lotte World Tower is in Seoul, South Korea. It is 554 meters tall with 123 floors.
Shanghai Tower is in Shanghai, ***. It is 632 meters tall with 128 floors.
Burj Khalifa is in Dubai, United Arab Emirates. It is 828 meters tall with 163 floors.
*/

?>

在上面的示例中,每个建筑物的信息都存储在主数组中自己的数组中$tallest_buildings。该storey_sort()函数只是简单地从第一个建筑物中减去第二个建筑物的楼层数,以确定根据我们的标准哪个建筑物较小。我们不必担心返回特定的负值或正值,因为所有负值都意味着更小,所有正值都意味着更大。

最后,我们只是遍历主数组并打印出每个建筑物的信息。

最后的想法

在本教程中,我向您展示了 PHP 中的一些不同函数,它们可用于通过键或值对数组进行排序。uksort()我们还学习了如何在anduasort()函数的帮助下,使用我们自己的自定义排序标准通过键或值对数组进行排序 。最后一节讨论了如何仅使用特定字段对多维数组中的所有值进行排序。


如何在PHP中对数组进行排序  第1张

文章目录
  • 按值对数组进行排序
    • 对关联数组进行排序
    • 使用用户定义的函数按值对数组元素进行排序
  • 按键排序数组
  • 在 PHP 中对多维数组进行排序
  • 最后的想法