PHP - 未定义的偏移量(0),即使它包含值

时间:2013-12-21 05:05:39

标签: php codeigniter undefined offset

我正在尝试在CodeIgniter环境中工作,在尝试收集并收集一些信息到变量时,我收到了一些似乎不正确的PHP NOTICE错误。

以下是发生错误的代码块:

if (empty($events['user'][$user_id])) {
    unset($events['user'][$user_id]);
} else {
    foreach ($events['user'][$user_id] as $event) {
        $events['user'][$user_id]['events']['event_id']           = $event_id = $event['event_id'];
        $events['user'][$user_id]['event']['date']                = $this->events_model->getEventDates($event_id);
        $events['user'][$user_id]['event']['date']                = $events['user'][$user_id]['event']['date'][0]['date'];
        $events['user'][$user_id]['event']['request_title']       = $event['request_title'];
        $events['user'][$user_id]['event']['event_status_text'][] = $this->events_model->getEventStatusFromSectionStatuses($event_id);
        $request_data                                             = $this->requests_model->getRequestInfo($event['request_id']);
        $events['user'][$user_id]['event']['ministry']            = $this->ministries_model->getMinistryTitle($request_data[0]['requesting_ministry']);
        // more stuff will go here...
    }


    $content_data['event_status_text'] = $events['user'][$user_id]['event_status_text'];
    $content_data['events']            = $events['user'][$user_id]['complete_events'];
    $content_data['totals']            = $events['user'][$user_id]['totals'];
    $content_data['updated_events']    = $events['user'][$user_id]['updated_events'];
}

第一个错误的特定行是foreach循环内以['date'][0]['date']结尾的第三行。这是PHP告诉我的[0]未定义。但是,如果我像这样回应完全相同的变量:

echo $events['user'][$user_id]['event']['date'][0]['date'];

...它会输出一个预期的值,这也告诉我[0]毕竟不是未定义的。我实际上并没有改变变量。唯一的区别是我正在回应它,而不是将它分配给另一个变量。

如果我在这里使用@忽略它,它会在以getMinistryTitle($request_data[0]['requesting_ministry'])结尾的行后再发生几行。

你能看出我做错了什么吗?如果您需要查看更多代码,请告诉我。

这是请求的getEventDates()代码(注意这不是我的代码):

    function getEventDates($event_id)
    {
        $sql = "SELECT date FROM `event_dates` WHERE event_id=? ORDER BY date";
        $res = $this->db->query($sql, array($event_id));
        return $res->result_array();
    }

如果我打印出$this->events_model->getEventDates($event_id),我会得到以下内容:

    Array
(
    [0] => Array
        (
            [date] => 2014-05-01
        )

    [1] => Array
        (
            [date] => 2014-05-08
        )

    [2] => Array
        (
            [date] => 2014-05-15
        )

    [3] => Array
        (
            [date] => 2014-05-22
        )

    [4] => Array
        (
            [date] => 2014-05-29
        )

    [5] => Array
        (
            [date] => 2014-06-05
        )

    [6] => Array
        (
            [date] => 2014-06-12
        )

)

嗯...是否可能发生此错误,因为[0]中没有包含直接值,而是另一个数组级别?请注意,我没有构造此输出。其他人对此进行了编码,我的工作就是进入并使用它。

3 个答案:

答案 0 :(得分:0)

如果没有看到你的其余代码,这就令人困惑:

$events['user'][$user_id]['event']['date'] = $this->events_model->getEventDates($event_id);                         
$events['user'][$user_id]['event']['date'] = $events['user'][$user_id]['event']['date'][0]['date'];

为什么要在一行中设置$events['user'][$user_id]['event']['date']然后在下一行中再次覆盖它?

我最好的建议是在独立于数组的变量中设置第一个赋值,然后为数据调用该变量:

$event_dates_temp = $this->events_model->getEventDates($event_id);
$events['user'][$user_id]['event']['date'] = $event_dates_temp[0];

并且可能添加条件检查以确保您正在设置存在的东西:

$event_dates_temp = $this->events_model->getEventDates($event_id);
if (array_key_exists(0, $event_dates_temp)) {
  $events['user'][$user_id]['event']['date'] = $event_dates_temp[0];
}

另外,目前还不清楚你在做什么:

echo $events['user'][$user_id]['event']['date'][0]['date'];

当您像这样进行转储时输出是什么:

echo '<pre>';
print_r($events['user'][$user_id]['event']['date']);
echo '</pre>';

答案 1 :(得分:0)

当您尝试访问未为该索引设置的值时会发生这种情况,请read this link获取更多信息。

有两种选择:

  1. 通过告知PHP error_reporting不显示通知error_reporting(E_ALL ^ E_NOTICE);来忽略这些通知,但通过添加检查是否存在值来修复此错误是一个好习惯。
  2. 通过isset函数修复值,以查看值/索引是否包含任何数据。

答案 2 :(得分:0)

  1. 如果你隐藏通知设置error_reporting(E_ALL ^ E_NOTICE);
  2. 解决方法是使用isset()来解决此问题。