此代码填充一个数组,该数组用作按字母顺序排列的列表的排序指令。 $ stringX包含字母和其他字符,它们应该按字母顺序排列在同一标题下。
在这个例子中,指令是以Ǩ开头的列表项应该被视为从常规K开始。要使用其余代码,字符串将被解析为数组结构:
$stringX = "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";
$result = explode(' ', $stringX);
$settingsArray = array();
foreach ($result as $value) {
echo "Current set: " . $value . "<br>";
$firstInGroup = $value[0];
$allGroupMembers = $value;
$memberArray = str_split($allGroupMembers);
echo "Group header: " . $firstInGroup . "<br>";
echo "All in group: " . $allGroupMembers . "<br>";
echo "Member array: ";
var_dump($memberArray);
echo "<br>";
$settingsArray[$firstInGroup] = $memberArray;
}
$sorterSettings = $settingsArray;
我的问题是,这显然只适用于ascii charakters。在此示例中,结果证明是:
Current value: KǨ
Group header: K
All in group: KǨ
Member array: array(3) { [0]=> string(1) "K" [1]=> string(1) "�" [2]=> string(1) "�" }
由于两个字符串$ allGroupMembers被写入三个数组字段,我怀疑这个字符有问题。
我知道UTF-8可能会给PHP带来困难,但我不确定最佳解决方案。关于如何在一个数组字段中编写KǨ的每个字符,保留特殊字符的建议将不胜感激。谢谢!
答案 0 :(得分:0)
大多数PHP函数都使用字节,而不是字符(除了mb_ *函数和带有u修饰符的preg_)。对于ascii字符串,它是好的。 1个字节= 1个符号。对于utf-8字符串,这将不起作用。
所以str_split
适用于字节。最好用更适合的东西替换它。例如,您可以执行此mb_str_split实施。或者,只需使用
$memberArray = preg_split("//u", $allGroupMembers, -1, PREG_SPLIT_NO_EMPTY);
P.S。 Explode也是“危险的”。对于此字符串,它按预期工作,因为其他字符中未使用空格字节。但它可能会因其他分隔符而失败。
答案 1 :(得分:0)
你的问题是str_split只处理单个字节,你的特殊k用2个字节编码(utf8是一个可变长度编码,aZ用单个字节编码,非常适合str_split,但你的特殊k是2使用一个理解utf8的函数来分割它...就像mb_split
一样mb_regex_encoding('UTF-8');
$memberArray =mb_split('/./',$allGroupMembers);