【问题标题】:Most efficient way to store, pass, and parse simple array data in PHP在 PHP 中存储、传递和解析简单数组数据的最有效方法
【发布时间】:2013-05-19 13:33:04
【问题描述】:

我的 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 之后,我的问题是:

  1. 优化现有代码效率的最佳方法是什么?
  2. 使用不同的方法将简单的索引数组转换为可以存储在数据库中的东西是否会带来任何性能优势?
    1. 使用 BLOB 列类型与我目前使用的 varchar(255) 相比如何?
    2. 既然它不是一个关联数组,那么json_encode 会是正确的方法,还是只是矫枉过正?

【问题讨论】:

  • 为什么不直接使用内置的serialize()函数呢?

标签: php arrays json performance serialization


【解决方案1】:

一般来说,首选serialize()json_encode() 的原因是因为它们的配套功能,使用unserialize()json_decode() 可以很容易地恢复数据,就像您开始时一样。

也就是说,对于您正在处理的简单数组,简单的逗号分隔列表就可以了。但是,您可以进行一些改进。但让我明确一点:您要完成的工作非常简单,以至于处理效率并不是真正关心的问题。需要关注的是清晰度和可维护性,而这正是我们获得收益的地方。

  1. 如果您的所有复选框都有非空值(例如,它们都不是这样设置的:&lt;input type="checkbox" name="value[]" value="" /&gt;),那么您可能不需要从列表中删除空值。我知道的所有现代浏览器都不会为未选中的复选框发送 任何 数据。也就是说……
  2. 这样做还是不错的。但是你要重复两次,在你内爆之前和之后。你根本不需要sanitize()。但不仅如此......
  3. 我们还可以进行更多改进,既可以扩展简单序列化的功能,又可以使其交互更简单。同时利用 PHP 提供的所有速度...

<?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);
}
?>

【讨论】:

    【解决方案2】:

    首先要解决缺少数据元素和规范化输入的问题,我总是使用 array_merge 来设置默认值。例如。

    $defaults = array("checkbox1"=>false, "checkbox2"=>0);
    $data = array_merge($defaults, $_POST);
    

    我会说切换到 JSON 作为一种序列化形式,原因如下:

    1. JSON 的编码速度很快,我执行的测试表明 json_encode 对于简单数组结构的序列化速度有 35% 的优势。

    2. JSON 支持嵌套数据结构,这与平面文本文件不同,因此它会在未来得到更多证明。

    3. JSON 至少允许一个命名标签,它至少是正在发生的事情的线索。并转换为关联数组...如果您正在处理具有大量键的数据集,这很有帮助...两个月后$a["profile"]["header_font"]$a[12][4] 更有意义;

    4. JSON 序列化数据小于序​​列化结果。 (但更多的是可比较的平面文件)

    5. JSON 是可移植的……只有 PHP 可以读取序列化的结果……该死的几乎所有东西都可以读取 json。允许使用其他语言或工具来利用数据。

    至于保存到数据库,我一直只使用 TEXT mysql 数据类型。它允许 2^16 个字符,并且我在这些列中存储的内容比我应该存储的要多,并且没有遇到任何问题。

    这是我的两分钱。

    【讨论】:

    • 对于一般情况,我同意并且我自己已经开始使用json_encode。但是,如果他处于保证一个简单的一维数组(数字,如果示例没有显着简化)的场景中,那么使用逗号分隔的列表将是一个很好的(并且易于访问,便携和可读,并且空间有效)的方式来处理它。
    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2021-11-27
    • 2011-03-29
    • 2016-08-27
    • 1970-01-01
    • 2020-03-05
    • 2017-08-06
    • 1970-01-01
    相关资源
    最近更新 更多