Search code examples
phpregexpostal-code

Check / match string against partial strings in array


I am trying to match a full UK postcode against a partial postcode. Take a users postcode, i.e g22 1pf, and see if there's a match / partial match in the array / database.

//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');
}

I do have some code but that was just comparing the strings with fixed lengths from the database. I need the strings in the array / database to be dynamic in length.

The database may contain "g22" this would be a match, it could also contain more or less of the postcode, i.e "g221" or "g221p" which would also be a match. It could contain "g221q" or "g221qr" these would not match.

Help Appreciated, Thank you

edit.

I was possibly overthinking this. the following pseudo code seems to function as expected.

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;
        } 
    }
}

Solution

  • Check the length and strip the one you want to compare it with to the same length.

    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;
        } 
    }
    

    }