-2
你好此功能被投擲「提供的foreach()無效參數」錯誤無效的參數提供給功能
function flatten($data) {
$result = array();
foreach ($data as $item) {
if (is_array ($item)) {
$result [] = array_filter ($item, 'notArray');
$result = array_merge ($result, flatten ($item));
}
}
return $result;
}
$response = $_REQUEST ['xmlmsg'];
$data = GetXMLTree ($response);
$result = flatten ($data);
function GetXMLTree($xmldata) {
// we want to know if an error occurs
ini_set ('track_errors', '1');
$xmlreaderror = false;
$parser = xml_parser_create ('ISO-8859-1');
xml_parser_set_option ($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parser_set_option ($parser, XML_OPTION_CASE_FOLDING, 0);
if (! xml_parse_into_struct ($parser, $xmldata, $vals, $datadex)) {
$xmlreaderror = true;
echo "errorrrrrrrrrs";
}
xml_parser_free ($parser);
if (! $xmlreaderror) {
$result = array();
$i = 0;
if (isset ($vals [$i] ['attributes']))
foreach (array_keys ($vals [$i] ['attributes']) as $attkey)
$attributes [$attkey] = $vals [$i] ['attributes'] [$attkey];
$result [$vals [$i] ['tag']] = array_merge ((array) $attributes, (array) GetChildren ($vals, $i, open));
}
ini_set ('track_errors', '0');
return $result;
}
function GetChildren($vals, &$i, $type) {
if ($type == 'complete') {
if (isset ($vals [$i] ['value']))
return ($vals [$i] ['value']);
else
return '';
}
$children = array(); // Contains node data
/* Loop through children */
while ($vals [++ $i] ['type'] != 'close') {
$type = $vals [$i] ['type'];
// first check if we already have one and need to create an array
if (isset ($children [$vals [$i] ['tag']])) {
if (is_array ($children [$vals [$i] ['tag']])) {
$temp = array_keys ($children [$vals [$i] ['tag']]);
// there is one of these things already and it is itself an array
if (is_string ($temp [0])) {
$a = $children [$vals [$i] ['tag']];
unset ($children [$vals [$i] ['tag']]);
$children [$vals [$i] ['tag']] [0] = $a;
}
} else {
$a = $children [$vals [$i] ['tag']];
unset ($children [$vals [$i] ['tag']]);
$children [$vals [$i] ['tag']] [0] = $a;
}
$children [$vals [$i] ['tag']] [] = GetChildren ($vals, $i, $type);
} else
$children [$vals [$i] ['tag']] = GetChildren ($vals, $i, $type);
// I don't think I need attributes but this is how I would do them:
if (isset ($vals [$i] ['attributes'])) {
$attributes = array();
foreach (array_keys ($vals [$i] ['attributes']) as $attkey)
$attributes [$attkey] = $vals [$i] ['attributes'] [$attkey];
// now check: do we already have an array or a value?
if (isset ($children [$vals [$i] ['tag']])) {
// case where there is an attribute but no value, a complete with an attribute in other words
if ($children [$vals [$i] ['tag']] == '') {
unset ($children [$vals [$i] ['tag']]);
$children [$vals [$i] ['tag']] = $attributes;
} // case where there is an array of identical items with attributes
elseif (is_array ($children [$vals [$i] ['tag']])) {
$index = count ($children [$vals [$i] ['tag']]) - 1;
// probably also have to check here whether the individual item is also an array or not or what... all a bit messy
if ($children [$vals [$i] ['tag']] [$index] == '') {
unset ($children [$vals [$i] ['tag']] [$index]);
$children [$vals [$i] ['tag']] [$index] = $attributes;
}
$children [$vals [$i] ['tag']] [$index] = array_merge ($children [$vals [$i] ['tag']] [$index], $attributes);
} else {
$value = $children [$vals [$i] ['tag']];
unset ($children [$vals [$i] ['tag']]);
$children [$vals [$i] ['tag']] ['value'] = $value;
$children [$vals [$i] ['tag']] = array_merge ($children [$vals [$i] ['tag']], $attributes);
}
} else
$children [$vals [$i] ['tag']] = $attributes;
}
}
return $children;
}
我還要補充的是這腳本在PHP5.3.0(WAMP)中完美工作,並在PHP 5.3.3(Linux/Apache)中拋出錯誤 –
這張海報做了什麼降級?我很好奇。 – octopusgrabbus
如果你在'flatten()'裏面回顯gettype($ data)',輸出是什麼? – 2011-12-14 03:42:10