2009-11-18 9 views
1

J'ai créé un graphique à secteurs dynamique avec l'extension GD à l'aide de la fonction d'arc rempli d'images. Je passe à ce script, via des variables HTTP GET, jusqu'à 11 valeurs. la première valeur, n, est le nombre de valeurs qui suivent. n1, n2, n3, etc. sont les données elles-mêmes. Ce sont des nombres entiers. L'objectif est de faire un graphique qui montrera les pourcentages dans un graphique à secteurs sous forme graphique.Problème de génération de diagrammes à secteurs dynamiques GD PHP

Quand je lance cela comme:

piechart.php n = 2 & n1 = 20 = 80 & n2

Je reçois seulement une boîte noire?. Des idées? Toutes les questions s'il vous plaît demander - merci!

<?php 

// var load 

$size=500; 

//HTTP GET vars: 
//N is the number of sections we have 
//n1 is the percentage for part1 
//n2 is the percentage for part2, and so on 

$num=$_GET["n"]; 
//want to make a hard limit at 10 different sections 
$num=min($num,10); 
$percents; 
$angles; 
$angles[0]=0; 
$percents[0]=NULL; 
//load percents array. First value is NULL 
for ($c=1;$c<=$num;$c++) 
{ 
    $percents[$c]=(int)$_GET["n".$c]; 
    $angles[$c]=(int)round((($percents[$c-1]+$percents[$c])/100)*360); 
} 

$angles[$num]=360; 

//create image 
$half=round($size/2); 
$image = imagecreatetruecolor($size, $size); 

// colors 
$colorR=array(0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x74, 0x33, 0xFF, 0x33, 0x66); 
$colorG=array(0x00, 0x80, 0x00, 0xA5, 0xFF, 0xFF, 0x99, 0x00, 0x33, 0xFF); 
$colorB=array(0xFF, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0x66, 0x99, 0x33); 
// shaded colors 
$darkColorR=array(0x00, 0x00, 0x80, 0x80, 0x80, 0x3A, 0x1A, 0x80, 0x1A, 0x33); 
$darkColorG=array(0x00, 0x40, 0x00, 0x52, 0x80, 0x80, 0x4C, 0x00, 0x1A, 0x80); 
$darkColorB=array(0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x80, 0x33, 0x4C, 0x1A); 

$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); 
$black = imagecolorallocate($image, 0x00, 0x00, 0x00); 

// make the 3D effect 
$tempDarkColor; 
for ($i = $half+round(.1*$half); $i > $half; $i--) 
{ 
    for ($j=0;$j<(count($angles)-1)&&$angles[$j]<180;$j++) 
    { 
     if ($darkColorR[$j]==NULL||$darkColorG[$j]==NULL||$darkColorB[$j]==NULL) 
     { 
      //if one of the colors is missing, set the entire color to white 
      $darkColorR[$j]=0x00; 
      $darkColorG[$j]=0x00; 
      $darkColorB[$j]=0x00; 
     } 
     $tempDarkColor[$j]= imagecolorallocate($image, $darkColorR[$j],$darkColorG[$j],$darkColorB[$j]); 
     imagefilledarc($image, $half, $i, $size, $half, $angles[$j], $angles[$j+1] , $tempDarkColor[$j], IMG_ARC_PIE); 
    } 
} 
//make the image 
$imageColor; 
for ($k=0;$k<(count($angles)-1);$k++) 
{ 
    if ($darkColorR[$k]==NULL||$darkColorG[$k]==NULL||$darkColorB[$k]==NULL) 
    { 
     //if one of the colors is missing, set the entire color to white 
     $colorR[$k]=0x00; 
     $colorG[$k]=0x00; 
     $colorB[$k]=0x00; 
    } 
    $tempColor[$k]= imagecolorallocate($image, $darkColorR[$k],$darkColorG[$k],$darkColorB[$k]); 
    imagefilledarc($image, $half, $half, $size, $half, $angles[$k], $angles[$k+1] , $tempColor[$k], IMG_ARC_PIE); 
} 

// flush image 
header('Content-type: image/png'); 
imagepng($image); 
imagedestroy($image); 
?> 

Répondre

3

C'est là ça ne va pas:

if ($darkColorR[$j]==NULL||$darkColorG[$j]==NULL||$darkColorB[$j]==NULL) 

En PHP, vous ne pouvez pas comparer les valeurs à NULL avec var $ == NULL, vous devez utiliser la fonction is_null:

if (is_null($darkColorR[$j])||is_null($darkColorG[$j])||is_null($darkColorB[$j])) 

Ce que cela fait est d'obtenir la valeur de $ darkColorR [$ i] et de vérifier si elle est NULL. Je pense que dans votre cas, vous essayez de vérifier si le tableau a une entrée pour cet index spécifique, ce qui est complètement différent. Vous pouvez utiliser la fonction isset pour vérifier si un tableau a une entrée avec un index donné: cependant,

<?php 

// var load 

$size=500; 

//HTTP GET vars: 
//N is the number of sections we have 
//n1 is the percentage for part1 
//n2 is the percentage for part2, and so on 

$num=$_GET["n"]; 
//want to make a hard limit at 10 different sections 
$num=min($num,10); 
$percents; 
$angles; 
$angles[0]=0; 
$percents[0]=NULL; 
//load percents array. First value is NULL 
for ($c=1;$c<=$num;$c++) 
{ 
    $percents[$c]=(int)$_GET["n".$c]; 
    $angles[$c]=(int)round((($percents[$c-1]+$percents[$c])/100)*360); 
} 

$angles[$num]=360; 

//create image 
$half=round($size/2); 
$image = imagecreatetruecolor($size, $size); 

// colors 
$colorR=array(0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x74, 0x33, 0xFF, 0x33, 0x66); 
$colorG=array(0x00, 0x80, 0x00, 0xA5, 0xFF, 0xFF, 0x99, 0x00, 0x33, 0xFF); 
$colorB=array(0xFF, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0x66, 0x99, 0x33); 
// shaded colors 
$darkColorR=array(0x00, 0x00, 0x80, 0x80, 0x80, 0x3A, 0x1A, 0x80, 0x1A, 0x33); 
$darkColorG=array(0x00, 0x40, 0x00, 0x52, 0x80, 0x80, 0x4C, 0x00, 0x1A, 0x80); 
$darkColorB=array(0x80, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x80, 0x33, 0x4C, 0x1A); 

$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); 
$black = imagecolorallocate($image, 0x00, 0x00, 0x00); 


// make the 3D effect 
$tempDarkColor; 
for ($i = $half+round(.1*$half); $i > $half; $i--) 
{ 
    for ($j=0;$j<(count($angles)-1)&&$angles[$j]<180;$j++) 
    { 
     if (!isset($darkColorR[$j])||!isset($darkColorG[$j])||!isset($darkColorB[$j])) 
     { 
       //if one of the colors is missing, set the entire color to white 
       $darkColorR[$j]=0x00; 
       $darkColorG[$j]=0x00; 
       $darkColorB[$j]=0x00; 
     } 
     $tempDarkColor[$j]= imagecolorallocate($image, $darkColorR[$j],$darkColorG[$j],$darkColorB[$j]); 
     imagefilledarc($image, $half, $i, $size, $half, $angles[$j], $angles[$j+1] , $tempDarkColor[$j], IMG_ARC_PIE); 
    } 
} 

//make the image 
for ($k=0;$k<(count($angles)-1);$k++) 
{ 
    if (!isset($colorR[$k])||!isset($colorG[$k])||!isset($colorB[$k])) 
    { 
     //if one of the colors is missing, set the entire color to white 
     $colorR[$k]=0x00; 
     $colorG[$k]=0x00; 
     $colorB[$k]=0x00; 
    } 
    $tempColor[$k]= imagecolorallocate($image, $colorR[$k],$colorG[$k],$colorB[$k]); 
    imagefilledarc($image, $half, $half, $size, $half, $angles[$k], $angles[$k+1] , $tempColor[$k], IMG_ARC_PIE); 
} 
// flush image 
header('Content-type: image/png'); 
imagepng($image); 
imagedestroy($image); 
?> 
0

rien à voir avec votre problème, mais vous pouvez regarder dans le Google Chart API, il serait plus facile de créer graphique avec elle.

+0

Rappelez-vous que l'API graphiques Google est:

if (!isset($darkColorR[$j])||!isset($darkColorG[$j])||!isset($darkColorB[$j])) 

Mettre cela donne ensemble le code suivant assez limité (dans les fonctionnalités et les options de personnalisation). Si vous avez juste besoin de produire un diagramme simple et décent, c'est une bonne option. – phidah