2011-12-13 4 views
-2

bonjour cette fonction est de lancer "Invalid argument supplied for foreach()" erreurargument invalide fourni pour fonctionner

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

Je voudrais aussi ajouter que cette scripts fonctionne parfaitement dans PHP5.3.0 (WAMP) et renvoie une erreur dans PHP 5.3.3 (Linux/Apache) –

+0

Qu'est-ce que cette affiche a été déclassée? Je suis curieux. – octopusgrabbus

+0

Si vous 'echo gettype ($ data)' à l'intérieur de 'flatten()', quelle est la sortie? –

Répondre

1

$data est probablement pas un tableau ou un objet

+0

Plus que probablement. –

+0

Pls voir la source complète ci-dessus. Je souhaite également ajouter que ce script fonctionne parfaitement dans PHP5.3.0 (WAMP) et déclenche une erreur dans PHP 5.3.3 (Linux/Apache) –

Questions connexes