-
-
// 空の要素と属性を無視して、ルート キーを含む XML を配列に変換しますが、依然として重大なエラーが発生します - function xml_to_array( $xml )
- {
- $reg = "/ <(\w+)[^>]*?>([\x00-\xFF]*?)<\/\1>/";
- if(preg_match_all($reg, $xml, $一致) )
- {
- $count = count($matches[0]);
- $arr = array();
- for($i = 0; $i {
- $key = $matches [1][$i];
- $val = xml_to_array( $matches[2][$i] ); // 再帰
- if(array_key_exists($key, $arr))
- {
- if(is_array($) arr[ $key ]))
- {
- if(!array_key_exists(0,$arr[$key]))
- {
- $arr[$key] = array($arr[$key]);
- }
- }else {
- $arr[$key] = array($arr[$key]);
- }
- $arr[$key][] = $val;
- }else{
- $arr[$key] = $val;
- }
- }
- return $arr;
- }else{
- return $xml;
- }
- }
// ルートキーを除くXmlを配列に変換
- function xmltoarray( $xml )
- {
- $ arr = xml_to_array($xml);
- $key = array_keys($arr);
- return $arr[$key[0]];
- }
// XPATH のような配列セレクター
- function xml_array_select( $arr, $arrpath )
- {
- $arrpath = トリム( $arrpath, '/' );
- if(!$arrpath) return $arr;
- $self = 'xml_array_select';
-
- $pos = strpos( $arrpath, '/' );
- $pos = $pos ? $pos : strlen($arrpath);
- $curpath = substr($arrpath, 0, $pos);
- $next = substr($arrpath, $pos);
-
- if(preg_match("/\[(\d+)\]$/",$curpath,$predicate))
- {
- $curpath = substr($curpath, 0, strpos($curpath," [{$predicate[1]}]"));
- $result = $arr[$curpath][$predicate[1]];
- }else $result = $arr[$curpath];
-
- if( is_array( $arr) && !array_key_exists($curpath, $arr) )
- {
- die( 'キーが存在しません:' . $curpath );
- }
-
- return $self($result, $next);
- }< /p>
// 入力配列がすべて数値キーの場合、要素値は $callback に順番に転送されます。それ以外の場合は、自身を $callback
- function xml_array_each( $arr, $callback )
- {
- if (func_num_args() if(!is_array($arr)) die('パラメータ 1 は配列でなければなりません!');
- if(! is_callable($callback)) die ('パラメータ 2 は関数でなければなりません!');
- $keys = array_keys($arr);
- $isok = true;
- foreach( $keys as $key ) {if(!is_int( $key)) {$isok = false; Break;}}
- if($isok)
- foreach( $arr as $val ) $result[] = $callback($val);
- else
- $result[] = $ callback( $arr );
- return $result;
- }
- ?>
-
コードをコピー
|