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