webservice // API

Petit nouveau ! | 3 Messages

16 mars 2017, 17:56

Bonjour,

je voudrais consommer un web service via php.
J'ai récupéré une api, l'ai décodé,
je voudrais ensuite parser le json en csv et au préalable je ne sais pas comment utiliser foreach avec un tableau multidimensionnel. Merci pour votre aide.
<?php

$biblio = file_get_contents('https://data.opendatasoft.com/api/records/1.0/search/?dataset=adresses-des-bibliotheques-publiques-2015%40culture&facet=nom_dept&facet=nom_reg');

//Récupère une chaîne encodée JSON et la convertit en une variable PHP ; je ne mets pas true => affichage objet
$json_data = json_decode($biblio);

// visualisation du json en tableau
echo "<pre>";
// print_r($json_data);
echo "</pre>";

// affichage objets
var_dump($json_data->records[0]->fields);


// $array = $json_data->records->fields->ville;
// $array = $json_data->records->fields->insee;
// $array = $json_data->records->fields->nom_dept;
// $array = $json_data->records->fields->nom_reg;
// $array = $json_data->records->fields->voie;
// $array = $json_data->records->fields->cpbiblio;
// $array = $json_data->records->fields->coordonnees_insee;
// $array = $json_data->records->fields->voie_nom;
// $array = $json_data->records->fields->dept;
// $array = $json_data->records->fields->voie_type;
// $array = $json_data->records->fields->population_legale;
// $array = $json_data->records->fields->libelle1;
// $array = $json_data->records->fields->region;

$tab[] = $array;


$chemin = "biblio.csv";
$delimiter = ';';

$fp = fopen($chemin, 'w+');

	foreach ($tab as $fields) {
	    fputcsv($fp, $fields , $delimiter);
	}

fclose($fp);

?>
Dernière édition par moogli le 17 mars 2017, 10:12, édité 1 fois.
Raison : BBcode

Mammouth du PHP | 1238 Messages

16 mars 2017, 19:13

j'ai pas compris ton code. pourrais tu le mettre entre balise bbcode [ php][/php]

pour un parcours de tableau à 2 niveaux (adaptable à plus de niveaux aussi)
foreach($tab as $key1 => $tab1) {
foreach($tab1 as $key2 => $val){
//ton traitement
}
}
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

17 mars 2017, 10:58

salut

tu n'as pas besoin de double foreach. ce serait même une erreur parce que ton CSV serait foireux vu que les champs ne sont pas toujours présent (et du coup va savoir à qu'elle colonne le truc se rapporte ;)

utilise un foreach sur les records et un "mapping" pour passer de l'objet à un tableau

exemple
<?php

$biblio = file_get_contents('https://data.opendatasoft.com/api/records/1.0/search/?dataset=adresses-des-bibliotheques-publiques-2015%40culture&facet=nom_dept&facet=nom_reg&rows=1000');

//Récupère une chaîne encodée JSON et la convertit en une variable PHP ; je ne mets pas true => affichage objet
$json_data = json_decode($biblio);

$delimiter = ';';
$file = new SplFileObject('biblio.csv','w');
// entête
$file->fputcsv(['insee','ville','population legale','dept','nom département','reg','nom région','cpbiblio','voie','nom de la voie','type de la voie','libellé'], $delimiter);
foreach ($json_data->records as $record) {
  $fields = $record->fields;
  $data = [
    $fields->insee,
    $fields->ville,
    $fields->population_legale,
    $fields->dept,
    $fields->nom_dept,
    $fields->region,
    $fields->nom_reg,
    !empty($fields->cpbiblio)?$fields->cpbiblio:'',
    !empty($fields->voie)?$fields->voie:'',
    !empty($fields->voie_nom)?$fields->voie_nom:'',
    !empty($fields->voie_type)?$fields->voie_type:'',
    !empty($fields->libelle1)?$fields->libelle1:''
  ];
  $file->fputcsv($data, $delimiter);
}
les champs avec "empty" ne sont pas toujours dans le json.

si tu veux un CSV tu peut tester la V2 (même si c'est en beta) elle permet de retourner directement un csv

doc : https://data.opendatasoft.com/api/v2/co ... xports_csv

par exemple : https://data.opendatasoft.com/api/v2/op ... imiter=%3B

te file un fichier CSV avec tous le jeux de données.

tu peux utiliser le paramètre "q" pour restreindre le jeux (genre une ville ou un département) attention l'api est case sensitive et tu ne trouveras pas paris mais Paris ...

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 3 Messages

17 mars 2017, 12:40

merci Moogli, super.

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

17 mars 2017, 15:29

de rien, si la solution te convient tu peux utiliser le bouton "résolu" à gauche du titre ;)


@+
Il en faut peu pour être heureux ......