聊到php中的數(shù)組序列化操作,不得不提到PHP的序列化和反序列化函數(shù),其中包括serialize() 和unserialize()。
Serialize() 函數(shù)是將變量序列化后獲取字符串,也就是把數(shù)組層層存儲的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為可存儲或可傳輸?shù)淖址7粗瑄nserialize() 函數(shù)是將通過serialize()函數(shù)生成的字符串,還原為原本的數(shù)據(jù)結(jié)構(gòu)。這種特殊的字符串,我們稱之為serialize字符串。
想要進(jìn)一步理解,可以看看以下的例子:
$array = array('name' =>'sam', 'age' =>25, 'city' =>'Beijing'); $serStr = serialize($array); echo $serStr; // output: a:3:{s:4:"name";s:3:"sam";s:3:"age";i:25;s:4:"city";s:7:"Beijing";}
在代碼中,首先定義了一個(gè)關(guān)聯(lián)數(shù)組:$array,數(shù)組中有三個(gè)元素:name,age和city,接著使用serialize()函數(shù)把數(shù)組轉(zhuǎn)化為字符串,并將其打印出來。可以看到,輸出了一個(gè)非常奇怪、雜亂無章的字符串,而這就是該數(shù)組被序列化之后的結(jié)果。
那么unserialize()函數(shù)“反序列化”,對于從serialize()函數(shù)返回的字符串反推回來最初的數(shù)據(jù)結(jié)構(gòu)的操作過程如下所示:
$serStr = 'a:3:{s:4:"name";s:3:"sam";s:3:"age";i:25;s:4:"city";s:7:"Beijing";}'; $array = unserialize($serStr); print_r($array); // output: Array ( [name] =>sam [age] =>25 [city] =>Beijing )
unserialize方法接受一個(gè) Serialize()方法輸出的字符串輸入。理論上unserialize()函數(shù)總是成功的,或者在不符合文本格式的情況下,觸發(fā)一個(gè)E_NOTICE級別的錯(cuò)誤。unserialize 函數(shù)不能創(chuàng)建實(shí)現(xiàn)的匿名類。使用 unserialize()可以安全地重新構(gòu)造之前存儲的對象。
我們還可以使用數(shù)組加序列的方式傳遞參數(shù),下面是一個(gè)實(shí)際的代碼示例:
$arr = array('first_name' =>'san', 'last_name' =>'tony', 'phone' =>array('123','456'), 'hobby' =>'music' ); echo serialize($arr); // a:4:{s:10:"first_name";s:3:"san";s:9:"last_name";s:4:"tony";s:5:"phone";a:2:{i:0;s:3:"123";i:1;s:3:"456";}s:5:"hobby";s:5:"music";}
在這個(gè)代碼段中,我們定義了一個(gè)關(guān)聯(lián)數(shù)組 $arr,數(shù)組中包含三個(gè)鍵值對。 注意數(shù)組中第三行的鍵 phone 其實(shí)是包含了兩個(gè)值的數(shù)組,這個(gè)數(shù)組通過 serialize() 函數(shù)序列化后,可以看到輸出的字符串中,有 a:2 表示數(shù)組中包含兩個(gè)元素。
序列化是一個(gè)非常有用的特性,常用于緩存存儲,網(wǎng)絡(luò)傳輸?shù)炔僮鳌H欢谝恍﹫鼍跋滦枰⒁鈹?shù)組中的值的種類,可序列化數(shù)據(jù)類型包括: boolean,integer,float,string,array,object 和 NULL。傳遞給 unserialize 函數(shù)的字符串,應(yīng)該不允許來自未受信任的源,以避免被植入惡意的處理程序。這個(gè)函數(shù)的使用最好規(guī)避掉來自未知和不可信的源。
以上是PHP中序列化操作的相關(guān)介紹,希望能對你有所幫助!