2011-12-13 76 views
-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; 
} 
+0

我還要補充的是這腳本在PHP5.3.0(WAMP)中完美工作,並在PHP 5.3.3(Linux/Apache)中拋出錯誤 –

+0

這張海報做了什麼降級?我很好奇。 – octopusgrabbus

+0

如果你在'flatten()'裏面回顯gettype($ data)',輸出是什麼? – 2011-12-14 03:42:10

回答

1

$data可能不是一個數組或對象

+0

可能性更大。 –

+0

請參閱上面的完整源代碼。我還想補充一點,這個腳本在PHP5.3.0(WAMP)中完美工作,並在PHP 5.3.3(Linux/Apache)中拋出錯誤 –