ホームページ > バックエンド開発 > PHPチュートリアル > XMLを配列に変換するPHP関数

XMLを配列に変換するPHP関数

WBOY
リリース: 2016-07-25 08:59:08
オリジナル
885 人が閲覧しました
  1. /**

  2. * xml2array() は、指定された XML テキストを XML 構造内の配列に変換します。
  3. * 引数 : $contents - XML テキスト
  4. * $get_attributes - 1 または 0。これが 1 の場合、関数は属性も取得します。タグ値として - これにより、戻り値の配列構造が異なります。
  5. * $priority - 「タグ」または「属性」にすることができます。これにより、結果として得られる配列の構造が変わります。 「タグ」の場合、タグがより重要視されます。
  6. * 戻り値: 配列形式で解析された XML。 print_r() を使用して、結果の配列構造を確認します。
  7. * 例: $array = xml2array(file_get_contents('feed.xml'));
  8. * $array = xml2array(file_get_contents('feed.xml', 1, 'attribute' ));
  9. */
  10. function xml2array($contents, $get_attributes=1, $priority = 'tag') {
  11. if(!$contents) return array();
  12. if(!function_exists('xml_parser_create')) {
  13. //print "'xml_parser_create()' function not found!";
  14. return array();
  15. }
  16. //PHP の XML パーサーを取得する -パーサーが機能するには、PHP にこのモジュールが必要です
  17. $parser = xml_parser_create('');
  18. xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
  19. xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  20. xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  21. xml_parse_into_struct($parser, トリム($contents), $xml_values);
  22. xml_parser_free($parser);
  23. if(!$ xml_values) return;//うーん...
  24. //初期化 bbs.it-home.org
  25. $xml_array = array();
  26. $parents = array();
  27. $opened_tags = array();
  28. $arr = array ();
  29. $current = &$xml_array; //参照
  30. //タグを調べます
  31. $repeat_tag_index = array();//同じ名前の複数のタグは配列に変換されます
  32. foreach($xml_values as $data) {
  33. unset($attributes,$value) );//既存の値を削除しないと問題が発生します
  34. //このコマンドはこれらの変数を foreach スコープに抽出します
  35. //tag(string)、type(string)、level(int)、attributes(array)。
  36. extract($data);//配列を単独で使用することもできますが、このほうが優れています。
  37. $result = array();
  38. $attributes_data = array();

  39. if(isset( $value)) {

  40. if($priority == 'tag') $result = $value;
  41. else $result['value'] = $value; //「属性」モードの場合は、値を連想配列に入れます
  42. }
  43. //属性も設定します
  44. if(isset($attributes) and $get_attributes) {
  45. foreach($attributes as $attr = > $val) {
  46. if($priority == 'tag') $attributes_data[$attr] = $val;
  47. else $result['attr'][$attr] = $val; //すべての属性を 'attr' という配列に設定します
  48. }
  49. }
  50. //タグのステータスを確認し、必要な処理を実行します。
  51. if($type == "open") {//タグの開始 '< tag>'
  52. $parent[$level-1] = &$current;
  53. if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //新しいタグを挿入
  54. $ current[$tag] = $result;
  55. if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
  56. $repeat_tag_index[$tag.'_'.$level] = 1;
  57. $current = &$current[$tag];
  58. } else { //同じ要素を持つ別の要素がありましたタグ名
  59. if(isset($current[$tag][0])) {//0番目の要素がある場合、それはすでに配列です
  60. $current[$tag][$repeat_tag_index[$tag.'_'。 $level]] = $result;
  61. $repeat_tag_index[$tag.'_'.$level]++;
  62. } else {//このセクションでは、同じ名前の複数のタグが一緒に出現する場合、値を配列にします
  63. $ current[$tag] = array($current[$tag],$result);//これにより、既存の項目と新しい項目が結合されて配列が作成されます
  64. $repeat_tag_index[$tag.'_'.$level] = 2;

  65. if(isset($current[$tag.'_attr'])) { //最後(0番目)のタグの属性も移動する必要があります

  66. $current[ $tag]['0_attr'] = $current[$tag.'_attr'];
  67. unset($current[$tag.'_attr']);
  68. }
  69. }
  70. $last_item_index = $repeat_tag_index[$tag.' _'.$level]-1;
  71. $current = &$current[$tag][$last_item_index];
  72. }
  73. } elseif($type == "complete") { //1 行で終わるタグ '< ;tag />'
  74. //キーが既に取得されているかどうかを確認します。
  75. if(!isset($current[$tag])) { //新しいキー
  76. $current[$tag] = $result;
  77. $repeat_tag_index [$tag.'_'.$level] = 1;
  78. if($priority == 'tag' および $attributes_data) $current[$tag. '_attr'] = $attributes_data;
  79. } else { //取得した場合は、すべてを list(array) の中に入れます
  80. if(isset($current[$tag][0]) and is_array($current[$tag] )) {//それがすでに配列である場合...
  81. // ...新しい要素をその配列にプッシュします。
  82. $current[$tag][$repeat_tag_index[$tag.'_'.$level]] = $result;

  83. if($priority == 'tag' および $get_attributes および $attributes_data) {

  84. $current[$tag][$repeat_tag_index[$tag.'_'.$レベル] 。 '_attr'] = $attributes_data;
  85. }
  86. $repeat_tag_index[$tag.'_'.$level]++;
  87. }else { //配列でない場合...
  88. $current[$tag] = array($current[$tag],$result); //...既存の値と新しい値を使って配列にします
  89. $repeat_tag_index[$tag.'_'.$level] = 1;
  90. if($priority == 'tag' and $get_attributes) {
  91. if(isset($current[$tag.'_attr'])) { //最後(0番目)のタグの属性も移動する必要があります

  92. $current[$tag][ '0_attr'] = $current[$tag.'_attr'];

  93. unset($current[$tag.'_attr']);
  94. }

  95. if($attributes_data) {

  96. $current[$tag][$repeat_tag_index[$tag.'_'.$level] 。 '_attr'] = $attributes_data;
  97. }
  98. }
  99. $repeat_tag_index[$tag.'_'.$level]++; //0 と 1 のインデックスは既に取得されています
  100. }
  101. }
  102. } elseif($type == 'close') { //タグ '' の終わり
  103. $current = &$parent[$level-1 ];
  104. }
  105. }

  106. return($xml_array);

  107. }
  108. ?>

复制牌

调の例:

  1. //php之XML转数组関数调用
  2. $arr = xml2array(file_get_contents("tools.xml"),1,'attribute');
  3. ?>
复制代コード


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート