XMLを配列に変換するPHP関数
リリース: 2016-07-25 08:59:08
-
-
- /**
- * xml2array() は、指定された XML テキストを XML 構造内の配列に変換します。
- * 引数 : $contents - XML テキスト
- * $get_attributes - 1 または 0。これが 1 の場合、関数は属性も取得します。タグ値として - これにより、戻り値の配列構造が異なります。
- * $priority - 「タグ」または「属性」にすることができます。これにより、結果として得られる配列の構造が変わります。 「タグ」の場合、タグがより重要視されます。
- * 戻り値: 配列形式で解析された XML。 print_r() を使用して、結果の配列構造を確認します。
- * 例: $array = xml2array(file_get_contents('feed.xml'));
- * $array = xml2array(file_get_contents('feed.xml', 1, 'attribute' ));
- */
- function xml2array($contents, $get_attributes=1, $priority = 'tag') {
- if(!$contents) return array();
- if(!function_exists('xml_parser_create')) {
- //print "'xml_parser_create()' function not found!";
- return array();
- }
- //PHP の XML パーサーを取得する -パーサーが機能するには、PHP にこのモジュールが必要です
- $parser = xml_parser_create('');
- xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
- xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
- xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parse_into_struct($parser, トリム($contents), $xml_values);
- xml_parser_free($parser);
- if(!$ xml_values) return;//うーん...
- //初期化 bbs.it-home.org
- $xml_array = array();
- $parents = array();
- $opened_tags = array();
- $arr = array ();
- $current = &$xml_array; //参照
- //タグを調べます
- $repeat_tag_index = array();//同じ名前の複数のタグは配列に変換されます
- foreach($xml_values as $data) {
- unset($attributes,$value) );//既存の値を削除しないと問題が発生します
- //このコマンドはこれらの変数を foreach スコープに抽出します
- //tag(string)、type(string)、level(int)、attributes(array)。
- extract($data);//配列を単独で使用することもできますが、このほうが優れています。
- $result = array();
- $attributes_data = array();
if(isset( $value)) {
- if($priority == 'tag') $result = $value;
- else $result['value'] = $value; //「属性」モードの場合は、値を連想配列に入れます
- }
- //属性も設定します
- if(isset($attributes) and $get_attributes) {
- foreach($attributes as $attr = > $val) {
- if($priority == 'tag') $attributes_data[$attr] = $val;
- else $result['attr'][$attr] = $val; //すべての属性を 'attr' という配列に設定します
- }
- }
- //タグのステータスを確認し、必要な処理を実行します。
- if($type == "open") {//タグの開始 '< tag>'
- $parent[$level-1] = &$current;
- if(!is_array($current) or (!in_array($tag, array_keys($current)))) { //新しいタグを挿入
- $ current[$tag] = $result;
- if($attributes_data) $current[$tag. '_attr'] = $attributes_data;
- $repeat_tag_index[$tag.'_'.$level] = 1;
- $current = &$current[$tag];
- } else { //同じ要素を持つ別の要素がありましたタグ名
- if(isset($current[$tag][0])) {//0番目の要素がある場合、それはすでに配列です
- $current[$tag][$repeat_tag_index[$tag.'_'。 $level]] = $result;
- $repeat_tag_index[$tag.'_'.$level]++;
- } else {//このセクションでは、同じ名前の複数のタグが一緒に出現する場合、値を配列にします
- $ current[$tag] = array($current[$tag],$result);//これにより、既存の項目と新しい項目が結合されて配列が作成されます
- $repeat_tag_index[$tag.'_'.$level] = 2;
if(isset($current[$tag.'_attr'])) { //最後(0番目)のタグの属性も移動する必要があります
- $current[ $tag]['0_attr'] = $current[$tag.'_attr'];
- unset($current[$tag.'_attr']);
- }
- }
- $last_item_index = $repeat_tag_index[$tag.' _'.$level]-1;
- $current = &$current[$tag][$last_item_index];
- }
- } elseif($type == "complete") { //1 行で終わるタグ '< ;tag />'
- //キーが既に取得されているかどうかを確認します。
- if(!isset($current[$tag])) { //新しいキー
- $current[$tag] = $result;
- $repeat_tag_index [$tag.'_'.$level] = 1;
- if($priority == 'tag' および $attributes_data) $current[$tag. '_attr'] = $attributes_data;
- } else { //取得した場合は、すべてを list(array) の中に入れます
- if(isset($current[$tag][0]) and is_array($current[$tag] )) {//それがすでに配列である場合...
- // ...新しい要素をその配列にプッシュします。
- $current[$tag][$repeat_tag_index[$tag.'_'.$level]] = $result;
if($priority == 'tag' および $get_attributes および $attributes_data) {
- $current[$tag][$repeat_tag_index[$tag.'_'.$レベル] 。 '_attr'] = $attributes_data;
- }
- $repeat_tag_index[$tag.'_'.$level]++;
- }else { //配列でない場合...
- $current[$tag] = array($current[$tag],$result); //...既存の値と新しい値を使って配列にします
- $repeat_tag_index[$tag.'_'.$level] = 1;
- if($priority == 'tag' and $get_attributes) {
- if(isset($current[$tag.'_attr'])) { //最後(0番目)のタグの属性も移動する必要があります
$current[$tag][ '0_attr'] = $current[$tag.'_attr'];
- unset($current[$tag.'_attr']);
- }
if($attributes_data) {
- $current[$tag][$repeat_tag_index[$tag.'_'.$level] 。 '_attr'] = $attributes_data;
- }
- }
- $repeat_tag_index[$tag.'_'.$level]++; //0 と 1 のインデックスは既に取得されています
- }
- }
- } elseif($type == 'close') { //タグ '' の終わり
- $current = &$parent[$level-1 ];
- }
- }
return($xml_array);
- }
- ?>
-
复制牌
调の例:
-
- //php之XML转数组関数调用
- $arr = xml2array(file_get_contents("tools.xml"),1,'attribute');
- ?>
复制代コード
|
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31