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.
Advertisement
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