麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 網站 > 建站經驗 > 正文

PHP生成plist數據的方法

2024-04-25 20:37:24
字體:
來源:轉載
供稿:網友

本文實例講述了PHP生成plist數據的方法。分享給大家供大家參考。具體如下:

這段代碼實現PHP數組轉換為蘋果plist XML或文本格式

<?PHP

/**

* PropertyList class

* Implements writing Apple Property List (.plist) XML and text files from an array.

*

* @author Jesus A. Alvarez <[email protected]>

*/

function plist_encode_text ($obj) {

$plist = new PropertyList($obj);

return $plist->text();

}

function plist_encode_xml ($obj) {

$plist = new PropertyList($obj);

return $plist->xml();

}

class PropertyList

{

private $obj, $xml, $text;

public function __construct ($obj) {

$this->obj = $obj;

}

private static function is_assoc ($array) {

return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))));

}

public function xml () {

if (isset($this->xml)) return $this->xml;

$x = new XMLWriter();

$x->openMemory();

$x->setIndent(TRUE);

$x->startDocument('1.0', 'UTF-8');

$x->writeDTD('plist', '-//Apple//DTD PLIST 1.0//EN', 'http://www.apple.com/DTDs/PropertyList-1.0.dtd');

$x->startElement('plist');

$x->writeAttribute('version', '1.0');

$this->xmlWriteValue($x, $this->obj);

$x->endElement(); // plist

$x->endDocument();

$this->xml = $x->outputMemory();

return $this->xml;

}

public function text() {

if (isset($this->text)) return $this->text;

$text = '';

$this->textWriteValue($text, $this->obj);

$this->text = $text;

return $this->text;

}

private function xmlWriteDict(XMLWriter $x, &$dict) {

$x->startElement('dict');

foreach($dict as $k => &$v) {

$x->writeElement('key', $k);

$this->xmlWriteValue($x, $v);

}

$x->endElement(); // dict

}

private function xmlWriteArray(XMLWriter $x, &$arr) {

$x->startElement('array');

foreach($arr as &$v)

$this->xmlWriteValue($x, $v);

$x->endElement(); // array

}

private function xmlWriteValue(XMLWriter $x, &$v) {

if (is_int($v) || is_long($v))

$x->writeElement('integer', $v);

elseif (is_float($v) || is_real($v) || is_double($v))

$x->writeElement('real', $v);

elseif (is_string($v))

$x->writeElement('string', $v);

elseif (is_bool($v))

$x->writeElement($v?'true':'false');

elseif (PropertyList::is_assoc($v))

$this->xmlWriteDict($x, $v);

elseif (is_array($v))

$this->xmlWriteArray($x, $v);

elseif (is_a($v, 'PlistData'))

$x->writeElement('data', $v->base64EncodedData());

elseif (is_a($v, 'PlistDate'))

$x->writeElement('date', $v->encodedDate());

else {

trigger_error("Unsupported data type in plist ($v)", E_USER_WARNING);

$x->writeElement('string', $v);

}

}

private function textWriteValue(&$text, &$v, $indentLevel = 0) {

if (is_int($v) || is_long($v))

$text .= sprintf("%d", $v);

elseif (is_float($v) || is_real($v) || is_double($v))

$text .= sprintf("%g", $v);

elseif (is_string($v))

$this->textWriteString($text, $v);

elseif (is_bool($v))

$text .= $v?'YES':'NO';

elseif (PropertyList::is_assoc($v))

$this->textWriteDict($text, $v, $indentLevel);

elseif (is_array($v))

$this->textWriteArray($text, $v, $indentLevel);

elseif (is_a($v, 'PlistData'))

$text .= '<' . $v->hexEncodedData() . '>';

elseif (is_a($v, 'PlistDate'))

$text .= '"' . $v->ISO8601Date() . '"';

else {

trigger_error("Unsupported data type in plist ($v)", E_USER_WARNING);

$this->textWriteString($text, $v);

}

}

private function textWriteString(&$text, &$str) {

$oldlocale = setlocale(LC_CTYPE, "0");

if (ctype_alnum($str)) $text .= $str;

else $text .= '"' . $this->textEncodeString($str) . '"';

setlocale(LC_CTYPE, $oldlocale);

}

private function textEncodeString(&$str) {

$newstr = '';

$i = 0;

$len = strlen($str);

while($i < $len) {

$ch = ord(substr($str, $i, 1));

if ($ch == 0x22 || $ch == 0x5C) {

// escape double quote, backslash

$newstr .= '//' . chr($ch);

$i++;

} else if ($ch >= 0x07 && $ch <= 0x0D ){

// control characters with escape sequences

$newstr .= '//' . substr('abtnvfr', $ch - 7, 1);

$i++;

} else if ($ch < 32) {

// other non-printable characters escaped as unicode

$newstr .= sprintf('/U%04x', $ch);

$i++;

} else if ($ch < 128) {

// ascii printable

$newstr .= chr($ch);

$i++;

} else if ($ch == 192 || $ch == 193) {

// invalid encoding of ASCII characters

$i++;

} else if (($ch & 0xC0) == 0x80){

// part of a lost multibyte sequence, skip

$i++;

} else if (($ch & 0xE0) == 0xC0) {

// U+0080 - U+07FF (2 bytes)

$u = (($ch & 0x1F) << 6) | (ord(substr($str, $i+1, 1)) & 0x3F);

$newstr .= sprintf('/U%04x', $u);

$i += 2;

} else if (($ch & 0xF0) == 0xE0) {

// U+0800 - U+FFFF (3 bytes)

$u = (($ch & 0x0F) << 12) | ((ord(substr($str, $i+1, 1)) & 0x3F) << 6) | (ord(substr($str, $i+2, 1)) & 0x3F);

$newstr .= sprintf('/U%04x', $u);

$i += 3;

} else if (($ch & 0xF8) == 0xF0) {

// U+10000 - U+3FFFF (4 bytes)

$u = (($ch & 0x07) << 18) | ((ord(substr($str, $i+1, 1)) & 0x3F) << 12) | ((ord(substr($str, $i+2, 1)) & 0x3F) << 6) | (ord(substr($str, $i+3, 1)) & 0x3F);

$newstr .= sprintf('/U%04x', $u);

$i += 4;

} else {

// 5 and 6 byte sequences are not valid UTF-8

$i++;

}

}

return $newstr;

}

private function textWriteDict(&$text, &$dict, $indentLevel) {

if (count($dict) == 0) {

$text .= '{}';

return;

}

$text .= "{/n";

$indent = '';

$indentLevel++;

while(strlen($indent) < $indentLevel) $indent .= "/t";

foreach($dict as $k => &$v) {

$text .= $indent;

$this->textWriteValue($text, $k);

$text .= ' = ';

$this->textWriteValue($text, $v, $indentLevel);

$text .= ";/n";

}

$text .= substr($indent, 0, -1) . '}';

}

private function textWriteArray(&$text, &$arr, $indentLevel) {

if (count($arr) == 0) {

$text .= '()';

return;

}

$text .= "(/n";

$indent = '';

$indentLevel++;

while(strlen($indent) < $indentLevel) $indent .= "/t";

foreach($arr as &$v) {

$text .= $indent;

$this->textWriteValue($text, $v, $indentLevel);

$text .= ",/n";

}

$text .= substr($indent, 0, -1) . ')';

}

}

class PlistData

{

private $data;

public function __construct($str) {

$this->data = $str;

}

public function base64EncodedData () {

return base64_encode($this->data);

}

public function hexEncodedData () {

$len = strlen($this->data);

$hexstr = '';

for($i = 0; $i < $len; $i += 4)

$hexstr .= bin2hex(substr($this->data, $i, 4)) . ' ';

return substr($hexstr, 0, -1);

}

}

class PlistDate

{

private $dateval;

public function __construct($init = NULL) {

if (is_int($init))

$this->dateval = $init;

elseif (is_string($init))

$this->dateval = strtotime($init);

elseif ($init == NULL)

$this->dateval = time();

}

public function ISO8601Date() {

return gmdate('Y-m-d/TH:i:s/Z', $this->dateval);

}

}

?>

希望本文所述對大家的php程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日本欧美一区二区三区在线播 | 国产精品久久久久久久久久iiiii | 婷婷久久综合九色综合色多多蜜臀 | 毛片a级毛片免费播放100 | 久久久久久久久久久综合 | 国产精品久久久久久久久久10秀 | 99精彩视频在线观看 | 欧美日韩在线播放 | 精品国产一区二区三区成人影院 | 国产成人强伦免费视频网站 | 欧美成年私人网站 | 依依成人精品视频 | 99精品在线免费 | 另类亚洲孕妇分娩网址 | 欧美激情999 | 毛片在线免费观看网址 | 49vvv| 久久亚洲一区二区三区成人国产 | 高清做爰免费无遮网站挡 | 欧美亚洲一区二区三区四区 | 中文字幕爱爱视频 | 国产一级二级在线播放 | 亚洲生活片| 欧美国产一区二区三区 | 最新亚洲国产 | 国产妞干网 | 1314av| 久草成人在线观看 | 一级毛片电影网 | 久久毛片免费观看 | 一区二区视频在线看 | 黄色的视频在线观看 | 在线亚州 | 999久久久 | 久久久一区二区三区四区 | 久久精品艹 | 日本在线播放一区二区三区 | 国产一区二区三区四区波多野结衣 | 亚洲国产精品久久久久久久久久 | 精品69人人人人 | 中国av免费在线观看 |