![](/img/trans.png)
[英]PHP Fatal error: Class 'Collator' not found despite PHP 5.3.24
[英]PHP | alphabetical sort of UTF-8 tags ( Class 'Collator' not found )
在對 SO 和 google 進行更多搜索后,我決定可能需要使用collator_create和collator_sort函數,因為我網站的語言是土耳其語並且我使用的是 UTF-8 編碼。
我所在的新職位是:
/* fetch values */
$etiket_bulutu = '';
while ($beyan->fetch())
{
$etiket_bulutu .= $tags.', ';
}
$etiket_bulutu = substr_replace($etiket_bulutu ,'',-2); //omit last {, } chars
$etiketler = explode(", ", $etiket_bulutu); //get each tag as arr
$etiketler = array_unique($etiketler);
$etiketler = array_values($etiketler); //only unique tags without NULLs
$etadet = count($etiketler);
$coll = collator_create('tr_TR'); //from http://www.php.net/manual/en/collator.sort.php
collator_sort($coll, $etiketler);
for($x=0;$x<$etadet;$x++)
{
echo $etiketler[$x];
echo "<br />";
}
現在,我沒有 html 輸出,在我的 error.log 文件中,我收到了這個警告“... PHP 警告:sort() 期望參數 2 很長,字符串在...中給出”和這個致命錯誤“ PHP 致命錯誤:找不到“整理器”類“
我也用谷歌搜索這些問題,但無法解決我的問題。 我的 PHP 版本是 5.3.24 等待您的寶貴幫助。 BR
在我的相關 MySql 表中,我的每篇文章(每個表行)在行的相關單元格中都有其標簽。 我的標記格式有 2 條規則:
tag1, tag2
)smart-phone, tag2
)作為最后的輸入,不同的文章當然可以有相同的標簽
有一個標題為“標簽”的頁面,我嘗試實現所有標簽的字母順序排序,並將它們與返回相關文章列表的鏈接一起打印出來。
我認為下面的程序:
注意: convert_one_row
是一個字符串驗證函數。
if ($beyan = $db_baglanti->prepare($sorgum)) { /* bind parameters */ $beyan -> bind_param("s", $bindparametre1);
/* execute statement */
$beyan->execute();
/* bind result variables */
$beyan->bind_result($etiketler);
echo "\t".''."\r\n"; echo "\t\t".'
'.'Etiketler'.'
'."\r\n";
/* fetch values */
$etiket_bulutu = '';
while ($beyan->fetch())
{
$etiket_bulutu .= $etiketler.', ';
}
$etiket_bulutu = substr_replace($etiket_bulutu ,'',-2); //en son 2karakteri yani {, } attık $etiket_bulutu = explode(", ", $etiket_bulutu); //her bir etiketten array yarattık sort($etiket_bulutu, SORT_NATURAL | SORT_FLAG_CASE); $etiket_bulutu = array_unique($etiket_bulutu, SORT_STRING); //sadece tekil etiketler kaldı $bulut = ''; foreach($etiket_bulutu as $etiket) {$bulut .= ''.convert_one_row($etiket).', ';} $bulut = substr_replace($bulut ,'',-2); //en son 2karakteri yani {, } attık echo "\r\n\r\n".'
'.$bulut.'
'."\r\n\r\n";
echo "\t".''."\r\n";
/* close statement */ $beyan->close(); } ?>
我實現了打印帶有相關鏈接的標簽,但是按字母順序排序問題失敗了。 目前,第一篇文章的標簽被寫入第二篇文章的標簽,第三篇等等......但沒有按字母順序排序。
現狀舉例:
第 1 條標簽:桌子、蘋果、智能手機
第 2 條標簽:智能手機、世界、足球
現狀: table, apple, smart-phone, world, soccer
我需要什么: apple, smart-phone, soccer, table
你能糾正我嗎提前謝謝你
在問了這個問題並學習了它的答案之后,我需要找到一種方法來按字母順序從 MySql db 中對 UTF-8(土耳其語輸入)字符串數組進行排序。
然后我在這個鏈接中使用了Fy-的答案並且它起作用了。
現在,我的解決方案是:
setlocale(LC_COLLATE, 'tr_TR.utf8'); //utf-8 sorting için gerekli
$sorgum = "...";
$bindparametre1 = '...';
if ($beyan = $db_baglanti->prepare($sorgum))
{
/* bind parameters */
$beyan -> bind_param("s", $bindparametre1);
/* execute statement */
$beyan->execute();
/* bind result variables */
$beyan->bind_result($etiketler);
echo "\t".'<div class="sol-icerik-kapsar">'."\r\n";
echo "\t\t".'<h1>'.'Etiketler'.'</h1>'."\r\n";
/* fetch values */
$etiket_bulutu = '';
while ($beyan->fetch())
{
$etiket_bulutu .= $etiketler.', ';
}
$etiket_bulutu = substr_replace($etiket_bulutu ,'',-2); //en son 2karakteri yani {, } attık
$etiketler = explode(", ", $etiket_bulutu); //her bir etiketten array yarattık
$etiketler = array_unique($etiketler);
$etiketler = array_values($etiketler); //sadece tekil etiketler kaldı
$etadet = count($etiketler);
usort($etiketler, 'strcoll');
echo "\n\t\t".'<p>'."\n";
for($x=0;$x<$etadet;$x++)
{
echo "\t\t\t".'<a href="'.url_validate(sitenin_koku.'etiketler/'.$etiketler[$x]).'">'.convert_one_row($etiketler[$x]).'</a>, '."\n";
}
echo "\t\t".'</p>'."\n";
我的解決方案的關鍵代碼是: setlocale(LC_COLLATE, 'tr_TR.utf8');
和usort($etiketler, 'strcoll');
問候
我對您的代碼進行了快速本地檢查,它對我有用。 這就是我所做的:
$etiket_bulutu = 'table, apple, smart-phone, smart-phone, world, soccer, ';
$etiket_bulutu = substr_replace($etiket_bulutu ,'',-2);
$etiket_bulutu = explode(", ", $etiket_bulutu);
sort($etiket_bulutu, SORT_NATURAL | SORT_FLAG_CASE);
$etiket_bulutu = array_unique($etiket_bulutu, SORT_STRING); $bulut = '';
foreach($etiket_bulutu as $etiket){
$bulut .= $etiket.', ';
}
$bulut = substr_replace($bulut ,'',-2);
echo "\r\n\r\n".'
'.$bulut.''."\r\n\r\n";
給定的輸出是:apple、smart-phone、soccer、table、world
所以你的代碼基本上是正確的,但對我來說似乎有點復雜。 為什么它不起作用我現在真的不知道。 您在數據庫數據中有任何不可見的跡象嗎? 將數據庫中的所有數據放入 $etiket_bulut 后,它看起來如何? 和我的代碼一樣嗎? 嘗試在排序之前做一個 array_unique。 也許這有幫助。
我建議你對不同的事情使用不同的變量。 你的 $etiket_bulut 首先是一個字符串,然后它得到一個數組。 那是(在我看來)糟糕的編碼風格。 如果有人查看代碼並錯過了explode(),那么這個人會想知道為什么要在字符串上使用數組函數。
你可以簡化這個:
foreach($etiket_bulutu as $etiket){
$bulut .= $etiket.', ';
}
$bulut = substr_replace($bulut ,'',-2);
進入
$bulut = implode(', ', $etiket_bulutu);
您的 Collator::sort() 中缺少一個參數排序標志。 正如文檔所解釋的那樣:
排序標志
Optional sorting type, one of the following: Collator::SORT_REGULAR - compare items normally (don't change types) Collator::SORT_NUMERIC - compare items numerically Collator::SORT_STRING - compare items as strings Default sorting type is Collator::SORT_REGULAR. It is also used if an invalid sort_flag value has been specified.
https://www.php.net/manual/en/collator.sort.php
因此,在大多數情況下,您應該將 Collator::SORT_REGULAR 指定為該參數,這樣就可以了。
在你的情況下,你需要這樣寫:
//example of an array with words in turkish
$etiketler = ['İyiyim', 'sabah', 'şemsiye', 'Ağaç', 'çay', 'çanta', 'üzüm', 'şeftali', 'çilek', 'maltaeriği'];
//Make a Collator object with the turkish locale
$collator = new Collator('tr_TR');
//Notice the parameter: Collator::SORT_REGULAR It is the sort flag, it instructs the function as to how the sorting could be done, as there are other sorting possibilities.
$collator->sort($etiketler, Collator::SORT_REGULAR);
var_dump($etiketler);
//ordered array:
/*
array(10) {
[0]=>
string(6) "Ağaç"
[1]=>
string(6) "çanta"
[2]=>
string(4) "çay"
[3]=>
string(6) "çilek"
[4]=>
string(7) "İyiyim"
[5]=>
string(11) "maltaeriği"
[6]=>
string(5) "sabah"
[7]=>
string(8) "şeftali"
[8]=>
string(8) "şemsiye"
[9]=>
string(6) "üzüm"
}
*/
另外,如果 PHP 說未找到該類,則可能是您禁用了國際化功能。 要激活它們,請使用此處的說明: https : //www.php.net/manual/en/intl.installation.php查看用戶評論,可能就像從 windows 中的 php.ini 中刪除 1 個字符一樣簡單: https://www.php.net/manual/en/intl.installation.php#114933或者在 linux 中運行 1 個命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.