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字符處理時是否忽略大小寫,這個很容易理解。

相關文章
相關標籤/搜索