Примечание. Мой PHP-код, приведенный ниже, является хаком, вместо этого сделайте это. Кто-то ранее опубликовал более подходящее решение, но публикация исчезла. Одним словом, вы уже можете отправлять массивы значений в формах в PHP:
<form ...>
<input type="text" name="contact_info[fname]">
<input type="text" name="contact_info[lname]">
<input type="text" name="contact_info[middle]">
</form>
Квадратные скобки в атрибуте имени делают именно то, что, как вы думаете, они могут сделать. При отправке $_POST['contact_info']
будет массивом с тремя ключами: fname
, lname
и middle
.
.
Если это вообще возможно, вам следует использовать этот метод, а не код, который я написал ниже. Это чище, лучше, удобнее в обслуживании, так и должно быть.
Это забавный вызов. Мы собираемся использовать забавный способ PHP сделать ссылки на наше преимущество. Учитывая, что:
- $ input - это массив, который содержит только пары ключ / значение для $ person
- Точка всегда является символом-разделителем
- Вы никогда не встретите ключ, который имеет значения как массива, так и не массива, т. Е. Никогда не будет и 'contact_info', и 'contact_info.foo'
Тогда эта функция может стать для вас отправной точкой.
function nifty_splitty_magicky_goodness($input) {
// Start out with an empty array.
$person = array();
foreach($input as $k => $v) {
// This turns 'a.b' into array('a', 'b')
$key_parts = explode('.', $k);
// Here's the magic. PHP references aren't to values, but to
// the variables that contain the values. This lets us point at
// array keys without a problem. Sometimes this gets in the way...
$ref = &$person;
foreach($key_parts as $part) {
// If we didn't already turn the thing we're refering to into an array, do so.
if(!is_array($ref))
$ref = array();
// If the key doesn't exist in our reference, create it as an empty array
if(!array_key_exists($part, $ref))
$ref[$part] = array();
// Reset the reference to our new array.
$ref = &$ref[$part];
}
// Now that we're pointing deep into the nested array, we can
// set the inner-most value to what it should be.
$ref = $v;
}
return $person;
}
// Some test data.
$input = array(
'a.b' => 1,
'a.c' => 2,
'a.d.e' => 3,
'f' => 4,
'g.h' => 5
);
// Run it!
var_export(nifty_splitty_magicky_goodness($input));
// Should produce:
array (
'a' =>
array (
'b' => 1,
'c' => 2,
'd' =>
array (
'e' => 3,
),
),
'f' => 4,
'g' =>
array (
'h' => 5,
),
Опять же, это хак. Вы должны использовать обработку форм PHP, чтобы позаботиться об этом за вас.