gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 12:27:02 24 4
gpt4 key购买 nike

假设我有以下数组 $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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com