Неопределенная ошибка смещения в массиве PHP 2d - PullRequest
0 голосов
/ 02 апреля 2012

РЕДАКТИРОВАТЬ: Код доступен для просмотра здесь: http://codepad.org/28XT71AB

Я искал, но, похоже, ничего не подходит, как моя проблема.

Прежде чем я начну: я поместил весь код, который может быть проблемой ниже. Это около 200 строк кода, и мне очень жаль! Но я в полном замешательстве.

У меня есть 2D-массив, $val, который заполняется функцией.

Затем массив передается другой функции, которая использует данные для заполнения таблицы.

Проблема возникла только после того, как я разделил одну функцию на две.

У меня была одна функция, которая собирала данные, заполняла их двумерным массивом, а затем создавала отображение для этих данных. я решил разделить его - одну функцию для заполнения массива и другую функцию для отображения этих данных в требуемом формате.

Однако, поскольку функция делится на две части, даже при тщательном анализе кода, по какой-то причине массив либо не заполняется должным образом, либо не читается должным образом, либо что-то не так.

Включен дамп моего кода, поскольку мои собственные глаза не могут определить проблему.

Извините, кода много. Но я просмотрел каждую строчку и не могу понять, что не так - тем более, что когда это была одна функция, она работала нормально!

Неопределенная ошибка смещения повторяется в точках, указанных в приведенном ниже коде.

Глобальные переменные и первая функция - получение данных из CSV.

/*
  variables that work out current week
*/

$termstart = strtotime("03 October 2011"); //start of term, set manually every year, week 1 is first week after freshers.
$todaysdate = strtotime("now"); //todays date
$weekdif = ceil(($todaysdate-$termstart)/604800);//weeks between the two dates
//define global variables and arrays
$row = 0;
$col = 0;
$num = 0;


//this is the main timetable interface array
$val = array(array());

$ttdata = array();

$lecs = array();

tableinit($weekdif);


function tableinit($wkd)
{

$days = array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
$times = array("09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00");


//Check for appropriate CSV file and open it
if (($handle = fopen("timetable.csv", "r")) !== FALSE)
{
    //Check file for data and copy it into an array
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
    {
        //filter out blank lines in the file
        $fdata = array_filter($data);
        $num = count($fdata);

        //If line is not empty
        if ($num > 0)
        {
            //for every value in the array (the line)
            for ($c=0; $c<$num; $c++)
            {

                /*
                  This gets the module code, trims it of useless data,
                  then adds the name into an array of lectures for comparison later.
                  This is used to set up different colours for each different module
                */

                if ($c == 3)
                {
                    $lecture = substr($fdata[$c],0,8);

                    if (empty($lecs))
                    {
                        $lecs[] = $lecture;
                    }
                    else if (!(in_array($lecture,$lecs)))
                    {
                        $lecs[] = $lecture;
                    }

                    $ttdata[] = $lecture;
                }

                //if it's the 4th value or higher, then its data we want to display.
                if ($c >= 4)
                {
                    //add the data to an array. If no array exists, create it
                    $ttdata[] = $fdata[$c];
                }



                /*
                  if the value is a day of the week
                  set the value of the first timetable column as the appropriate day
                  with the corresponding row
                */

                switch ($fdata[$c])
                {
                    case $days[0]:
                        $row = 0;
                        $val[$row][0] = $fdata[$c];
                        break;
                    case $days[1]:
                        $row = 1;
                        $val[$row][0] = $fdata[$c];
                        break;
                    case $days[2]:
                        $row = 2;
                        $val[$row][0] = $fdata[$c];
                        break;
                    case $days[3]:
                        $row = 3;
                        $val[$row][0] = $fdata[$c];
                        break;
                    case $days[4]:
                        $row = 4;
                        $val[$row][0] = $fdata[$c];
                        break;
                    case $days[5]:
                        $row = 5;
                        $val[$row][0] = $fdata[$c];
                        break;
                    case $days[6]:
                        $row = 6;
                        $val[$row][0] = $fdata[$c];
                        break;
                }

                /*
                  this function compares the current week to the weeks in the timetable.
                  If there's a match, add a flag to the array for that lecture.
                  if not, do nothing.
                */

                if ($c == 6)
                {
                    $exp1 = explode(",", $fdata[$c]);

                    foreach ($exp1 as $i)
                    {
                        $i = trim($i);
                        $exp2 = explode("-", $i);

                        if (($wkd >= $exp2[0])&&($wkd <= $exp2[1]))
                        {
                            $ttdata[] = TRUE;
                        }
                    }
                }

                /*
                  if c the second value in the array,
                  check the value against the Time array
                  and set the column appropriately
                */
                if ($c==1)
                {
                    switch ($fdata[$c])
                    {
                        case $times[0]:
                            $col = 1;
                            break;
                        case $times[1]:
                            $col = 2;
                            break;
                        case $times[2]:
                            $col = 3;
                            break;
                        case $times[3]:
                            $col = 4;
                            break;
                        case $times[4]:
                            $col = 5;
                            break;
                        case $times[5]:
                            $col = 6;
                            break;
                        case $times[6]:
                            $col = 7;
                            break;
                        case $times[7]:
                            $col = 8;
                            break;
                        case $times[8]:
                            $col = 9;
                            break;
                    }
                }
            } //end line

            //fill the timetable with whitespace to preserve shape and empty slots
            for ($i=0;$i<=6;$i++)
            {
                for ($j=1;$j<=9;$j++)
                {
                    if (!isset($val[$i][$j]))
                    {
                        $val[$i][$j] = "&nbsp;";
                    }
                }
            }

            //if there's a flag to display data
            if (isset($ttdata[4]))
            {
                //remove the flag
                unset($ttdata[4]);
                //fill the current timetable position with the array of data to display
                $val[$row][$col] = $ttdata;
            }

            //delete the array of data to display
            unset($ttdata);
        }
    }
    fclose($handle);//close the file when finished
}

}

Вторая функция (рисование таблицы)

drawtable($weekdif, $val);

function drawtable($wkd, $val)
{

$days = array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
$times = array("09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00");


//this sets up any days with no lectures, so there's not just a blank line
for ($m=0;$m<5;$m++)
{
    $row=$m;
    $val[$row][0] = $days[$m];
}

//create the table for the data from the main array
$table = "<table class='main' align='center'>\n<tr><td>Week $wkd</td>";

//create the line of different lecture times in the first row of the table
foreach ($times as $t)
{
    $table .= "<td class='dt'> ". $t . "</td>";
}
$table .= "</tr>\n"; //end first row

//for every weekday
for ($i=0;$i<5;$i++)
{
    //create a new row
    $table .= "<tr>";

    //for every time slot on that day
    for ($j=0;$j<=9;$j++)
    {
        //if there's an array present
        if (is_array($val[$i][$j]) == TRUE) //LOOP IS HERE
        {
            //copy the array to a temporary one
            $temp = $val[$i][$j];

            /*
              Switch statement to ensure that each module is always shown as a different colour.
              the same module will always be the same colour. Different modules will always be different colours.
            */

            switch ($temp[0])
            {
                case $lecs[0]:
                    $table .= "<td class='lecture1'>";
                    break;
                case $lecs[1]:
                    $table .= "<td class='lecture2'>";
                    break;
                case $lecs[2]:
                    $table .= "<td class='lecture3'>";
                    break;
                case $lecs[3]:
                    $table .= "<td class='lecture4'>";
                    break;
                case $lecs[4]:
                    $table .= "<td class='lecture5'>";
                    break;
                case $lecs[5]:
                    $table .= "<td class='lecture6'>";
                    break;
            }
            //for each value in the array
            foreach ($temp as $datum)
            {
                //print it and create a new line
                $table .= " ". $datum . " <br />";
            }
            $table .= "</td>";
        }
        //otherwise if a Day is present
        elseif ($j==0)
        {
            //print it
            $table .= "<td class='dt'>";
            $table .= $val[$i][$j]; //LOOP IS HERE
            $table .= "</td>";
        }
        //otherwise
        else
        {
            //print the whitespace
            $table .= "<td class='tt'>";
            $table .= $val[$i][$j];
            $table .= "</td>";
        }

    }
    //end row
    $table .= "</tr>\n";
}
//end table
$table .= "</table>";

//print the entire table
echo $table;

}

Наконец, чтобы увидеть ошибку в действии:

http://oliverlea.com/3yp/tt.php

1 Ответ

2 голосов
/ 02 апреля 2012

Вам необходимо предоставить tableinit доступ к переменной $val с ключевым словом global:

  function tableinit($wkd) {
        global $val;

См. Справочную страницу PHP по области действия переменной: http://php.net/manual/en/language.variables.scope.php. Без global ключевое слово, ваша функция создает локальную версию $val и манипулирует ею, но $val, определенный вами в верхней части страницы, остается неизменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...