GD PHP dinamik pasta grafik nesil sorunu

2 Cevap php

Ben görüntü dolu yay işlevini kullanarak GD uzantısı ile dinamik bir pasta grafiği oluşturduk. Ben 11 değerlerine kadar, HTTP GET değişkenleri vasıtasıyla, bu komut geçmek. ilk değer, n, takip değerleri sayısıdır. n1, n2, n3, vb veri kendisidir. Bu tamsayı yüzdesidir. Amaç grafik şeklinde bir pasta grafiğinde yüzdelerini gösteren bir grafik yapmaktır.

: Ben bu çalıştırdığınızda

piechart.php? n = 2 ve n 1 = 20 & n2 = 80

Ben sadece siyah bir kutu olsun. Herhangi bir fikir? Herhangi bir soru sormak lütfen - teşekkürler!

<?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);
?>

2 Cevap

Yanlış giderse budur:

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

PHP Eğer $ var == NULL ile NULL değerleri karşılaştırmak olamaz, sen is_null işlevi kullanmak zorunda:

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

Ne yapar $ darkColorR [$ i] değerini almak ve null olup olmadığını kontrol etmektir. Ben sizin durumunuzda dizi tamamen farklı bir şey olduğunu, belirli bir dizin için bir giriş olup olmadığını kontrol etmek için çalışıyoruz düşünüyorum. Bir dizi verilen bir dizin ile bir giriş olup olmadığını kontrol etmek isset işlevini kullanabilirsiniz:

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

Birlikte bu koyarak aşağıdaki kodu verir:

<?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);
?>

sorunu ile yapmak ancak Google Chart API içine görünebilir bir şey, onunla grafik oluşturmak için daha kolay olurdu.