我的PHP脚本从HTML输入接收数据作为数组:
<input type="checkbox" name="value[]" value="1" />
<input type="checkbox" name="value[]" value="2" />
<input type="checkbox" name="value[]" value="3" />
...
我目前的序列化方法是这样的:
<?php
class DataClass {
private $separator = ",";
private function sanitize($input){
$patterns = array(
'/^'.$this->separator.'/',
'/'.$this->separator.$this->separator.'/',
'/'.$this->separator.'$/'
);
$replacements = array(
'',
$this->separator,
''
);
return preg_replace($patterns, $replacements, $input);
}
public function deserialize($input){
return explode($this->separator, $this->sanitize($input));
}
private function serialize($input){
$bucket = array();
if(is_array($input)):
foreach($input as $value){
if(!empty($value)):
array_push($bucket, $value);
endif;
}
return $this->sanitize(implode($this->separator, $bucket));
else:
return "";
endif;
}
public function store($formdata) {
$formdata['value'] = empty($formdata['value']) ? '' : $this->serialize($formdata['value']);
// save $formdata to database
}
}
?>
所以,在阅读this post后,我的问题就是:
json_encode
是不是正确的方法,还是只是矫枉过正?答案 0 :(得分:1)
一般来说,serialize()
或json_encode()
首选的原因是因为它们的配套功能,使用unserialize()
完全可以轻松获取数据和json_decode()
。
那就是说,使用一个简单的数组就像你正在处理的那样,一个简单的逗号分隔列表就可以了。但是,您可以进行一些改进。但请允许我说清楚:您要完成的工作非常简单,处理效率并不是真正的问题。关注的是清晰度和可维护性,而这正是我们获益的地方。
<input type="checkbox" name="value[]" value="" />
),那么您可能不需要从列表中删除空值。我所知道的所有现代浏览器都不会为未选中的复选框发送任何数据。那说...... sanitize()
。但不仅仅是...... <?php
private function serialize($input) {
// I've changed this, generally speaking you probably
// don't actually want "serialize" to turn a non-array
// variable into an empty string
if (is_scalar($input)) return $input;
// we still test for an array, because it could potentially
// be something else...
elseif (is_array($input)) {
$bucket = array();
foreach ($input as $value) {
// empty() will match 0, so that's probably not
// what we want... if we test for length, then
// it'll match anything we might reasonably want
// to record
if (strlen($value)) $bucket[] = $value;
}
return implode($this->separator, $bucket);
}
// if we've got an object, we just serialize with our
// chosen method: serialize() or json_encode()
elseif (is_object($input)) return serialize($input);
// otherwise, we have no reasonable way to serialize
else return ''; // we might also return NULL
}
?>
...如果我们知道有关数据的某些事情,我们可以使它更简单。例如,如果我们知道所有的值都是唯一的,那么我们可以非常直接地了解我们正在寻找的东西:
<?php
elseif (is_array($input)) {
$input = array_unique($input);
if (in_array('', $input)) array_splice($input, array_search('', $input), 1);
return implode($input);
}
?>
答案 1 :(得分:1)
首先解决丢失数据元素和规范化输入的问题我总是使用array_merge来设置默认值。例如。
$defaults = array("checkbox1"=>false, "checkbox2"=>0);
$data = array_merge($defaults, $_POST);
我会说切换到JSON作为序列化的一种形式,原因如下:
对于简单的数组结构,JSON可以快速编码或进行编码,我执行的测试给json_encode
提供了比序列化快35%的速度优势。
与平面文本文件不同,JSON支持嵌套数据结构,因此它将来会更具前景。
JSON至少允许一个命名标签,至少是发生了什么的线索。并且转换为关联数组...如果您正在处理具有大量键的数据集,则会很有帮助...两个月后$a["profile"]["header_font"]
比$a[12][4]
更有意义;
JSON序列化数据小于序列化结果。 (但比同等的平面文件更多)
JSON是可移植的...只有PHP才能读取序列化的结果...该死的附近一切都可以读取json。允许使用其他语言或工具来使用数据。
至于保存到数据库,我总是使用TEXT mysql数据类型。它允许2 ^ 16个字符,我已经存储了更多,然后我应该在这些列中,并没有遇到任何问题。
那是我的两分钱。