簡體   English   中英

PHP | 按字母順序排列的 UTF-8 標簽(未找到“整理器”類)

[英]PHP | alphabetical sort of UTF-8 tags ( Class 'Collator' not found )

編輯的問題。 2013 年 12 月 18 日之后驗證。

在對 SO 和 google 進行更多搜索后,我決定可能需要使用collat​​or_createcollat​​or_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

2013 年 12 月 18 日之前的問題如下。 這是舊版。 我的 Q。

我的意見

在我的相關 MySql 表中,我的每篇文章(每個表行)在行的相關單元格中都有其標簽。 我的標記格式有 2 條規則:

  1. 使用逗號和 1 個空格字符分隔標簽(例如: tag1, tag2
  2. 如果標簽有 1 個以上的單詞,則用破折號 (-) 分隔單詞。(例如: smart-phone, tag2

作為最后的輸入,不同的文章當然可以有相同的標簽

我的目標

有一個標題為“標簽”的頁面,我嘗試實現所有標簽的字母順序排序,並將它們與返回相關文章列表的鏈接一起打印出來。

我認為下面的程序:

  1. 從表中獲取所有標簽,並創建一個由唯一標簽組成的數組。
  2. 執行字母排序
  3. 訪問數組最后一種形式的每個元素以打印帶有相關鏈接的標簽

我試過的

注意: 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);

您的 Collat​​or::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/collat​​or.sort.php

因此,在大多數情況下,您應該將 Collat​​or::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM