将序列化到单个字段的替代方案是将其序列化为多个隐藏字段。我编写了一个通用函数来执行此操作。此函数和示例正在GistHub的Gist服务上管理。请前往那里查看最新版本,但为了方便,也复制在这里。
<?php
function array_to_input($array, $prefix='') {
if( (bool)count(array_filter(array_keys($array), 'is_string')) ) {
foreach($array as $key => $value) {
if( empty($prefix) ) {
$name = $key;
} else {
$name = $prefix.'['.$key.']';
}
if( is_array($value) ) {
array_to_input($value, $name);
} else { ?>
<input type="hidden" value="<?php echo $value ?>" name="<?php echo $name?>">
<?php }
}
} else {
foreach($array as $item) {
if( is_array($item) ) {
array_to_input($item, $prefix.'[]');
} else { ?>
<input type="hidden" name="<?php echo $prefix ?>[]" value="<?php echo $item ?>">
<?php }
}
}
}
以下是一些示例用法:
基本关联数组
echo array_to_input(array('foo' => 'bar', 'cat' => 'dog'));
将输出:
<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">
嵌套索引数组的关联数组
echo array_to_input(array('foo' => 'bar', 'cat' => 'dog', 'list' => array('a', 'b', 'c')));
将输出:
<input type="hidden" value="bar" name="foo">
<input type="hidden" value="dog" name="cat">
<input type="hidden" name="list[]" value="a">
<input type="hidden" name="list[]" value="b">
<input type="hidden" name="list[]" value="c">
嵌套关联数组
echo array_to_input(array('foo' => array('bar' => 'baz', 'a' => 'b'), 'cat' => 'dog'));
将输出:
<input type="hidden" value="baz" name="foo[bar]">
<input type="hidden" value="b" name="foo[a]">
<input type="hidden" value="dog" name="cat">
疯狂起来
echo array_to_input(array('a' => array('b' => array('c' => array('d' => 'e')))));
将输出:
<input type="hidden" value="e" name="a[b][c][d]">