PHP 排序模式 SORT_NUMERIC / SORT_STRING / SORT_NATURAL 详解

PHP 的排序函数提供了以下几种排序模式:php

  • SORT_REGULAR - compare items normally (don't change types)
  • SORT_NUMERIC - compare items numerically
  • SORT_STRING - compare items as strings
  • SORT_LOCALE_STRING - compare items as strings, based on the current locale. It uses the locale, which can be changed using setlocale()
  • SORT_NATURAL - compare items as strings using "natural ordering" like natsort()
  • SORT_FLAG_CASE - can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitively

SORT_REGULAR

SORT_REGULAR,默认排序模式,会依照数组成员的原数据类型进行排序:数组

  • 字符串类型使用 ASCII 码字符串排序,即按位依次比较 ASCII 码大小,如相同则比较下一位,好比 "2" > "12"
  • 数值类型使用数值排序,即 2 < 12

虽然 PHP 的数组高度灵活,能够存储不一样类型值,但若是参与排序,建议格式统一类型。不然数据会被划分红两块:字符串类型区/数值类型区安全

而后分别按各自的默认规则进行排序:函数

<?php
$arr = [12, 2, 31, 302, "c", "a2", "a12", 1];
sort($arr);
print_r($arr);

// 字符串按ASCII排序 a12 < a2 < c / 数值按天然排序
Array
(
    [0] => a12
    [1] => a2
    [2] => c
    -----------
    [3] => 1
    [4] => 2
    [5] => 12
    [6] => 31
    [7] => 302
)

能够看到,字符串类型(ASCII排序)和数值类型(数值排序)的元素被分开使用各自的默认规则排序,也能够说默认排序以:字符串<数值做为升序。code

SORT_STRING & SORT_LOCALE_STRING

SORT_STRING 会尝试将元素都当作字符串数据进行排序处理,并且这种模式是安全的,由于数值类型转字符串类型不会有什么非法或截断的问题,而后按照 ASCII排序 进行处理。orm

<?php
$arr = [12, 2, 31, 302, "c", "a2", "a12", 1];
sort($arr, SORT_STRING);
print_r($arr);

//能够看到元素以ASCII位序进行排列 好比 "12" < "2" "302" < "31"
Array
(
    [0] => 1
    [1] => 12
    [2] => 2
    [3] => 302
    [4] => 31
    [5] => a12
    [6] => a2
    [7] => c
)

SORT_NUMERIC

SORT_NUMERIC会将元素当作数值类型处理,在使用时须要注意元素的类型,好比示例中的 "a2", "a12", "c" 元素并不能安全的由字符串类型转为数值类型,因此排序会将他们放置在最前并不参与排序(原样奉还),"1"能够转为 1,则能够参与排序。排序

<?php
$arr = [12, 2, 31, 302, "c", "a2", "1", "a12"];
sort($arr, SORT_NUMERIC);
print_r($arr);

//没法转为数值类型的元素不会参与排序 会保持原前后顺序返回
Array
(
    [0] => c
    [1] => a2
    [2] => a12
    ----------
    [3] => 1
    [4] => 2
    [5] => 12
    [6] => 31
    [7] => 302
)

SORT_NATURAL

SORT_NATURAL看字面意思理解就是天然排序,特色在于对字符串+数值类型的数据也能以对人类友好的方式排序出来。索引

好比待排序数列:"a2" "a12" "c1" "c12"字符串

对咱们来讲,最为容易理解的是先按照字母排序,字母相同的时就按后面的数值总体作排序,即: a2 < a12 < c1 < c12 这个样子string

先看一下默认的和其余几种排序模式会获得什么结果:

SORT_REGULAR:会以 ASCII 字符串排序的方式处理数据 a12 < a2 < c12 < c2 不太天然
SORT_STRING:同SORT_REGULARa12 < a2 < c12 < c2 不太天然
SORT_NUMERIC:数据没法转为数值,没法作排序处理

若是使用 SORT_NATURAL 模式呢?SORT_NATURAL即可以按照咱们最容易理解的方式对数据进行排序:

SORT_NATURAL 模式:a2 < a12 < c2 < c12,能够看到SORT_NUMERIC结合了SORT_STRING+SORT_NUMERIC

处理机制大概以下:
一、元素能够转为数值, 则作数值天然排序
二、元素没法转为数值, 则对元素非数值部分字符串排序,若是有数值部分则对数值部分数值排序
三、以数值<字符串的升序对数据作分区排列。

<?php
$arr = [12, 2, 31, 302, "c12", "a2", "1", "a12", "c1"];
sort($arr, SORT_NATURAL);
print_r($arr);

// "1" 被转为了 1 进行排序
// "c12", "a2", "a12", "c1" 以对咱们理解友好的方式排序
Array
(
    [0] => 1
    [1] => 2
    [2] => 12
    [3] => 31
    [4] => 302
    ------------
    [5] => a2
    [6] => a12
    [7] => c1
    [8] => c12
)

天然排序还有个有个函数natsort能够作保留索引的天然排序,相似 asort($arr, SORT_NATURAL)

SORT_FLAG_CASE

SORT_FLAG_CASE主要配合 SORT_STRINGSORT_NATURAL字符处理时是否忽略大小写,这个很容易理解。

相关文章
相关标签/搜索