Проблема создания динамической круговой диаграммы GD PHP

Я создал динамическую круговую диаграмму с расширением GD, используя функцию дуги, заполненной изображением. Я передаю этому сценарию через переменные HTTP GET до 11 значений. первое значение, n, представляет собой количество следующих за ним значений. n1,n2,n3 и т. д. — сами данные. Это целые проценты. Цель состоит в том, чтобы сделать диаграмму, которая будет отображать проценты на круговой диаграмме в графической форме.

Когда я запускаю это как:

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

У меня только черный ящик. Любые идеи? Любые вопросы, пожалуйста, задавайте - спасибо!

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

person trip0d199    schedule 18.11.2009    source источник


Ответы (2)


Вот где это идет не так:

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

В PHP вы не можете сравнивать значения с NULL с помощью $var == NULL, вы должны использовать функцию is_null:

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

Что это делает, так это получает значение $darkColorR[$i] и проверяет, является ли оно NULL. Я думаю, что в вашем случае вы пытаетесь проверить, есть ли в массиве запись для этого конкретного индекса, а это совсем другое. Вы можете использовать функцию isset, чтобы проверить, есть ли в массиве запись с заданным индексом:

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

Собрав это вместе, мы получим следующий код:

<?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);
?>
person John    schedule 18.11.2009

ничего общего с вашей проблемой, но вы можете изучить API Google Chart, это будет легче создать диаграмму с ним.

person RageZ    schedule 18.11.2009
comment
Помните, однако, что API Google Charts довольно ограничен (по функциональности и параметрам настройки). Если вам просто нужно создать простую, прилично выглядящую круговую диаграмму, это хороший вариант. - person phidah; 18.11.2009