PHP сравнивает две строки с одним символом, отличающимся в обоих, подстановочный подход

нужно сравнить две строки, чтобы получить PAIR только с условием, что только 5-й символ должен быть другим … в mysql это может быть достигнуто с помощью INBXOLC800Y = INBX_LC800Y (с использованием подстановочного знака ‘_’), но как это сделать в PHP … вот мой код до сих пор, но я думаю, что может быть более умный и / или кратчайший путь ???

$first_sku_full  = "INBXOLC800Y"; // with O
$second_sku_full = "INBXTLC800Y"; // with T

$first_sku_first_part= substr($first_sku_full,0,4); //gives first 4 characters INBX
$second_sku_first_part= substr($second_sku_full,0,4); //gives first 4 characters INBX

if($first_sku_first_part == $second_sku_first_part){  // matching first 4 characters

$first_sku_last_part= substr($first_sku_full, 5);   // gives 6th onward characters i.e, LC800Y
$second_sku_last_part= substr($second_sku_full, 5); // gives 6th onward characters i.e, LC800Y
if ( $first_sku_last_part == $second_sku_last_part ) { // matching 6th and onward characters
if ( $first_sku_full != $second_sku_full ) { // matching full strings
echo "first and second sku is a pair <br/>";
}else{
echo "NOT a pair , both SKUs are same <br/>";
}
}else{
echo "NOT a pair , last part of string not matched $first_sku_last_part vs $second_sku_last_part <br/>";
}
}else{
echo "NOT a pair , first part of string not matched $first_sku_first_part vs $second_sku_first_part<br/>";

}

2

Решение

Попробуйте эту функцию:

function isOnlyThe5thCharacterDifferent($inp1,$inp2)
{
if ($inp1[4]!=$inp2[4])
{
$inp1[4]=$inp2[4];

return ($inp1==$inp2);
}

return false;
}

увидеть это в действии: https://3v4l.org/fn2sG

2

Другие решения

«с единственным условием, что только 5-й символ должен быть другим»

$first_sku_full  = "INBXOLC800Y"; // with O
$second_sku_full = "INBXTLC800Y";

if($first_sku_full[4] != $second_sku_full[4]) {
//fifth character is different in case above it will return true because O != T
}

Таким образом, вы можете проверить, если пятый символ отличается. Вы можете получить доступ к строковым буквам с помощью оператора массива в PHP.

Если вы хотите сравнить остаток строки без 5 символов, вы можете сделать это, как показано ниже

$first_sku_full  = "INBXOLC800Y"; // with O
$second_sku_full = "INBXTLC800Y";

$first_sku_full[4] = $second_sku_full[4] = '';

if($first_sku_full == $second_sku_full) {
//the strings are same despite 5th character
}
2

Заменить часть 5-й символ постоянной строкой

$first_sku_full_masked = substr_replace($first_sku_full, '#', 4, 1);
$second_sku_full_masked = substr_replace($second_sku_full, '#', 4, 1);

а потом сравни.

Что дает

INBX#LC800Y
INBX#LC800Y

который будет считаться равным. Таким образом, условие будет

$first_sku_full_masked==$second_sku_full_masked && $first_sku_full!=$second_sku_full
1

С помощью этого кода вы можете легко настроить N позиции, которые должны быть не равны

<?php
$first_sku_full  = "INBXPLC800YF"; // with O
$second_sku_full = "INBXTLC800YD"; // with T

var_dump(isEqual($first_sku_full, $second_sku_full, array(4, 11)));
/**
* @param1 string $str1
* @param1 string $str2
* @param1 array  $pos
* @return boolean
*/
function isEqual($str1, $str2, $pos) {
if       (strlen($str1) != strlen($str2))                return FALSE;

for ($i=0 ; $i< strlen($str1) ; $i++) {
if   ( in_array($i, $pos) && $str1[$i] == $str2[$i]) return FALSE;
if   (!in_array($i, $pos) && $str1[$i] != $str2[$i]) return FALSE;
}
return TRUE;
}
0

Здесь вы можете определить свой собственный шаблон или объединить его с решением из
«Halayem Anis», чтобы определить более одного символа подстановки

// just an example array
$arrayToCheck = array(
"INBXOLC800Y",
"INBXOLC809Y",
"INBXTLC800Y",
"INBXALC800Y",
);

function compareWithWildcard( $stringToCompare, $compareWith, $wildcard = "_" ) {
if( !$wildcard ) return ( $stringToCompare == $compareWith );

$wildcardIndex = strpos( $compareWith, $wildcard );

if( $wildcardIndex !== false ) {
$stringToCompare[$wildcardIndex] = $wildcard;
}

return ( $stringToCompare == $compareWith );
}

$compareTo = "INBX_LC800Y";

var_dump( compareWithWildcard( $arrayToCheck[0], $compareTo ) );
0
По вопросам рекламы [email protected]