[RESOLU] Reformater les données d'une requête en arrays avec label et valeur

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Reformater les données d'une requête en arrays avec label et valeur

Re: [RESOLU] Reformater les données d'une requête en arrays avec label et valeur

par Saian » 07 mars 2021, 13:44

Content que ça t'ait permis de gagner le temps dont tu avais besoin et si ça t'a permis de mieux appréhender la manipulation des tableaux c'est une très bonne chose aussi. ;)

Re: Reformater les données d'une requête en arrays avec label et valeur

par Marc_Q » 07 mars 2021, 04:11

J'ai envi de dire, c'est en forgeant qu'on devient forgeron. ^^
$chart = [
    'label' => [ 
        'JAN', 'FEV', 'MARS', 'AVRIL', 'MAI', 'JUIN', 'JUIL', 'AOUT', 'SEPT', 'OCT', 'NOV', 'DEC' 
    ],
    'data' => array_fill(0, 12, 0)
];
foreach ($statPrivInvProsp->toArray() as $data)
    $chart['data'][$data['month'] - 1] = $data['total'];
Je sais bien Saian, que c'est en forgeant que l'on devient forgeron, le problème était le temps, j'avais un deadline (avec comme toujours plein de petites choses chronophages à finaliser) que tu m'as aidé à tenir.

Merci pour ton temps et expertise, j'ai appris quelque chose et cela fonctionne parfaitement à présent.

Le code pour ceux que cela pourrait intéresser :

Code : Tout sélectionner

$statPrivInvProsp =DB::table('files') ->select(DB::raw('count(*) as total'),DB::raw('MONTH(created_at) as month')) ->whereIn('checked_role_id', [3]) ->whereIn('user_status_id', [3,4,5]) ->whereBetween('created_at', [ Carbon::now()->startOfYear(), Carbon::now()->endOfYear(),]) ->groupBy('month') ->get(); $dataPIPS = [ 'label' => [ 'JAN', 'FEB', 'MARCH', 'APRIL', 'MAI', 'JUNE', 'JULY', 'AUG', 'SEPT', 'OCT', 'NOV', 'DEC' ], 'data' => array_fill(0, 12, 0) ]; foreach ($statPrivInvProsp->toArray() as $data) $dataPIPS['data'][$data->month - 1] = $data->month; $dataPIPS['chart_data'] = json_encode($dataPIPS); # return response()->json($dataPIPS); $statPrivInvProspects = $dataPIPS; return view('pages.dashboard', compact('statPrivInvProspects'));

Re: Reformater les données d'une requête en arrays avec label et valeur

par Saian » 06 mars 2021, 18:57

J'ai envi de dire, c'est en forgeant qu'on devient forgeron. ^^
$chart = [
    'label' => [ 
        'JAN', 'FEV', 'MARS', 'AVRIL', 'MAI', 'JUIN', 'JUIL', 'AOUT', 'SEPT', 'OCT', 'NOV', 'DEC' 
    ],
    'data' => array_fill(0, 12, 0)
];
foreach ($statPrivInvProsp->toArray() as $data)
    $chart['data'][$data['month'] - 1] = $data['total'];

Re: Reformater les données d'une requête en arrays avec label et valeur

par Marc_Q » 06 mars 2021, 12:34

Salut, je ferais une simple boucle for $i = 0; $i < 12; $i++ :
$datastatPrivInvProsp = $statPrivInvProsp->toArray();
for ($i = 0; $i < 12; $i++)
  if (!isset($datastatPrivInvProsp[$i]))
    $datastatPrivInvProsp[$i] = [ 'total' => 0, 'month' => $i + 1 ];

PS : je vois que ça colle pas tout à fait. Du coup la vite fait, je construirais un nouveau tableau avec une première boucle sur le résultat en indexant ce tableau par rapport au mois et ensuite la boucle du dessus, genre :
$chartData = [];

foreach ($statPrivInvProsp->toArray() as $data)
  $chartData[$data['month'] - 1] = $data;

for ($i = 0; $i < 12; $i++)
  if (!isset($chartData[$i]))
    $chartData[$i] = [ 'total' => 0, 'month' => $i + 1 ];
Salut Saian,

Grand merci pour ton retour. Il me retourne bien les données dans le format initialement demandées.

Je me suis par contre trompe dans le format.

En l'occurrence, chartsjs doit recevoir des données pour les axes X et Y. Ce qui impacte le format. Désolé pour ce changement.

Les données devrait être restituées sous cette forme plus complexe :

Code : Tout sélectionner

array:12 [▼ "label" => array:12 [▼ 0 => 1 1 => 2 2 => 3 3 => 4 4 => 5 5 => 6 6 => 7 7 => 8 8 => 9 9 => 10 10 => 11 11 => 12 ] "data" => array:12 [▼ 0 => 2 1 => 0 3 => 1 3 => 0 4 => 0 5 => 0 6 => 0 7 => 0 8 => 0 9 => 0 10 => 0 11 => 0 ] "chart_data" => "{"label":[1,2,3,4,5,6,7,8,9,10,11,12],"data":[2,0,1,0,0,0,0,0,0,0]}" ]
Les mois manquants devraient également être retournés

et pour finir, ce qui serait plus lisible pour le user, les labels devraient être remplacés par :

[JAN, FEV, MARS, AVRIL, MAI, JUIN, JUIL, AOUT, SEPT, OCT, NOV, DEC] au lieu de [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] .

Ce serait chouette si tu avais le temps de me donner un coup de main, car si j'ai compris la logique de ta première proposition de code, là je vois encore moins comment faire.

Merci.

Re: Reformater les données d'une requête en arrays avec label et valeur

par Saian » 05 mars 2021, 15:56

Salut, je ferais une simple boucle for $i = 0; $i < 12; $i++ :
$datastatPrivInvProsp = $statPrivInvProsp->toArray();
for ($i = 0; $i < 12; $i++)
  if (!isset($datastatPrivInvProsp[$i]))
    $datastatPrivInvProsp[$i] = [ 'total' => 0, 'month' => $i + 1 ];

PS : je vois que ça colle pas tout à fait. Du coup la vite fait, je construirais un nouveau tableau avec une première boucle sur le résultat en indexant ce tableau par rapport au mois et ensuite la boucle du dessus, genre :
$chartData = [];

foreach ($statPrivInvProsp->toArray() as $data)
  $chartData[$data['month'] - 1] = $data;

for ($i = 0; $i < 12; $i++)
  if (!isset($chartData[$i]))
    $chartData[$i] = [ 'total' => 0, 'month' => $i + 1 ];

Reformater les données d'une requête en arrays avec label et valeur

par Marc_Q » 05 mars 2021, 10:52

Hello,

J'utilise chartjs pour mes graphiques.

Je dois fournir a un graphique de type "line" des donnees :

Le nombre de prospects ventile par mois sur l'annee en cours.

Je dois passer a chartjs 12 arrays comprenant le label (1 ou janvier par exemple) et sa valeur.

Requête:

Code : Tout sélectionner

// START : Chartjs # Statistic of prospect private investors $statPrivInvProsp =DB::table('files') ->select(DB::raw('count(*) as total'),DB::raw('MONTH(created_at) as month')) ->whereIn('checked_role_id', [3]) ->whereIn('user_status_id', [3,4,5]) ->whereBetween('created_at', [ Carbon::now()->startOfYear(), Carbon::now()->endOfYear(),]) ->groupBy('month') ->get();
Les donnees suivantes sont retournees :

Code : Tout sélectionner

Illuminate\Support\Collection {#1716 ▼ #items: array:2 [▼ 0 => {#1750 ▼ +"total": 2 +"month": 1 } 1 => {#1749 ▼ +"total": 1 +"month": 3 } ] }
On peut voir que les données sont bien retournées dans la collection et dans le format souhaité pour chartjs.

Mais sous cette forme, je n'affiche pas les mois ne comprenant pas de données et les mois a venir de l'année.

Étant donné que je souhaite pouvoir afficher tous les mois de l'année (même si aucune valeur n'est retournée car aucune donnée pour le mois en cours ou précédent de l'année existe et pour les mois à venir), j'ai ajouté le code suivant dans une tentative de "construire" les données manquantes :

Code : Tout sélectionner

$datastatPrivInvProsp = $statPrivInvProsp->toArray() + array_fill(1, 12, 0);
Qui me retourne les arrays suivantes :

Code : Tout sélectionner

array:13 [▼ 0 => {#1750 ▼ +"total": 2 +"month": 1 } 1 => {#1749 ▼ +"total": 1 +"month": 3 } 2 => 0 3 => 0 4 => 0 5 => 0 6 => 0 7 => 0 8 => 0 9 => 0 10 => 0 11 => 0 12 => 0 ]
On peut voir que 13 arrays sont retournées au lieu de 12 correspondants aux 12 mois de l'année (en cours).

Premier problème que je souhaiterais résoudre :

Il faudrait retourner que 12 arrays au maximum.

Second problème :

Je souhaiterais les arrays manquantes (car les données sont inexistantes dans la table pour 10 mois de l'année) sous la forme suivante :

Code : Tout sélectionner

2 => {#1749 ▼ +"total": 0 +"month": 2 } 3 => {#1749 ▼ +"total": 0 +"month": 4 } 4 => {#1749 ▼ +"total": 0 +"month": 5 } 5 => {#1749 ▼ +"total": 0 +"month": 6 } 6 => {#1749 ▼ +"total": 0 +"month": 7 } 7 => {#1749 ▼ +"total": 0 +"month": 8 } 8 => {#1749 ▼ +"total": 0 +"month": 9 } 9 => {#1749 ▼ +"total": 0 +"month": 10 } 10 => {#1749 ▼ +"total": 0 +"month": 11 } 11 => {#1749 ▼ +"total": 0 +"month": 12 }
Merci d'avance de vos suggestions.

Marc