序列化为单个字段的另一种解决方案是序列化为多个隐藏字段。我写了一个通用函数来做到这一点。此函数和示例在 GistHub 的 Gist 服务中进行管理。检查那里的最新版本,但为方便起见,请在此处复制。
<?php
# https://gist.github.com/eric1234/5802030
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]">