这是从php中的类数组访问元素的正确方法吗?

时间:2013-06-13 18:30:08

标签: php arrays file class eof

所以,这里只是一些背景。我在C ++上接受过学术训练,但我只是想自己学习php。因此,我认为我有几种编码倾向,从C ++开始是我的后备语言,可能不适合PHP。

所以,这就是我要做的。我正在制作轮廓测绘应用程序。等高线图最终将被绘制到html5画布操作中,但首先,我正在使用php进行所有数学运算。

所以,我要映射我的数据数组,以及用于保存最终将被绘制到html画布的颜色值的二维数组。但是,为了获得它们的值,每个像素需要具有三个数组属性,这些属性可以保存关于等高线图上最近的数据点的信息。所以,我创建了一个名为pixel的类。但是,当我必须创建这些类的2d数组并修改每个类的“value”属性时,它有点复杂。我知道如何在C ++中执行此操作,但我不确定我是否在PHP中正确执行此操作。结果,我收到一个关于意外结束文件的错误,我认为这可能归因于我错误地处理了类。我特别不确定$ pixelmap [$ x] [$ y] - > value是否是访问该类属性的正确方法。我在网上看了一下,但我看到的大部分教程都非常基础,并没有涵盖2维类数组的语法等。

这是我的代码:

<?php

    //pixel class

    class pixel {
        public $level1;
        public $level2;
        public $level3;
        public $value;

        function __construct() {
            $this->level1 = array();
            $this->level2 = array();
            $this->level3 = array();
            $this->value = null;
       }
    }

    //get data from file. Later, get data from mySQL

    $data = array();
    $data[0] = array();
    $data[1] = array();
    $data[2] = array();

    $filein = fopen('data.txt',"r");
    $i=0;

    //pixels per longitude & latitude   
    $ppl = 12;

    if($filein) {
        while(!feof($filein)) {
            $buffer = fgets($filein);
            $each = explode("/",$buffer);
            $data[0][$i]=$each[0]*$ppl;
            $data[1][$i]=$each[1]*$ppl;
            $data[2][$i]=$each[2];
            $i++; 
        }
    fclose($filein);

    //Map information

    //x width
    $dimx = 648;

    //y width
    $dimy = 264;

    //create pixel color map array
    $pixelmap = array($dimx);
    for($i=0;$i<$dimx;$i++)
    {
        $pixel[] = array($dimy);
        for($j=0;$j<$dimy;$j++)
        {
            $pixel[$i][] = new pixel;
        }
    }

    //for every data point, give a value to all surrounding pixels detailing the intensity and closeness of the point
    for($i=0;$i<sizeof($data[2]); $i++)
    {
        $locx = floor($data[$i][0]);
        $locy = floor($data[$i][1]);
        for($x=0;$x<$dimx; $x++)
        {
            //if distance isn't too large in x coordinate alone
            if(abs($locx-$x) < 75)
            {
                for($y=0; $y<$dimy; $y++)
                {
                    //if distance isn't too large in y coordinate alone
                    if(abs($locy - $y) < 75)
                    {
                        //get distance
                        $dist = sqrt(pow($locx-$x,2)+pow($locy-$y,2));

                        //if it's less than 15, add the data point to the pixel's level one closeness array
                        if($dist < 15)
                        {
                            $empty = empty($pixelmap[$x][$y]->level1);
                            if($empty)
                            {
                                $pixelmap[$x][$y]->$level1[0]=$data[$i];
                            } else 
                            {
                                $pixelmap[$x][$y]->$level1[] = $data[$i];
                            }
                        } else if($dist < 30)
                        {
                            $empty = empty($pixelmap[$x][$y]->level2);
                            if($empty)
                            {
                                $pixelmap[$x][$y]->$level2[0]=$data[$i];
                            } else 
                            {
                                $pixelmap[$x][$y]->level2[] = $data[$i];
                            }
                        } else if($dist < 75)
                        {
                            $empty = empty($pixelmap[$x][$y]->level3);
                            if($empty)
                            {
                                $pixelmap[$x][$y]->level3[0]=$data[$i];
                            } else 
                            {
                                $pixelmap[$x][$y]->level3[] = $data[$i];
                            }
                        }
                    }
                }
            }
        }
    }


    for($x=0;$x<$dimx;$x++)
    {
        for($y=0;$y<$dimy;$y)
        {
            //get information from the highest level with values in it, then average every value touching it.
            if(!empty($pixelmap[$x][$y]->level1))
            {
                $pixelmap[$x][$y]->value = (array_sum($pixelmap[$x][$y]->level1)/sizeof($pixelmap[$x][$y]->level1));
            }
            else if(!empty($pixelmap[$x][$y]->level2))
            {
                $pixelmap[$x][$y]->value = (array_sum($pixelmap[$x][$y]->level2)/sizeof($pixelmap[$x][$y]->level2));
            } else if(!empty($pixelmap[$x][$y]->level3))
            {
                $pixelmap[$x][$y]->value = (array_sum($pixelmap[$x][$y]->level3)/sizeof($pixelmap[$x][$y]->level3));
            } else {
                $pixelmap[$x][$y]->value = 60.00;
            }

            echo $pixelmap[$x][$y]->value . " ";
        }
        echo "<br>\n";
    }       
?>

0 个答案:

没有答案