Home > Back-end >  How to remove, just once, a word that appears several times in the array
How to remove, just once, a word that appears several times in the array

Time:01-05

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

CodePudding user response:

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
)

CodePudding user response:

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.

CodePudding user response:

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);
  •  Tags:  
  • php
  • Related