php - 如何用 PHP 对数组进行排序,忽略开头的冠词 (a, an, the)?

标签 php arrays sorting

假设我有以下数组 $books(实际数组要大得多):

Array
(
    [0] => The Mystic Masseur
    [1] => The Suffrage of Elvira
    [2] => Miguel Street
    [3] => A House for Mr Biswas
    [4] => Mr Stone and the Knights Companion
    [5] => The Mimic Men
    [6] => A Flag on the Island
    [7] => In a Free State
    [8] => Guerrillas
    [9] => A Bend in the River
    [10] => The Enigma of Arrival
    [11] => A Way in the World
    [12] => Half a Life
    [13] => Magic Seeds
)

当我使用 sort 函数时,结果是这样的:

Array
(
    [0] => A Bend in the River
    [1] => A Flag on the Island
    [2] => A House for Mr Biswas
    [3] => A Way in the World
    [4] => Guerrillas
    [5] => Half a Life
    [6] => In a Free State
    [7] => Magic Seeds
    [8] => Miguel Street
    [9] => Mr Stone and the Knights Companion
    [10] => The Enigma of Arrival
    [11] => The Mimic Men
    [12] => The Mystic Masseur
    [13] => The Suffrage of Elvira
)

但我想忽略开头的冠词 (a, an, the) 并希望得到这样的结果:

Array
(
    [0] => A Bend in the River
    [1] => The Enigma of Arrival
    [2] => A Flag on the Island
    [3] => Guerrillas
    [4] => Half a Life
    [5] => A House for Mr Biswas
    [6] => In a Free State
    [7] => Magic Seeds
    [8] => Miguel Street
    [9] => The Mimic Men
    [10] => Mr Stone and the Knights Companion
    [11] => The Mystic Masseur
    [12] => The Suffrage of Elvira
    [13] => A Way in the World
)

我试过:

$_books = array();
foreach($books as $book){
    if(substr($book, 0, 4) == "The "){
    $_books[substr($book, 4)] = $book;
    }
    else if(substr($book, 0, 3) == "An "){
    $_books[substr($book, 3)] = $book;
    }
    else if(substr($book, 0, 2) == "A "){
    $_books[substr($book, 2)] = $book;
    }
    else{
    $_books[$book] = $book;
    }
}
ksort($_books);
$books = array_values($_books);

但我知道这不是最好的解决方案,因为它有丢失值(value)的风险(例如,如果输入中同时存在“A Fantasy”和“The Fantasy”,则输出中将只有“The Fantasy” ).那么,最好的解决方案是什么?

最佳答案

使用自定义排序函数:

function handleArticles($str) {
    list($first,$rest) = explode(" ",$str." ",2);
       // the extra space is to prevent "undefined offset" notices
       // on single-word titles
    $validarticles = array("a","an","the");
    if( in_array(strtolower($first),$validarticles)) return $rest.", ".$first;
    return $str;
}
usort($books,function($a,$b) {
    return strnatcasecmp(handleArticles($a),handleArticles($b));
});

关于php - 如何用 PHP 对数组进行排序,忽略开头的冠词 (a, an, the)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744995/

相关文章:

php - 使用 pdo 将大型 json 数组插入表中。 --> 永远

java - 查找枚举中的最高值

java - 解析天气数据并在集合中对其进行排序

javascript - 如何将此解决方案从 O(n^2) 转变为 O(n)?

php - Laravel 选择具有唯一列的行

php - jquery翻转!组件 : highchart is no longer interactive?

javascript - 使用嵌套在 .map 中的 .find 来构建对象数组

c++ - 给定条件如何维持发生顺序

php - laravel4 数据未插入单个字段

php - 为什么单选按钮无法正常工作