0

I have the following street names and house numbers in a text file:

Albert Dr: 4116-4230, 4510, 4513-4516
Bergundy Pl: 1300, 1340-1450
David Ln: 3400, 4918, 4928, 4825
Garfield Av: 5000, 5002, 5004, 5006, 8619-8627, 9104-9113
....

This data represents the boundary data for a local neighborhood (i.e., what houses are inside the community).

I want to make a PHP script that will take a user's input (in the form of something like "4918 David Lane" or "3000 Bergundy") search this list, and return a yes/no response whether that house exists within the boundaries.

What would be an efficient way to parse the input (regex?) and compare it to the text list?

Thanks for the help!

2
  • 3
    What have you tried? Commented Jun 13, 2012 at 21:25
  • Any reason you can't use a database, even if it's sqlite? Commented Jun 13, 2012 at 21:29

5 Answers 5

1

It's better to store this info in a database so that you don't have to parse out the data from a text file. Regexes are also not generally applicable to find a number in a range so a general purpose language is advised as well.

But... if you want to do it with regexes (and see why it's not a good idea)

To lookup the numbers for a street use

David Ln:(.*)

To then get the numbers use

[^,]*
Sign up to request clarification or add additional context in comments.

Comments

1

You could simply import the file into a string. After this is done, breack each line of the file in an array so Array(Line 1=> array(), Line 2=> array(), etc. After this is done, you can explode using :. After, you'll simply need to search in the array. Not the fastest way, but it may be faster then regex.

You should sincerely consider using a database or re-think how your file are.

Comments

0

Try something like this, put your street names inside test.txt.. Now that you are able to get the details inside the text file, just compare it with the values that you submit in your form.

 $filename = 'test.txt';
        if(file_exists($filename)) {
            if($handle = fopen($filename, 'r')) {
                $name = array();
                while(($file = fgets($handle)) !==FALSE) {
                    preg_match('#(.*):(.*)#', $file, $match);
                    $array = explode(',', $match[2]);
                    foreach($array as $val) {
                        $name[$match[1]][] = $val;
                    }

                }
            }
        }

Comments

0

As mentioned, using a database to store street numbers that are relational to your street names would be ideal. I think a way you could implement this with your text file though is to create a a 2D array; storing the street names in the first array and the valid street numbers in their respective arrays.

Parse the file line by line in a loop. Parse the street name and store in array, then use a nested loop to parse all of the numbers (for ones in a range like 1414-1420, you can use an additional loop to get each number in the range) and build the next array in the initial street name array element. When you have your 2D array, you can do a simple nested loop to check it for a match.

I will try to make a little pseudo-code for you..

pseudocode:

$addresses = array();
$counter = 0;
$line = file->readline
while(!file->eof)
{
  $addresses[$counter] = parse_street_name($line);
  $numbers_array = parse_street_numbers($line);
  foreach($numbers_array as $num)
    $addresses[$counter][] = $num;

  $line = file->readline
  $counter++;
}

1 Comment

Sorry if the pseudocode is poor. I'm just hoping it helps give you implementation ideas, as it seems like implementation is what you're looking for. It is not valid code.
0

It's better if you store your streets in a separate table with IDs, and store numbers in separate table one row for each range or number and street id.

For example:

streets:

ID, street
-----------
1, Albert Dr
2, Bergundy Pl
3, David Ln
4, Garfield Av
...

houses:

street_id, house_min, house_max
-----------------
1, 4116, 4230
1, 4510, 4510
1, 4513, 4516
2, 1300, 1300
2, 1340, 1450
...

In the rows, where no range but one house number, you set both min and max to the same value.

You can write a script, that will parse your txt file and save all data to db. That should be as easy as several loops and explode() with different parameters and some insert queries too.

Then with first query you get street id

SELECT id FROM streets WHERE street LIKE '%[street name]%'

After that you run second query and get answer, is there such house number on that street

SELECT COUNT(*) 
FROM houses 
WHERE street_id = [street_id] 
    AND [house_num] BETWEEN house_min AND house_max

Inside [...] you put real values, dont forget to escape them to prevent sql injections...

Or you even can run just one query using JOIN.

Also you should make sure that your given house number is integer, not float.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.