A: 

I'm not certain what you mean by saying that you cannot know ahead of time what the name-value pairs will be.

In reference to your example, this will work:

<?php

$person['contact_info']['fname']  = $_GET['contact_info.fname'];
$person['contact_info']['lname']  = $_GET['contact_info.middle'];
$person['contact_info']['middle'] = $_GET['contact_info.lname']);    

?>

Not knowing the values in advance is a given - that's the way it is with user input.

You must know the keys in advance. Without this information you cannot know how to map values in $_GET to values in $person.

If you don't know the keys in advance you cannot solve this problem. If you don't know the keys in advance there is a serious flaw in the design of your software.

Jon Cram
While I can't think of a real-world scenario where you'd want to allow someone to post arbitrarily nested data like this, I don't see why such a requirement would be illegitimate. And you certainly can solve the problem...
timdev
If you prefer, re-word the question so that "values" is replaced with "keys" as you have indicated. By "values" I mean the scalars that map to keys, so using your terms, I cannot know the *keys* in advance. As for the "serious design flaw" bit ... there are many responses to this, but suffice it to say there's more to this question than meets the eye, depending on how you look at it.
dreftymac
A: 
Charles
Nice. Should write that using some recursion, that was you can handle contact_info.address.street :)
Ben
It should be able to handle that already. See the 'a.d.e' example. The explode and foreach and reference assigning will make it go as deep as needed.
Charles
The post I linked to with what I felt is the real, correct solution is gone, so I've now integrated that into my answer.
Charles
I am aware of the square-bracket notation and PHP form processing, but the problem is, that only works with $_POST ... how can this work with $_GET variables, which are simple flat name-value pairs?
dreftymac
It'll work with $_GET, it'll even work with cookies and $_COOKIE. I used $_POST as the example above, assuming you had an HTML page posting a form. Clearly that's a bad assumption. :)
Charles