Проверить / сопоставить строку с частичными строками в массиве

Я пытаюсь сопоставить полный почтовый индекс Великобритании с частичным почтовым индексом.
Возьмите почтовый индекс пользователя, т.е. g22 1pf, и посмотрите, есть ли совпадение / частичное совпадение в массиве / базе данных.

//Sample data
$postcode_to_check= 'g401pf';
//$postcode_to_check= 'g651qr';
//$postcode_to_check= 'g51rq';
//$postcode_to_check= 'g659rs';
//$postcode_to_check= 'g40';

$postcodes = array('g657','g658','g659','g659pf','g40','g5');
$counter=0;

foreach($postcodes as $postcode){
$postcode_data[] = array('id' =>$counter++ , 'postcode' => $postcode, 'charge' => '20.00');
}

У меня есть некоторый код, но он просто сравнивал строки с фиксированной длиной из базы данных. Мне нужно, чтобы строки в массиве / базе данных были динамическими по длине.

База данных может содержать «g22», это будет совпадение, оно также может содержать более или менее почтовый индекс, то есть «g221» или «g221p», который также будет совпадением. Он может содержать «g221q» или «g221qr», они не будут совпадать.

Помощь оценена, спасибо

редактировать.

Я, возможно, задумался над этим. следующий псевдокод, кажется, работает как ожидалось.

check_delivery('g401pf');
//this would match because g40 is in the database.

check_delivery('g651dt');
// g651dt this would NOT match because g651dt is not in the database.

check_delivery('g524pq');
//g524pq this would match because g5 is in the database.

check_delivery('g659pf');
//g659pf this would match because g659 is in the database.

check_delivery('g655pf');
//g655pf this would not match, g665 is not in the database

//expected output, 3 matches

function check_delivery($postcode_to_check){

$postcodes = array('g657','g658','g659','g659pf','g40','g5');
$counter=0;

foreach($postcodes as $postcode){

$stripped_postcode = substr($postcode_to_check,0, strlen($postcode));

if($postcode==$stripped_postcode){
echo "Matched<br><br>";
break;
}
}
}

-2

Решение

       <?php
$postcode_to_check= 'g401pf';

$arr = preg_split("/\d+/",$postcode_to_check,-1, PREG_SPLIT_NO_EMPTY);
preg_match_all('/\d+/', $postcode_to_check, $postcode);
$out = implode("",array_map(function($postcode) {return implode("",$postcode);},$postcode));
$first_char = mb_substr($arr[1], 0, 1);

$MatchingPostcode=$arr[0].''.$out.''.$first_char;
echo $MatchingPostcode;SELECT * FROM my_table WHERE column_name LIKE '%$MatchingPostcode%';

Это грязное решение, но оно решит вашу проблему. Подобные вещи должны обрабатываться в front-end или в DB, ​​но если вы должны сделать это в php, то это решение.

Так что этот код будет соответствовать вам все, что включает g401p, Если вы не хотите совпадать в начале конца, просто удалите % из какой части вы не хотите совпадать. В моем случае, я предоставляю вам, он будет искать для каждой записи столбца, который имеет g401p

0

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

Проверьте длину и удалите ту, с которой хотите сравнить, до той же длины.

function check_delivery ($ postcode_to_check) {

$postcodes = array('g657','g658','g659','g659pf','g40','g5');
$counter=0;

foreach($postcodes as $postcode){

$stripped_postcode = substr($postcode_to_check,0, strlen($postcode));

if($postcode==$stripped_postcode){
echo "Matched<br><br>";
break;
}
}

}

0

По вопросам рекламы [email protected]