2010-10-14 7 views
3

J'essaye de faire une boucle dans une réponse de tableau cURL pour générer des fichiers XML. Cependant, mes fichiers générés semblent tous avoir exactement le même contenu - je ne sais pas si c'est la bonne approche ou si je devrais utiliser un tableau, mais je n'arrive pas à comprendre et pourrais utiliser de nouveaux yeux . Fondamentalement, je veux que chaque contenu de $playlist soit dans son propre fichier séparé.Boucler dans le tableau PHP

for ($i=0; $i<=14; $i++) { 
    $xml_data = generateXML($i); 
    $fileName = "bc_manifest_$i.xml"; 
    $fileHandle = fopen($fileName, 'wb') or die("can't open file"); 
    fwrite ($fileHandle, $xml_data); 
    fclose($fileHandle); 
    //echo $xml_data; 
    echo "Successfully created manifest $i<br />"; 
    } 

// The holy grail 
function generateXML($i) { 
    $xml_code = array($i); 
    // Start the beginning of the xml doc and save it to our reoccuring xml_code var 
    $xml_code[$i] .= '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; 
    $xml_code[$i] .= '<publisher-upload-manifest publisher-id="xxxxxxx" preparer="Dave" report-success="TRUE">' . "\n"; 

    // Set options to send to brightcove 
    // @page_size 
    $options = array(
       'page_size' => '75', 
       'playlist_ids' => "3690598001,3684920001,8193433701", 
       'video_fields'  => 'referenceId,creationDate'  
    ); 

    // URL Encode the options to prepare for cURL send 
    $post_str = ''; 
    foreach($options as $key=>$value) { 
     $post_str .= $key.'='.urlencode($value).'&'; 
    } 
    $post_str = substr($post_str, 0, -1); 

    // Initiate cURL and send request 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, 'http://api.brightcove.com/services/library?command=find_playlists_by_ids&token=xxxxxxxxxx&'); 
    curl_setopt($ch, CURLOPT_POST, TRUE); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_str); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    $obj = curl_exec($ch); 
    curl_close($ch); 

    // Decode json response 
    $result = json_decode($obj); 

    // Get playlists from the items object 
    $playlists = $result->{'items'}; 

    //var_dump($playlists); 

    // For each playlist... 
    foreach ($playlists as $playlist){ 
     foreach ($playlist->{'videos'} as $video){ 
      // Convert the creation date to something not so robotic.. 
      $creation_date_ms = $video->creationDate; 
      $creation_date_s = $creation_date_ms/1000; 
      $date = date('Ymd',$creation_date_s); 
      $time = strtotime($date); 
      //echo $time."<br />"; 

      // and set the reference id for each video. 
      $ref_id = $video->referenceId; 

      // Phew! Now, let's first check that there is a reference id for the video. If not, no biggie. 
      switch ($ref_id) { 
       case "": 
        break; 
       default: 
        // If so, run the function to create an xml object for that video! 
        if ($time <= strtotime('20100519')) { 
         $xml_code[$i] .= reencode_from_existing_source($ref_id); 
        } 
        break; 
      }   
     } 
    } 
    // Finish him. 
    $xml_code[$i] .= '</publisher-upload-manifest>'; 
    return($xml_code[$i]); 
} //endxml 


// Creates an xml object for the passed reference id. 
function reencode_from_existing_source($ref_id){ 
    $xml_obj = '<reencode-from-existing-source 
    title-refid="' . $ref_id . '" 
    encode-to="MP4" 
    encode-multiple="TRUE" 
    overwrite-images="FALSE" />' . "\n"; 
    return ($xml_obj); 
} 

Merci à tous ceux qui peuvent aider!

+1

Vous faites toujours la même requête avec cURL. – Narf

+1

Les questions sont plus utiles à la communauté si le code source est réduit au minimum présentant toujours le problème. – nalply

Répondre

0

Cela a fonctionné pour moi dans le passé: http://snipplr.com/view/3491/convert-php-array-to-xml-or-simple-xml-object-if-you-wish/

Il est assez bien documenté à cette url, mais laissez-moi savoir si vous avez des questions.

$xml = ArrayToXML::toXML($data_array, 'name_of_root_node'); 

Cela devrait vous aider à démarrer. Pour le second paramètre, modifiez-le pour que le nom du nœud racine fonctionne pour vous.

EDIT: extrait ajouté de la classe ArrayToXML à partir du lien ci-dessus afin d'atténuer les effets de la pourriture des liens.

class ArrayToXML 
{ 
    /** 
    * The main function for converting to an XML document. 
    * Pass in a multi dimensional array and this recrusively loops through and builds up an XML document. 
    * 
    * @param array $data 
    * @param string $rootNodeName - what you want the root node to be - defaultsto data. 
    * @param SimpleXMLElement $xml - should only be used recursively 
    * @return string XML 
    */ 
    public static function toXml($data, $rootNodeName = 'data', $xml=null) 
    { 
     // turn off compatibility mode as simple xml throws a wobbly if you don't. 
     if (ini_get('zend.ze1_compatibility_mode') == 1) 
     { 
      ini_set ('zend.ze1_compatibility_mode', 0); 
     } 

     if ($xml == null) 
     { 
      $xml = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$rootNodeName />"); 
     } 

     // loop through the data passed in. 
     foreach($data as $key => $value) 
     { 
      // no numeric keys in our xml please! 
      if (is_numeric($key)) 
      { 
       // make string key... 
       $key = "unknownNode_". (string) $key; 
      } 

      // replace anything not alpha numeric 
      $key = preg_replace('/[^a-z]/i', '', $key); 

      // if there is another array found recrusively call this function 
      if (is_array($value)) 
      { 
       $node = $xml->addChild($key); 
       // recrusive call. 
       ArrayToXML::toXml($value, $rootNodeName, $node); 
      } 
      else 
      { 
       // add single node. 
           $value = htmlentities($value); 
       $xml->addChild($key,$value); 
      } 

     } 
     // pass back as string. or simple xml object if you want! 
     return $xml->asXML(); 
    } 
} 
+0

Ne pas lier au code source que vous avez trouvé ailleurs. – nalply

+0

docs ici (stackoverflow) suggèrent que simplement un lien est mauvais sans contexte. Bien que je concède que ma réponse n'est peut-être pas la meilleure, je n'ai pas l'impression qu'elle enfreigne des règles ou des conventions (rien ne dit que vous ne pouvez pas vous lier à des ressources externes - et cela arrive fréquemment). Vous voulez clarifier? – gregghz

+0

Le problème est lié à la rotation. Vous ne savez jamais si le lien fonctionne encore dans un an ou deux. – nalply

1

Je voudrais utiliser la fonctionnalité SimpleXML ou DOM intégrée à PHP, pour générer le XML - il est très robuste et vous aurez seulement besoin de passer dans les noms des attributs, des valeurs et des noeuds.

En ce qui concerne la raison pour laquelle vous obtenez le même résultat à chaque fois, vous effectuez la même demande CURL à chaque fois, vous obtiendrez le même résultat.