skip to Main Content

I’ve researched all sorts of ways, but I haven’t found a solution for this case.

Basically I have to see if the word repeats and just remove the first occurrence of it in the array. For example:

$array_words = ['harmony', 'Acrobat', 'harmony', 'harmony'];

How do I check the repeated word, just once, leaving the array like this:

$array_final = ['Acrobat', 'harmony', 'harmony'];

3

Answers


  1. I threw together this simple loop, and explained it with comments

    $array_words = ['harmony', 'Acrobat', 'harmony', 'harmony'];
    
    //get a count of each word in the array
    $counted_values = array_count_values($array_words);
    
    //hold the words we have already checked
    $checked_words = [];
    
    //variable to hold our output after filtering
    $output = [];
    
    //loop over words in array
    foreach($array_words as $word) {
    
        //if word has not been checked, and appears more than once
        if(!in_array($word, $checked_words) && $counted_values[$word] > 1) {
            
            //add word to checked list, continue to next word in array
            $checked_words[] = $word;
            continue;
    
        }
    
        //add word to output
        $output[] = $word;
    }
    

    $output value

    Array
    (
        [0] => Acrobat
        [1] => harmony
        [2] => harmony
    )
    
    Login or Signup to reply.
  2. GrumpyCrouton’s solution is probably neater, but here’s another way. Basically you put all the values into a single string, and then use string functions to do the work.

    Code is commented with explanatory notes:

    <?php
    
    $array_words = ['harmony', 'Acrobat', 'harmony', 'harmony'];
    $array_words_unique = array_unique($array_words); //get a list of unique words from the original array
    $array_str = implode(",", $array_words);
    
    foreach ($array_words_unique as $word) {
        //count how many times the word occurs
        $count = substr_count($array_str, $word);
        
        //if it occurs more than once, remove the first occurence
        if ($count > 1) {
            //find the first position of the word in the string, then replace that with nothing
            $pos = strpos($array_str, $word); 
            $array_str = substr_replace($array_str, "", $pos, strlen($word));
        }
    }
    
    //convert back to an array, and filter any blank entries caused by commas with nothing between them
    $array_final = array_filter(explode(",", $array_str));
    
    var_dump($array_final);
    

    Demo: https://3v4l.org/i1WKI

    Credit to Using str_replace so that it only acts on the first match? for code to replace only the first occurence of a string inside another string.

    Login or Signup to reply.
  3. We can use an array to keep track of each item that has been removed, and then use array_shift to move out of the item and count to limit loop overruns

    <?php
    
    $record = ['harmony','harmony', 'Acrobat', 'harmony', 'harmony','last'];
    
    for($i=0,$count=count($record),$stack=array();$i<$count;$i++){
        $item = array_shift($record);
        in_array($item,$record) && !in_array($item,$stack) 
        ? array_push($stack,$item) 
        : array_push($record,$item);
    }
    
    var_dump($record);
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search