Я читал эту ветку: Как сгенерировать все перестановки строка в PHP? и я хочу сделать то же самое, но с тайскими символами ... но все, что я получаю, это много странных символов. Должно быть что то с кодировкой? Я использую UTF-8.
Вот код (первоначально из упомянутого выше потока):
<?php
mb_internal_encoding('UTF-8');
// function to generate and print all N! permutations of $str. (N = strlen($str)).
function permute($str,$i,$n)
{
if ($i == $n)
{
print mb_substr($str, 0);
print "<br></br>";
}
else
{
for ($j = $i; $j < $n; $j++)
{
swap((mb_substr($str, 0)),$i,$j);
permute((mb_substr($str, 0)), $i+1, $n);
swap($str,$i,$j); // backtrack.
}
}
}
// function to swap the char at pos $i and $j of $str.
function swap(&$str,$i,$j)
{
$temp = $str[$i];
$str[$i] = $str[$j];
$str[$j] = $temp;
}
$str = "สม";
permute((mb_substr($str, 0)),0,mb_strlen($str)); // call the function.
?>
Код обновлен, теперь распечатка такая:
สม
สม
Что мне не хватает?
1 ответ
Единственное существенное изменение, которое требуется от оригинала, - это изменить функцию swap()
для создания правильного массива символов. , а не напрямую использовать доступ к массиву для строки. (Это и использование mb_strlen()
вместо strlen()
для получения длины строки при вызове permute()
.)
За работой:
mb_internal_encoding('UTF-8');
// function to generate and print all N! permutations of $str. (N = strlen($str)).
function permute($str,$i,$n)
{
if ($i == $n)
{
print "$str\n";
}
else
{
for ($j = $i; $j < $n; $j++)
{
swap($str,$i,$j);
permute($str, $i+1, $n);
swap($str,$i,$j); // backtrack.
}
}
}
function swap(&$str,$i,$j) {
$chars = array();
for ($p = 0; $p < mb_strlen($str); $p++) {
$chars[] = mb_substr($str, $p, 1);
}
$temp = $chars[$i];
$chars[$i] = $chars[$j];
$chars[$j] = $temp;
$str = implode($chars);
}
$str = "สม";
permute($str, 0, mb_strlen($str)); // call the function.
Выход:
สม
มส
Похожие вопросы
Связанные вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
mb_internal_encoding
? Он изменяет поведение по умолчанию других функцийmb_
. Из которых вы не используете. В основном вам нужно изменитьswap
, чтобы вместо этого использовать многобайтовые функции (см. Неверный вывод при использовании индексации массива в строке UTF-8 a>) и используйтеmb_strlen
вместо простогоstrlen
.