PHP, если в строке из одного слова обнаружено дублирование символов, замените связанный текстовый вывод для второго вхождения - PullRequest
0 голосов
/ 31 августа 2018

Я выделяю текстовый вывод для каждой буквы в строке из одного слова, введенной в форму. Например, если $ name = ben, я вывожу 'text for b' 'text for e' 'text for n' в порядке их появления. Я хочу выделить альтернативный текст, если одна буква появляется снова, поэтому, если $ name = benjamin, я вывожу 'text for n' для 3-й буквы, но 'альтернативный текст для second n' для последней буквы.

До сих пор я выводил текст для писем, используя этот цикл:

texts= [
    'a' => 'text for letter a',
    'b' => 'text for letter b', //etc
];

for ($i = 0; $i < mb_strlen($name); $i++) {
    $letter = mb_substr($name, $i, 1); // Get current letter.
    $text_for_letter = $texts[$letter] ?? null; // Get the text for this //letter from the array of texts.

    if ($text_for_letter) {
    echo 'Text for letter ' . $letter . ' is: ' . $text_for_letter, '<br>';
    } 
}  

и я анализирую, дублируют ли буквы:

$name = 'benjamin'; //example of what might have been entered on form, will vary

function mb_count_chars($name, 'UTF-8') {
    $occurrence = array();
    for ($i = 0; $i < mb_strlen($name); $i++) {
        $letter = mb_substr($name, $i, 1, 'UTF-8');
        if(!array_key_exists($letter, $occurrence))
            $occurrence[$letter] = 0;
        $occurrence[$letter]++;
    }
    return $occurrence;
}
print_r( mb_count_chars($name) ); 

что получается

Array ( [b] => 1 [e] => 1 [n] => 2 [j] => 1 [a] => 1 [m] => 1 [i] => 1 )

и нахождение букв в имени:

<?php print_r(str_split($name)); ?>

Array ( [0] => b [1] => e [2] => n [3] => j [4] => a [5] => m [6] => i [7] => n ) 

Какой код вы предлагаете выводить альтернативные тексты в правильном соответствующем порядке, если в $ name обнаружены повторяющиеся / повторяющиеся буквы (при условии, что $ alt_texts2 / 3 сделаны для алфавита, записанного в том же файле) Спасибо.

1 Ответ

0 голосов
/ 31 августа 2018

Вы можете использовать совершенно другой подход например:

$name = 'benjamin'; 

$texts= [
    'a' =>[ 'text for letter a','text for letter alternate','text for letter alternate2','text for letter alternate3 etc'],
    'b' => ['text for letter b'], //etc
    'n' =>[ 'text for letter n','text for letter n alternate ','text for letter n alternate2','text for letter n alternate3 etc'],
];


for ($i=0,$strlen=mb_strlen($name);$i <$strlen; $i++) {
    $letter = mb_substr($name, $i, 1); // Get current letter.
    if(isset($texts[$letter])){
        $current=current($texts[$letter]);
        next($texts[$letter]);
        $text_for_letter =$current; // Get the text for this //letter from the array of texts.
    }else{
        $text_for_letter=null;
    }
    if ($text_for_letter) {
        echo 'Text for letter ' . $letter . ' is: ' . $text_for_letter, '<br>';
    } 
}

Вывод:

Text for letter b is: text for letter b
Text for letter n is: text for letter n
Text for letter a is: text for letter a
Text for letter n is: text for letter n alternate 

Таким образом, мы используем многомерный массив для хранения альтернативных текстов для всех букв, а затем перемещаем указатель для каждого подмассива текстов, когда необходимо чередовать текст при каждом появлении одной и той же буквы.

...