未定义的索引:homePageLink

时间:2014-07-02 10:29:55

标签: php codeigniter

我收到此PHP警告:

Message: Undefined index: homePageLink

索引就在那里。我可以在函数中打印它,即使它进入视图,如果我print_f我能看到它。

function logo($params) {
  $widgetData['title'] = $params['title'] == "" ? ROOT_DOMAIN : $params['title'];
  $widgetData['homePageLink'] = $params['homePageLink'] ? "http://" . ROOT_DOMAIN : false;
  return $widgetData;
}

如果我在徽标功能中打印$params,我会得到:

$params ([homePageLink] => 1 [title] => My Title)

如果我print_f视图中的数组,我会完全一样。

我有很多这些功能做同样的事情,这是我第一次有这个。我已经尝试将“homePageLink”条目更改为String而不是布尔值,但它没有区别。

我从JSON文件中获取数据:

{
  "logo": {
   "homePageLink" : true,
   "title": "My Title"
}

我疯了吗?

更新:我忘了说我已经尝试过了:

$widgetArray = array();

4 个答案:

答案 0 :(得分:0)

你能试试这个:来修复这个功能,我使用了php empty()功能

function logo($params) {
  $widgetData['title'] = (!empty($params['title']) ? ROOT_DOMAIN : $params['title']);
  $widgetData['homePageLink'] = (!empty($params['homePageLink']) ? "http://" . ROOT_DOMAIN : false);
  return $widgetData;
}

我测试了这样:

define('ROOT_DOMAIN', 'test.com');

var_dump(logo(array(
    'title' => 'Hello World',
    'homePageLink' => 1
)));

输出:

enter image description here

答案 1 :(得分:0)

最初使用空白值设置变量,或者将数组设置为: -

$widgetData = array();

您也可以使用empty()isset()来避免通知

$widgetData['homePageLink'] = (!empty($params['homePageLink']) ? "http://" . ROOT_DOMAIN : false);

$widgetData['homePageLink'] = ($params['homePageLink'] == true) ? "http://" . ROOT_DOMAIN : false);

答案 2 :(得分:0)

你可以试试这个

function logo($params) {
  $widgetData = array();
  $widgetData['title'] = $params['title'] == "" ? ROOT_DOMAIN : $params['title'];
  $widgetData['homePageLink'] = empty($params['homePageLink']) ? "http://" . ROOT_DOMAIN : false;
  return $widgetData;
}

答案 3 :(得分:0)

最后更新:
我从你的评论中推断出拉克什的答案(当我这样做时,它工作得很好:if (isset($params['homePageLink'])) echo "IT IS SET TO: " . $params['homePageLink'];我得到了#34;它被设置为:1" ),你是,实际上没有检查是否设置了给定的键 就像我在这篇文章中无数次说的那样(在评论中,在这个答案中): 添加isset检查,只要你访问{{1}中的任何一个键} array

不要只检查此$params商家一次,您必须在每次使用时检查每个密钥,或者使用默认值填写缺少的密钥:

isset

现在,您确定所需的密钥确实已设置。

更新
所以,事实证明你试图预先声明fucntion logo(array $params) { if (!isset($params['homePageLink'])) $params['homePageLink'] = false;//set to false as default if (!isset($params['title'])) $params['title'] = false; } 数组,但无济于事。好吧,快速回顾一下要检查的事情,仍然是:

  • 检查实际代码和测试中的拼写错误!
  • $widgetData函数添加类型提示,以确保logo始终为数组。
  • $params个检查添加到您尝试使用的isset数组中的所有键(如下所示)
  • 检查$params的密钥,确保它们不是二进制字符串,可能包含不可见的$params字符(例如,在投射objects to an array的实例时)

通知可能不会来自您访问\0,而是您尝试分配给$params['homePageLink']变量。
看到你没有明确地将后者声明为数组,你应该得到通知。尝试将$widgetData函数更改为以下内容:

logo

当然,如果您所做的只是构造function logo(array $params) {//use type-hints, to ensure $params is an array $widgetData = array( 'title' => isset($params['title']) && $params['title'] ? $params['title'] : ROOT_DOMAIN, 'homePageLink' => isset($params['homePageLink']) && $params['homePageLink'] ? 'http://'.ROOT_DOMAIN : false ); //do stuff return $widgetData; } 数组,那么您甚至无需将其分配给局部变量,只需编写

$widgetData

如果return array( 'title' => 'same code as above' ); 中的任何值在任何给定点都可能是$params,那么nullempty都不会有多大用处(isset如果分配了数组键isset,则评估为falseempty评估为true。因此,当值为null时,键确实存在,即使这两个检查都会告诉您它没有。 在这种情况下,只有一件事:

null