在PHP中存储,传递和解析简单数组数据的最有效方法

时间:2013-05-24 02:06:57

标签: php arrays json performance serialization

我的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是不是正确的方法,还是只是矫枉过正?

2 个答案:

答案 0 :(得分:1)

一般来说,serialize()json_encode()首选的原因是因为它们的配套功能,使用unserialize()完全可以轻松获取数据和json_decode()

那就是说,使用一个简单的数组就像你正在处理的那样,一个简单的逗号分隔列表就可以了。但是,您可以进行一些改进。但请允许我说清楚:您要完成的工作非常简单,处理效率并不是真正的问题。关注的是清晰度和可维护性,而这正是我们获益的地方。

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

  4. <?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作为序列化的一种形式,原因如下:

  1. 对于简单的数组结构,JSON可以快速编码或进行编码,我执行的测试给json_encode提供了比序列化快35%的速度优势。

  2. 与平面文本文件不同,JSON支持嵌套数据结构,因此它将来会更具前景。

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

    < / LI>
  4. JSON序列化数据小于序​​列化结果。 (但比同等的平面文件更多)

  5. JSON是可移植的...只有PHP才能读取序列化的结果...该死的附近一切都可以读取json。允许使用其他语言或工具来使用数据。

  6. 至于保存到数据库,我总是使用TEXT mysql数据类型。它允许2 ^ 16个字符,我已经存储了更多,然后我应该在这些列中,并没有遇到任何问题。

    那是我的两分钱。