2016-10-29 115 views
3

我需要將字符串拆分爲字母數組。問題是用我的語言(克羅地亞語)也有雙重字符(例如lj,nj,dž)。將字符串拆分爲字母數組 - 雙字符字母PHP

所以字符串,如ljubičicajecvijet應分成數組,應該是這樣的:

Array 
(
    [0] => lj 
    [1] => u 
    [2] => b 
    [3] => i 
    [4] => č 
    [5] => i 
    [6] => c 
    [7] => a 
    [8] => j 
    [9] => e 
    [10] => c 
    [11] => v 
    [12] => i 
    [13] => j 
    [14] => e 
    [15] => t 
) 

這裏是一個數組克羅地亞字符表(我包括英文字母藏漢)。

$alphabet= array(
      'a', 'b', 'c', 
      'č', 'ć', 'd', 
      'dž', 'đ', 'e', 
      'f', 'g', 'h', 
      'i', 'j', 'k', 
      'l', 'lj', 'm', 
      'n', 'nj', 'o', 
      'p', 'q', 'r', 
      's', 'š', 't', 
      'u', 'v', 'w', 
      'x', 'y', 'z', 'ž' 
     ); 
+1

所以你怎麼知道如果字符串包含一個'l'和'j'分別對字符'lj' –

+0

嗯,我還想着分類信嗎?按字符數。這個單詞首先會被更多字符的字母分割,然後再被單個字符分割。不幸的是,它也帶來了問題。 – dodo254

回答

1

您可以使用這種解決方案:

數據:

$text = 'ljubičicajecviježdžt'; 

$alphabet = [ 
      'a', 'b', 'c', 
      'č', 'ć', 'd', 
      'dž', 'đ', 'e', 
      'f', 'g', 'h', 
      'i', 'j', 'k', 
      'l', 'lj', 'm', 
      'n', 'nj', 'o', 
      'p', 'q', 'r', 
      's', 'š', 't', 
      'u', 'v', 'w', 
      'x', 'y', 'z', 'ž' 
]; 

1結果排序長度纔能有雙字母開頭

// 2 letters first 
usort($alphabet, function($a, $b) { 
    if(mb_strlen($a) != mb_strlen($b)) 
     return mb_strlen($a) < mb_strlen($b); 
    else 
     return $a > $b; 
}); 

var_dump($alphabet); 

2.最後,分割。我用preg_split函數與preg_quote來保護函數。

// split 
$alphabet = array_map('preg_quote', $alphabet); // protect preg_split 
$pattern = implode('|', $alphabet); // 'dž|lj|nj|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|ć|č|đ|š|ž' 

var_dump($pattern); 

var_dump(preg_split('`(' . $pattern . ')`si', $text, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY)); 

而結果:)

array (size=18) 
    0 => string 'lj' (length=2) 
    1 => string 'u' (length=1) 
    2 => string 'b' (length=1) 
    3 => string 'i' (length=1) 
    4 => string 'č' (length=2) 
    5 => string 'i' (length=1) 
    6 => string 'c' (length=1) 
    7 => string 'a' (length=1) 
    8 => string 'j' (length=1) 
    9 => string 'e' (length=1) 
    10 => string 'c' (length=1) 
    11 => string 'v' (length=1) 
    12 => string 'i' (length=1) 
    13 => string 'j' (length=1) 
    14 => string 'e' (length=1) 
    15 => string 'ž' (length=2) 
    16 => string 'dž' (length=3) 
    17 => string 't' (length=1) 
+0

偉大的解決方案,非常感謝您的回答:D – dodo254

+0

只是想問你。在玩你的代碼的時候,我試着改變你的usort: ''usort($ alphabet,function($ a,$ b){ return mb_strlen($ a) dodo254

+0

是的,當然:)它工作,因爲這是相同的'行爲'。第二個檢查是根據它們的大小來調整字符的大小,即ddd> aa> ab> zz> a> b> c'。這裏不需要。這是一個'漂亮的功能':p –

1

或者你可以用它來確保每一個雙重檢查相匹配,如果確實如此(你可以減少$alphabet -array只匹配在我的解決方案雙重角色:

<?php 

ini_set('display_errors',1); // this should be commented out in production environments 
error_reporting(E_ALL); // this should be commented out in production environments 


$string = 'ljubičicajecvijet'; 

$alphabet= [ 
      'a', 'b', 'c', 
      'č', 'ć', 'd', 
      'dž', 'đ', 'e', 
      'f', 'g', 'h', 
      'i', 'j', 'k', 
      'l', 'lj', 'm', 
      'n', 'nj', 'o', 
      'p', 'q', 'r', 
      's', 'š', 't', 
      'u', 'v', 'w', 
      'x', 'y', 'z', 'ž' 
      ]; 

function str_split_unicode($str, $length = 1) { 
    $tmp = preg_split('~~u', $str, -1, PREG_SPLIT_NO_EMPTY); 
    if ($length > 1) { 
     $chunks = array_chunk($tmp, $length); 
     foreach ($chunks as $i => $chunk) { 
      $chunks[$i] = join('', (array) $chunk); 
     } 
     $tmp = $chunks; 
    } 
    return $tmp; 
} 

$new_array = str_split_unicode($string,2); 

foreach ($new_array as $key => $value) { 
    if (strlen($value) == 2) { 
     if (in_array($value, $alphabet)) { 
      $test[$key] = $value; 
      unset($new_array[$key]); 
     } 
    } 
} 

$new_array = str_split_unicode(join('',$new_array)); 

foreach ($test as $key => $value) { 
    array_splice($new_array, $key, 0, $value); 
} 

print_r($new_array); 

?>