PHP isset返回true但应该为false

时间:2013-09-11 18:57:22

标签: php cakephp isset cakephp-2.4

我的项目是cakePHP,但我认为这是本机PHP的一个方面,我误解了..

我的afterFind($results, $primary = false)中有一个AppModel回调方法。在一个特定的发现,如果我debug($results);我得到这样的数组

array(
    'id' => '2',
    'price' => '79.00',
    'setup_time' => '5',
    'cleanup_time' => '10',
    'duration' => '60',
    'capacity' => '1',
    'discontinued' => false,
    'service_category_id' => '11'
)

在我的afterFind我有一些像这样的代码:

foreach($results as &$model) {
  // if multiple models
  if(isset($model[$this->name][0])) {
    ....

查找结果来自我的Service模型,因此插入$this->name并检查if(isset($model['Service'][0]))应返回false,但它返回true? if(isset($model['Service']))按预期返回false。

我收到以下PHP警告:

  

非法字符串偏移'服务'

那么这里发生了什么?如果if(isset($model['Service'][0]))返回false,为什么if(isset($model['Service']))会返回true?

更新

我仍然不知道原始问题的答案,但我首先检查$ results是否为多维数组

if(count($results) != count($results, COUNT_RECURSIVE))

2 个答案:

答案 0 :(得分:1)

使用array_key_exists()empty()代替isset()。 PHP奇怪地缓存旧的数组值。必须使用unset()

手动取消设置 对于与NULL值对应的数组键,

isset()不返回TRUE,而array_key_exists()则为。

答案 1 :(得分:0)

字符串偏移提供了一种使用字符串的机制,就像它们是一个字符数组一样:

$string = 'abcde';
echo $string[2]; // c
除了已停用之外,

$model确实是所有键的字符串。

至于isset($model['Service'][0])返回值,我有点惊讶。这是一个简化的测试用例:

$model = '2';
var_dump(isset($model['Service'])); // bool(false)
var_dump(isset($model['Service'][0])); // bool(true)

某处必须有理由。会挖掘..