Php 将字符串拆分为字母数组-双字符字母
我需要将一个字符串拆分为一个字母数组。问题是在我的语言(克罗地亚语)中也有双字符字母(例如lj、nj、dž) 因此,诸如Php 将字符串拆分为字母数组-双字符字母,php,arrays,string,Php,Arrays,String,我需要将一个字符串拆分为一个字母数组。问题是在我的语言(克罗地亚语)中也有双字符字母(例如lj、nj、dž) 因此,诸如ljubičicajecvijet之类的字符串应该拆分为如下所示的数组: Array ( [0] => lj [1] => u [2] => b [3] => i [4] => č [5] => i [6] => c [7] => a [8] => j
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
)
下面是数组中克罗地亚字符的列表(我也包括英文字母)
您可以使用这种解决方案:
<?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);
?>
数据:
$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);
结果是:)
或者,您可以使用此选项来确保每个双精度字符都已检查匹配,如果匹配(您可以减少
$alphabet
-数组,以仅匹配我的解决方案中的双精度字符:
<?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);
?>
那么,您如何知道字符串中是否包含一个l
和j
,分别与字符lj
相对应?嗯,我正在考虑按字符数对字母进行分类。这个单词将首先按多个字符的字母拆分,然后按单个字符的字母拆分。不幸的是,这也带来了问题s、 很好的解决方案,非常感谢你的回答:Djust想问你。在玩你的代码时,我试着将你的usort改为:usort($alphabet,function($a,$b){return mb_strlen($a)
它似乎也可以这样工作。你对此有何看法?当然可以:)它起作用是因为这是相同的“行为”。第二项检查是根据字符大小对字符进行排序ddd>aa>ab>zz>a>b>c
。这里不需要。这是一个“相当的功能性”:pIt确实很棒:顺便说一句,既然你已经解决了这个问题,我想知道你是否可以尝试解决另一个问题。问题涉及或可能涉及您在此处提供的这段代码。这有点复杂(至少对我来说)。实际上,我想用这段代码对一组单词进行排序。起初我以为这首曲子就足够了,但我遇到了更多的问题。现在,如果你不想,你不必解决它……但我敢说P:D[
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)
<?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);
?>