Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

Given two strings, what is the best approach in PHP to retrieve the characters which are in common, and those which are not?

For instance, given the two strings:

postcard

car

I would like to get something like:

letters in common: c - a - r
letters not in common: p - o - s - t - d

I saw there are word similarity functions which return a numeric value.

However, I would like to retrieve each single char.

My approach would be to treat both strings as arrays (using str_split) and then check if the elements in the shortest string are present in the longer one (using in_array).

$arr_postcard = str_split($postcard);
$arr_car = str_split($car);
$notcommon = array();
   if (in_array($arr_postcard, $arr_car) == false){
       array_push($notcommon, $arr_car);
   }
   foreach($notcommon as $k => $v){
      print_r ($v);
   }

The code above doesn't seem to work. It returns the values of $arr_car.

Maybe there are other ways.

question from:https://stackoverflow.com/questions/65641097/looking-for-the-same-chars-in-two-strings-in-php

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
228 views
Welcome To Ask or Share your Answers For Others

1 Answer

A simple way to do so:

<?php

$postcard = 'paccoi';
$car = 'coi';

$arr_postcard = str_split($postcard);
$arr_car = str_split($car);


function array_diff_once($array1, $array2) {
    foreach($array2 as $a) {
        $pos = array_search($a, $array1);
        if($pos !== false) {
            unset($array1[$pos]);
        }
    }

    return $array1;
}

$uncommon = count($arr_postcard) >= count($arr_car) ?  array_diff_once($arr_postcard,$arr_car) : array_diff_once($arr_car,$arr_postcard);

echo 'Letters not in common: ' . implode(' - ', $uncommon) . PHP_EOL;

function array_intersect_once($array1, $array2) {
    $array = [];
    foreach($array1 as $a) {
        $pos = array_search($a, $array2);
        if($pos !== false) {
            $array[] = $a;
        }
    }

    return $array;
}
$common = count($arr_postcard) >= count($arr_car) ?  array_intersect_once($arr_car,$arr_postcard) : array_intersect_once($arr_postcard,$arr_car);

echo 'Letters in common: ' . implode(' - ', $common) . PHP_EOL;

Output: https://3v4l.org/lY755 and https://3v4l.org/kK9sE

Note:- you can use trim() inside str_split() to overcome the problem of string with leading or trailing spaces.

Reference taken: Keep Duplicates while Using array_diff


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...