加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何使用PHP对数组进行排序,忽略文章(a,an,the)?

发布时间:2020-12-13 14:07:54 所属栏目:PHP教程 来源:网络整理
导读:假设我有以下数组$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]
假设我有以下数组$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,4) == "The "){
    $_books[substr($book,4)] = $book;
    }
    else if(substr($book,3) == "An "){
    $_books[substr($book,3)] = $book;
    }
    else if(substr($book,2) == "A "){
    $_books[substr($book,2)] = $book;
    }
    else{
    $_books[$book] = $book;
    }
}
ksort($_books);
$books = array_values($_books);

但我知道这不是最好的解决方案,因为它有丢失价值的风险(例如,如果输入中同时存在“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));
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读