如何在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_STRINGSORT_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会出现在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()krsort()函数。 这两个函数将在排序后保持数组元素的键值关联。 ksort()函数将键从低到高排序,而krsort()将键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
*/

?>

您还可以使用uksort()函数为PHP提供您自己的自定义函数,以对数组键进行排序。 就像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" => "China","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" => "China","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, China. 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, China. 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()函数storey_sort()第一座建筑减去第二座建筑的楼层数,即可根据我们的标准确定哪座建筑较小。 我们不必担心会返回特定的负值或正值,因为所有负值均表示较小,而所有正值均表示较大。

最后,我们仅遍历主数组并打印出有关每座建筑物的信息。

最后的想法

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

希望您从本教程中学到了一些新知识。 如果您有任何疑问或建议,请在评论中让我知道。 最好的学习方法是尝试使用这些函数创建一些自己的示例,对数组进行排序。

翻译自: https://code.tutsplus.com/tutorials/how-to-sort-arrays-in-php--cms-32313

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值