欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php XML转换为数组的代码

程序员文章站 2022-05-13 16:25:41
...
  1. // Xml 转 数组, 包括根键,忽略空元素和属性,尚有重大错误

  2. function xml_to_array( $xml )
  3. {
  4. $reg = "/]*?>([\\x00-\\xFF]*?)/";
  5. if(preg_match_all($reg, $xml, $matches))
  6. {
  7. $count = count($matches[0]);
  8. $arr = array();
  9. for($i = 0; $i {
  10. $key = $matches[1][$i];
  11. $val = xml_to_array( $matches[2][$i] ); // 递归
  12. if(array_key_exists($key, $arr))
  13. {
  14. if(is_array($arr[$key]))
  15. {
  16. if(!array_key_exists(0,$arr[$key]))
  17. {
  18. $arr[$key] = array($arr[$key]);
  19. }
  20. }else{
  21. $arr[$key] = array($arr[$key]);
  22. }
  23. $arr[$key][] = $val;
  24. }else{
  25. $arr[$key] = $val;
  26. }
  27. }
  28. return $arr;
  29. }else{
  30. return $xml;
  31. }
  32. }
  33. // Xml 转 数组, 不包括根键

  34. function xmltoarray( $xml )
  35. {
  36. $arr = xml_to_array($xml);
  37. $key = array_keys($arr);
  38. return $arr[$key[0]];
  39. }
  40. // 类似 XPATH 的数组选择器

  41. function xml_array_select( $arr, $arrpath )
  42. {
  43. $arrpath = trim( $arrpath, '/' );
  44. if(!$arrpath) return $arr;
  45. $self = 'xml_array_select';
  46. $pos = strpos( $arrpath, '/' );
  47. $pos = $pos ? $pos : strlen($arrpath);
  48. $curpath = substr($arrpath, 0, $pos);
  49. $next = substr($arrpath, $pos);
  50. if(preg_match("/\\[(\\d+)\\]$/",$curpath,$predicate))
  51. {
  52. $curpath = substr($curpath, 0, strpos($curpath,"[{$predicate[1]}]"));
  53. $result = $arr[$curpath][$predicate[1]];
  54. }else $result = $arr[$curpath];
  55. if( is_array($arr) && !array_key_exists($curpath, $arr) )
  56. {
  57. die( 'key is not exists:' . $curpath );
  58. }
  59. return $self($result, $next);
  60. }
  61. // 如果输入的数组是全数字键,则将元素值依次传输到 $callback, 否则将自身传输给$callback

  62. function xml_array_each( $arr, $callback )
  63. {
  64. if(func_num_args() if(!is_array($arr)) die('parameter 1 shuld be an array!');
  65. if(!is_callable($callback)) die('parameter 2 shuld be an function!');
  66. $keys = array_keys($arr);
  67. $isok = true;
  68. foreach( $keys as $key ) {if(!is_int($key)) {$isok = false; break;}}
  69. if($isok)
  70. foreach( $arr as $val ) $result[] = $callback($val);
  71. else
  72. $result[] = $callback( $arr );
  73. return $result;
  74. }
  75. ?>
复制代码