代码之家  ›  专栏  ›  技术社区  ›  Thomas Owens

我对PHP关联数组的序列化有些困惑

  •  0
  • Thomas Owens  · 技术社区  · 16 年前
    a:3:{i:0;i:4;i:1;i:3;i:2;i:2;}
    

    我说得对吗?这是一个大小为3的数组,其中的键值对是 0->4 , 1->3 2->2 ?

    如果是这样,我会发现这种表示方式非常混乱。起初,我以为它是一个值列表(或包含的数组 {0, 4, 1, 3, 2, 2} 但是我认为 a:3 :是数组的大小。如果 3 是大小,然后键和值都出现在括号中,无法在不计数的情况下清楚地识别键/值对。

    为了澄清我来自哪里:

    为什么PHP开发人员选择以这种方式序列化?这比var_dump和/或var_export显示其数据的方式有什么优势?

    4 回复  |  直到 13 年前
        1
  •  3
  •   Stefan Gehrig    16 年前
    $string="a:3:{i:0;i:4;i:1;i:3;i:2;i:2;}";
    $array=unserialize($string);
    print_r($array);
    

    出处:

    Array
    (
        [0] => 4
        [1] => 3
        [2] => 2
    )
    

    如果认为关键是PHP不区分整数索引数组和字符串索引哈希表。序列化格式可用于哈希表,方法完全相同: a:<<size>>:{<<keytype>>:<<key>>;<<valuetype>>:<<value>>;...}

    由于格式不是为了让人可读,而是提供一种表示所有PHP变量类型的通用格式(资源除外),我认为使用给定格式更简单,因为可以通过逐个读取字符串来重新构造基础变量。

        2
  •  5
  •   Greg    16 年前

    是的 array(4, 3, 2)

    a 对于数组, i 以整数为键,然后是值。为了得到一个特定的值,您必须进行计数,但是PHP总是反序列化整批数据,所以无论如何它都有一个计数。

    编辑:当你习惯了它的时候,它不会太令人困惑,但是与JSON相比,它可能有些冗长。

    注意:var_export()不处理 循环引用 接近不可能产生 可解析的PHP代码。如果你 想做点什么 数组或对象的表示, 使用serialize()。

        3
  •  1
  •   Peter Bailey    16 年前

    序列化的PHP数据并不是真正用于人类可读的——据我所知,这不是这种格式的目标。

    我认为这种格式之所以看起来如此简洁,最大的原因是它的形式可能还具有与处理速度相关的基础。

        4
  •  0
  •   JamShady    16 年前

    为什么不使用 unserialize() 函数将数据恢复到以前的状态?