首页 > 开发 > PHP > 正文

PHP生成plist数据的方法

2024-05-04 23:36:16
字体:
来源:转载
供稿:网友

这篇文章主要介绍了PHP生成plist数据的方法,可实现PHP数组转换为苹果plist XML或文本格式的功能,需要的朋友可以参考下

本文实例讲述了PHP生成plist数据的方法。分享给大家供大家参考。具体如下:

这段代码实现PHP数组转换为苹果plist XML或文本格式

 

 
  1. <?PHP 
  2. /** 
  3. * PropertyList class 
  4. * Implements writing Apple Property List (.plist) XML and text files from an array. 
  5. * 
  6. * @author Jesus A. Alvarez <zydeco@namedfork.net> 
  7. */ 
  8. function plist_encode_text ($obj) { 
  9. $plist = new PropertyList($obj); 
  10. return $plist->text(); 
  11. function plist_encode_xml ($obj) { 
  12. $plist = new PropertyList($obj); 
  13. return $plist->xml(); 
  14. class PropertyList 
  15. private $obj$xml$text
  16. public function __construct ($obj) { 
  17. $this->obj = $obj
  18. private static function is_assoc ($array) { 
  19. return (is_array($array) && 0 !== count(array_diff_key($arrayarray_keys(array_keys($array))))); 
  20. public function xml () { 
  21. if (isset($this->xml)) return $this->xml; 
  22. $x = new XMLWriter(); 
  23. $x->openMemory(); 
  24. $x->setIndent(TRUE); 
  25. $x->startDocument('1.0''UTF-8'); 
  26. $x->writeDTD('plist''-//Apple//DTD PLIST 1.0//EN''http://www.apple.com/DTDs/PropertyList-1.0.dtd'); 
  27. $x->startElement('plist'); 
  28. $x->writeAttribute('version''1.0'); 
  29. $this->xmlWriteValue($x$this->obj); 
  30. $x->endElement(); // plist 
  31. $x->endDocument(); 
  32. $this->xml = $x->outputMemory(); 
  33. return $this->xml; 
  34. public function text() { 
  35. if (isset($this->text)) return $this->text; 
  36. $text = ''
  37. $this->textWriteValue($text$this->obj); 
  38. $this->text = $text
  39. return $this->text; 
  40. private function xmlWriteDict(XMLWriter $x, &$dict) { 
  41. $x->startElement('dict'); 
  42. foreach($dict as $k => &$v) { 
  43. $x->writeElement('key'$k); 
  44. $this->xmlWriteValue($x$v); 
  45. $x->endElement(); // dict 
  46. private function xmlWriteArray(XMLWriter $x, &$arr) { 
  47. $x->startElement('array'); 
  48. foreach($arr as &$v
  49. $this->xmlWriteValue($x$v); 
  50. $x->endElement(); // array 
  51. private function xmlWriteValue(XMLWriter $x, &$v) { 
  52. if (is_int($v) || is_long($v)) 
  53. $x->writeElement('integer'$v); 
  54. elseif (is_float($v) || is_real($v) || is_double($v)) 
  55. $x->writeElement('real'$v); 
  56. elseif (is_string($v)) 
  57. $x->writeElement('string'$v); 
  58. elseif (is_bool($v)) 
  59. $x->writeElement($v?'true':'false'); 
  60. elseif (PropertyList::is_assoc($v)) 
  61. $this->xmlWriteDict($x$v); 
  62. elseif (is_array($v)) 
  63. $this->xmlWriteArray($x$v); 
  64. elseif (is_a($v'PlistData')) 
  65. $x->writeElement('data'$v->base64EncodedData()); 
  66. elseif (is_a($v'PlistDate')) 
  67. $x->writeElement('date'$v->encodedDate()); 
  68. else { 
  69. trigger_error("Unsupported data type in plist ($v)", E_USER_WARNING); 
  70. $x->writeElement('string'$v); 
  71. private function textWriteValue(&$text, &$v$indentLevel = 0) { 
  72. if (is_int($v) || is_long($v)) 
  73. $text .= sprintf("%d"$v); 
  74. elseif (is_float($v) || is_real($v) || is_double($v)) 
  75. $text .= sprintf("%g"$v); 
  76. elseif (is_string($v)) 
  77. $this->textWriteString($text$v); 
  78. elseif (is_bool($v)) 
  79. $text .= $v?'YES':'NO'
  80. elseif (PropertyList::is_assoc($v)) 
  81. $this->textWriteDict($text$v$indentLevel); 
  82. elseif (is_array($v)) 
  83. $this->textWriteArray($text$v$indentLevel); 
  84. elseif (is_a($v'PlistData')) 
  85. $text .= '<' . $v->hexEncodedData() . '>'
  86. elseif (is_a($v'PlistDate')) 
  87. $text .= '"' . $v->ISO8601Date() . '"'
  88. else { 
  89. trigger_error("Unsupported data type in plist ($v)", E_USER_WARNING); 
  90. $this->textWriteString($text$v); 
  91. private function textWriteString(&$text, &$str) { 
  92. $oldlocale = setlocale(LC_CTYPE, "0"); 
  93. if (ctype_alnum($str)) $text .= $str
  94. else $text .= '"' . $this->textEncodeString($str) . '"'
  95. setlocale(LC_CTYPE, $oldlocale); 
  96. private function textEncodeString(&$str) { 
  97. $newstr = ''
  98. $i = 0; 
  99. $len = strlen($str); 
  100. while($i < $len) { 
  101. $ch = ord(substr($str$i, 1)); 
  102. if ($ch == 0x22 || $ch == 0x5C) { 
  103. // escape double quote, backslash 
  104. $newstr .= '//' . chr($ch); 
  105. $i++; 
  106. else if ($ch >= 0x07 && $ch <= 0x0D ){ 
  107. // control characters with escape sequences 
  108. $newstr .= '//' . substr('abtnvfr', $ch - 7, 1); 
  109. $i++; 
  110. else if ($ch < 32) { 
  111. // other non-printable characters escaped as unicode 
  112. $newstr .= sprintf('/U%04x'$ch); 
  113. $i++; 
  114. else if ($ch < 128) { 
  115. // ascii printable 
  116. $newstr .= chr($ch); 
  117. $i++; 
  118. else if ($ch == 192 || $ch == 193) { 
  119. // invalid encoding of ASCII characters 
  120. $i++; 
  121. else if (($ch & 0xC0) == 0x80){ 
  122. // part of a lost multibyte sequence, skip 
  123. $i++; 
  124. else if (($ch & 0xE0) == 0xC0) { 
  125. // U+0080 - U+07FF (2 bytes) 
  126. $u = (($ch & 0x1F) << 6) | (ord(substr($str$i+1, 1)) & 0x3F); 
  127. $newstr .= sprintf('/U%04x'$u); 
  128. $i += 2; 
  129. else if (($ch & 0xF0) == 0xE0) { 
  130. // U+0800 - U+FFFF (3 bytes) 
  131. $u = (($ch & 0x0F) << 12) | ((ord(substr($str$i+1, 1)) & 0x3F) << 6) | (ord(substr($str$i+2, 1)) & 0x3F); 
  132. $newstr .= sprintf('/U%04x'$u); 
  133. $i += 3; 
  134. else if (($ch & 0xF8) == 0xF0) { 
  135. // U+10000 - U+3FFFF (4 bytes) 
  136. $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); 
  137. $newstr .= sprintf('/U%04x'$u); 
  138. $i += 4; 
  139. else { 
  140. // 5 and 6 byte sequences are not valid UTF-8 
  141. $i++; 
  142. return $newstr
  143. private function textWriteDict(&$text, &$dict$indentLevel) { 
  144. if (count($dict) == 0) { 
  145. $text .= '{}'
  146. return
  147. $text .= "{/n"
  148. $indent = ''
  149. $indentLevel++; 
  150. while(strlen($indent) < $indentLevel$indent .= "/t"
  151. foreach($dict as $k => &$v) { 
  152. $text .= $indent
  153. $this->textWriteValue($text$k); 
  154. $text .= ' = '
  155. $this->textWriteValue($text$v$indentLevel); 
  156. $text .= ";/n"
  157. $text .= substr($indent, 0, -1) . '}'
  158. private function textWriteArray(&$text, &$arr$indentLevel) { 
  159. if (count($arr) == 0) { 
  160. $text .= '()'
  161. return
  162. $text .= "(/n"
  163. $indent = ''
  164. $indentLevel++; 
  165. while(strlen($indent) < $indentLevel$indent .= "/t"
  166. foreach($arr as &$v) { 
  167. $text .= $indent
  168. $this->textWriteValue($text$v$indentLevel); 
  169. $text .= ",/n"
  170. $text .= substr($indent, 0, -1) . ')'
  171. class PlistData 
  172. private $data
  173. public function __construct($str) { 
  174. $this->data = $str
  175. public function base64EncodedData () { 
  176. return base64_encode($this->data); 
  177. public function hexEncodedData () { 
  178. $len = strlen($this->data); 
  179. $hexstr = ''
  180. for($i = 0; $i < $len$i += 4) 
  181. $hexstr .= bin2hex(substr($this->data, $i, 4)) . ' '
  182. return substr($hexstr, 0, -1); 
  183. class PlistDate 
  184. private $dateval
  185. public function __construct($init = NULL) { 
  186. if (is_int($init)) 
  187. $this->dateval = $init
  188. elseif (is_string($init)) 
  189. $this->dateval = strtotime($init); 
  190. elseif ($init == NULL) 
  191. $this->dateval = time(); 
  192. public function ISO8601Date() { 
  193. return gmdate('Y-m-d/TH:i:s/Z'$this->dateval); 
  194. ?> 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表