【问题标题】:PHP Array SerializationPHP数组序列化
【发布时间】:2012-06-10 01:16:15
【问题描述】:

我正在开发一个以某种方式在数据库中存储对象数组的系统。

像这样:

key             | value
------------------------------
person_0_name   | David
person_0_age    | 32
person_0_job    | Programmer
person_1_name   | Sue
person_1_age    | 26
person_1_job    | Teacher
person_2_name   | Jon
person_2_age    | 40
person_2_job    | Bus Driver

这是一种编造的格式吗?我想知道是否有一种简单的方法来反序列化?

【问题讨论】:

    标签: php database arrays serialization


    【解决方案1】:

    我觉得上面说的有点绕。根据您访问数据库的方式,可以轻松调整以下内容。我使用了最简单的数据库连接形式。

    代码:

    <?php
    $m = mysql_connect('localhost', 'root', 'stack');
    mysql_select_db('stack');
    
    $q = mysql_query('SELECT * FROM example');
    
    $arr = array();
    
    while($row = mysql_fetch_assoc($q)){
        $arr[substr($row['key'],0, 8)][substr($row['key'],9)] = $row['value'];
        print_r($arr);
    }
    

    结果看起来像

    Array
    (
        [person_0] => Array
        (
            [name] => David
            [age] => 32
            [job] => Programmer
        )
    
    )
    

    如果您有任何问题,请告诉我。简而言之,脚本会在键字段上创建一个子字符串,以根据人员/值创建数组键。

    享受 - 经济特区

    【讨论】:

      【解决方案2】:

      这是一种虚构的格式,显然是由不懂数据库设计的人完成的。您需要为persons 创建一个包含四列的表格:

      1. 身份证
      2. 姓名
      3. 年龄
      4. 工作

      然后每一行都应该填充每个person 的数据。第一列是唯一 ID。

      【讨论】:

        【解决方案3】:

        嗯,你可能想要这样的东西:

        $lines = explode("\n",$data);
        $keys = array_shift($lines);
        array_shift($lines); // discard the line of dashes
        $keylist = Array();
        foreach(explode("|",$keys) as $k) {
            $keylist[] = trim($k);
        }
        $out = Array();
        foreach($lines as $line) {
            foreach(explode("|",$line) as $i=>$l) {
                $out[$keylist[$i]] = trim($l);
            }
        }
        // var_dump($out);
        

        唯一的缺点是,如果数据中有空格,它不会保留尾随空格 - 可能不会造成巨大损失。

        【讨论】:

        • 对不起,我想我把你弄糊涂了。问题中的表格有两列,每一行实际上是一行。
        猜你喜欢
        • 2011-08-11
        • 2014-07-14
        • 1970-01-01
        • 2013-03-01
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多