edindubai
edindubai

Reputation: 151

PHP if character duplication detected in single word string, replace related text output for second occurrence

I allocate a text output to each letter within a one word string entered on a form. eg if $name = ben, I output 'text for b' 'text for e' 'text for n' in the order they occur. I want to allocate alternative text if one letter appears again, so if $name = benjamin I output 'text for n' for the 3rd letter but 'alternative text for second n' for the last letter.

So far I output the text for the letters using this loop:

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>';
    } 
}  

and I analyze if letters duplicate with:

$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) ); 

which turns out

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

and finding where the letters lie in the name:

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

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

What code do you suggest to output the alternative texts in correct corresponding order when duplicate/triplicate letters are detected in $name.(assuming $alt_texts2 /3 are made for alphabet written in same file) Thank you.

Upvotes: 2

Views: 135

Answers (1)

Elementary
Elementary

Reputation: 1453

You can use a completely different approach eg:

$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>';
    } 
}

The output is:

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 

So we use mutlidimensional array to keep alternate texts for all letters and then we move the pointer for each subarray of texts when needed to alternate text each new occurence of the same letter.

Upvotes: 1

Related Questions