I have a function xml2array that parses my xml file to an Array. Now when I have an empty value in my xml file the function converts this to array( ) an empty array.
我有一个函数xml2array,它将我的xml文件解析为一个数组。现在,当我的xml文件中有一个空值时,该函数将其转换为array()一个空数组。
So < test >< /test > becomes [test]=>array()
, but I want that to be an empty string "".
所以
Does anybody know how to edit my function below:
有谁知道如何编辑我的功能如下:
<?php
function xml2array($contents, $get_attributes = 1, $priority = 'tag') {
$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, trim($contents), $xml_values);
xml_parser_free($parser);
if (!$xml_values)
return; //Hmm...
$xml_array = array ();
$parents = array ();
$opened_tags = array ();
$arr = array ();
$current = & $xml_array;
$repeated_tag_index = array ();
foreach ($xml_values as $data)
{
unset ($attributes, $value);
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($attr == 'xsi:type') continue;
if($attr == 'xsi:nil') continue;
if ($priority == 'tag')
$attributes_data[$attr] = $val;
else
$result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
}
}
if ($type == "open")
{
$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;
$repeated_tag_index[$tag . '_' . $level] = 1;
$current = & $current[$tag];
}
else
{
if (isset ($current[$tag][0]))
{
$current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
$repeated_tag_index[$tag . '_' . $level]++;
}
else
{
$current[$tag] = array (
$current[$tag],
$result
);
$repeated_tag_index[$tag . '_' . $level] = 2;
if (isset ($current[$tag . '_attr']))
{
$current[$tag]['0_attr'] = $current[$tag . '_attr'];
unset ($current[$tag . '_attr']);
}
}
$last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
$current = & $current[$tag][$last_item_index];
}
}
elseif ($type == "complete")
{
if (!isset ($current[$tag]))
{
$current[$tag] = $result;
$repeated_tag_index[$tag . '_' . $level] = 1;
if ($priority == 'tag' and $attributes_data)
$current[$tag . '_attr'] = $attributes_data;
}
else
{
if (isset ($current[$tag][0]) and is_array($current[$tag]))
{
$current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
if ($priority == 'tag' and $get_attributes and $attributes_data)
{
$current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
}
$repeated_tag_index[$tag . '_' . $level]++;
}
else
{
$current[$tag] = array (
$current[$tag],
$result
);
$repeated_tag_index[$tag . '_' . $level] = 1;
if ($priority == 'tag' and $get_attributes)
{
if (isset ($current[$tag . '_attr']))
{
$current[$tag]['0_attr'] = $current[$tag . '_attr'];
unset ($current[$tag . '_attr']);
}
if ($attributes_data)
{
$current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
}
}
$repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
}
}
}
elseif ($type == 'close')
{
$current = & $parent[$level -1];
}
}
return ($xml_array);
}
?>
?>
4 个解决方案
#1
1
Just check your source array using empty
: http://php.net/empty and return ""
is empty()
returned true. Add this at the begining of your function:
只需使用空检查源数组:http://php.net/empty并返回“”为空()返回true。在函数开头添加:
if( empty($myArray) ) {
return '';
}
#2
0
use empty function to check if array is empty or not
使用空函数检查数组是否为空
return empty($xml_array)?"":$xml_array;
return empty($ xml_array)?“”:$ xml_array;
$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, trim($contents), $xml_values); xml_parser_free($parser); if (!$xml_values) return; //Hmm... $xml_array = array (); $parents = array (); $opened_tags = array (); $arr = array (); $current = & $xml_array; $repeated_tag_index = array (); foreach ($xml_values as $data) { unset ($attributes, $value); 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($attr == 'xsi:type') continue; if($attr == 'xsi:nil') continue; if ($priority == 'tag') $attributes_data[$attr] = $val; else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' } } if ($type == "open") { $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; $repeated_tag_index[$tag . '_' . $level] = 1; $current = & $current[$tag]; } else { if (isset ($current[$tag][0])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 2; if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } } $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1; $current = & $current[$tag][$last_item_index]; } } elseif ($type == "complete") { if (!isset ($current[$tag])) { $current[$tag] = $result; $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $attributes_data) $current[$tag . '_attr'] = $attributes_data; } else { if (isset ($current[$tag][0]) and is_array($current[$tag])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; if ($priority == 'tag' and $get_attributes and $attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $get_attributes) { if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } if ($attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } } $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken } } } elseif ($type == 'close') { $current = & $parent[$level -1]; } } return ($xml_array);
} ?>
}?>
#3
0
The empty array you see is the default value you set:
您看到的空数组是您设置的默认值:
$result = array ();
You have the following alternatives:
您有以下替代方案:
- Keep it as is - empty elements will have an empty array as value.
- 保持原样 - 空元素将有一个空数组作为值。
- Set to
""
(empty string) - empty elements will have an empty string as value. - 设置为“”(空字符串) - 空元素将具有空字符串作为值。
- Set to
NULL
- empty elements will be dropped if they have siblings with the same element name. Single empty elements will be preserved. - 设置为NULL - 如果空元素具有相同元素名称的兄弟元素,则将删除这些元素。将保留单个空元素。
Depending on your need just take the default of your choice.
根据您的需要,您可以选择默认设置。
#4
0
I first thought array_walk_recursive would be a great option, but it ignores empty arrays in the function call.
我首先认为array_walk_recursive是一个很好的选择,但它忽略了函数调用中的空数组。
I would create a function, something like this. It goes through an array recursively and replaces array with string. (something like this)
我会创建一个函数,就像这样。它以递归方式遍历数组并用字符串替换数组。 (像这样)
function replaceArrayToString($arr = array()) {
$newArr = array();
foreach($arr as $key=>$value)
{
if (is_array($value))
{
unset($arr[$key]);
//Is it an empty array, make it a string
if (empty($value)) {
$newArr[$key] = '';
}
else {
$newArr[$key] = replaceArrayToString($value);
}
}
else {
$newArr[$key] = $value;
}
}
return $newArr;
}
and then call it from the end of your existing function xml2array() before returning the array.
然后在返回数组之前从现有函数xml2array()的末尾调用它。
elseif ($type == 'close')
{
$current = & $parent[$level -1];
}
}
$xml_array = replaceArrayToString($xml_array);
return ($xml_array);
}
#1
1
Just check your source array using empty
: http://php.net/empty and return ""
is empty()
returned true. Add this at the begining of your function:
只需使用空检查源数组:http://php.net/empty并返回“”为空()返回true。在函数开头添加:
if( empty($myArray) ) {
return '';
}
#2
0
use empty function to check if array is empty or not
使用空函数检查数组是否为空
return empty($xml_array)?"":$xml_array;
return empty($ xml_array)?“”:$ xml_array;
$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, trim($contents), $xml_values); xml_parser_free($parser); if (!$xml_values) return; //Hmm... $xml_array = array (); $parents = array (); $opened_tags = array (); $arr = array (); $current = & $xml_array; $repeated_tag_index = array (); foreach ($xml_values as $data) { unset ($attributes, $value); 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($attr == 'xsi:type') continue; if($attr == 'xsi:nil') continue; if ($priority == 'tag') $attributes_data[$attr] = $val; else $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr' } } if ($type == "open") { $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; $repeated_tag_index[$tag . '_' . $level] = 1; $current = & $current[$tag]; } else { if (isset ($current[$tag][0])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 2; if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } } $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1; $current = & $current[$tag][$last_item_index]; } } elseif ($type == "complete") { if (!isset ($current[$tag])) { $current[$tag] = $result; $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $attributes_data) $current[$tag . '_attr'] = $attributes_data; } else { if (isset ($current[$tag][0]) and is_array($current[$tag])) { $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result; if ($priority == 'tag' and $get_attributes and $attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } $repeated_tag_index[$tag . '_' . $level]++; } else { $current[$tag] = array ( $current[$tag], $result ); $repeated_tag_index[$tag . '_' . $level] = 1; if ($priority == 'tag' and $get_attributes) { if (isset ($current[$tag . '_attr'])) { $current[$tag]['0_attr'] = $current[$tag . '_attr']; unset ($current[$tag . '_attr']); } if ($attributes_data) { $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data; } } $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken } } } elseif ($type == 'close') { $current = & $parent[$level -1]; } } return ($xml_array);
} ?>
}?>
#3
0
The empty array you see is the default value you set:
您看到的空数组是您设置的默认值:
$result = array ();
You have the following alternatives:
您有以下替代方案:
- Keep it as is - empty elements will have an empty array as value.
- 保持原样 - 空元素将有一个空数组作为值。
- Set to
""
(empty string) - empty elements will have an empty string as value. - 设置为“”(空字符串) - 空元素将具有空字符串作为值。
- Set to
NULL
- empty elements will be dropped if they have siblings with the same element name. Single empty elements will be preserved. - 设置为NULL - 如果空元素具有相同元素名称的兄弟元素,则将删除这些元素。将保留单个空元素。
Depending on your need just take the default of your choice.
根据您的需要,您可以选择默认设置。
#4
0
I first thought array_walk_recursive would be a great option, but it ignores empty arrays in the function call.
我首先认为array_walk_recursive是一个很好的选择,但它忽略了函数调用中的空数组。
I would create a function, something like this. It goes through an array recursively and replaces array with string. (something like this)
我会创建一个函数,就像这样。它以递归方式遍历数组并用字符串替换数组。 (像这样)
function replaceArrayToString($arr = array()) {
$newArr = array();
foreach($arr as $key=>$value)
{
if (is_array($value))
{
unset($arr[$key]);
//Is it an empty array, make it a string
if (empty($value)) {
$newArr[$key] = '';
}
else {
$newArr[$key] = replaceArrayToString($value);
}
}
else {
$newArr[$key] = $value;
}
}
return $newArr;
}
and then call it from the end of your existing function xml2array() before returning the array.
然后在返回数组之前从现有函数xml2array()的末尾调用它。
elseif ($type == 'close')
{
$current = & $parent[$level -1];
}
}
$xml_array = replaceArrayToString($xml_array);
return ($xml_array);
}