На арабском языке буква, подобная "ا" (Alef), имеет много форм / вариантов:
(ا, أ, إ, آ)
также это тот же случай с буквой ي, это также может быть ى.
Я пытаюсь получить ВСЕ возможные варианты слова со многими буквами أ и ي.
Например, слово «أين» должно иметь все эти возможные (в большинстве случаев неверные) варианты: أين, إين, اين, آين, أىن, إين, اىن, آىن ... и т. Д.
Почему? Я создаю небольшую систему исправления текста, которая может обрабатывать синтаксические ошибки и заменять неправильные слова правильными.
Я пытался сделать это максимально чистым способом, но в итоге я получил 8 циклов for / foreach просто для обработки слова "أ"
Должен быть лучший, более чистый способ сделать это! Есть мысли?
Вот мой код до этого момента:
$alefVariations = ['ا', 'إ', 'أ', 'آ'];
$word = 'أيامنا';
// Break into letters
$wordLetters = preg_split('//u', $word, null, PREG_SPLIT_NO_EMPTY);
$wordAlefLettersIndexes = [];
// Get the أ letters
for($letterIndex = 0; $letterIndex < count($wordLetters); $letterIndex++){
if(in_array($wordLetters[$letterIndex], $alefVariations)){
$wordAlefLettersIndexes[] = $letterIndex;
}
}
$eachLetterVariations = [];
foreach($wordAlefLettersIndexes as $alefLettersIndex){
foreach($alefVariations as $alefVariation){
$wordCopy = $wordLetters;
$wordCopy[$alefLettersIndex] = $alefVariation;
$eachLetterVariations[$alefLettersIndex][] = $wordCopy;
}
}
$variations = [];
foreach($wordAlefLettersIndexes as $alefLettersIndex){
$alefWordVariations = $eachLetterVariations[$alefLettersIndex];
foreach($wordAlefLettersIndexes as $alefLettersIndex_inner){
if($alefLettersIndex == $alefLettersIndex_inner) continue;
foreach($alefWordVariations as $alefWordVariation){
foreach($alefVariations as $alefVariation){
$alefWordVariationCopy = $alefWordVariation;
$alefWordVariationCopy[$alefLettersIndex_inner] = $alefVariation;
$variations[] = $alefWordVariationCopy;
}
}
}
}
$finalList = [];
foreach($variations as $variation){
$finalList[] = implode('', $variation);
}
return array_unique($finalList);