【问题标题】:PHP array_key_exists returning FALSE incorrectlyPHP array_key_exists 错误地返回 FALSE
【发布时间】:2012-04-13 14:34:27
【问题描述】:

我的数据正在从客户的 CMS 中提取,但我得到了奇怪的结果

print_r($appliance_data);
foreach ($appliance_data as $adKey => $adValue) {
    print_r($adKey);
    print_r($adValue);
    print_r(array_key_exists($adKey, $appliance_data));
    print_r(isset($appliance_data[$adKey]));
}

有输出

Array
(
    [94] => stdClass Object
        (
            [operation] => 0
            [value] => 0
        )

    [102] => stdClass Object
        (
            [operation] => 501
            [value] => 4
        )

    [90] => stdClass Object
        (
            [operation] => 0
            [value] => 0
        )
)
94
stdClass Object
(
    [operation] => 0
    [value] => 0
)
(boolean) FALSE
(boolean) FALSE
102
stdClass Object
(
    [operation] => 501
    [value] => 4
)
(boolean) FALSE
(boolean) FALSE
90
stdClass Object
(
    [operation] => 0
    [value] => 0
)
(boolean) FALSE
(boolean) FALSE

知道是什么原因造成的吗?

编辑:错误是 array_key_exists AND isset 为通过循环数组获得的键返回 FALSE!

serialize($appliance_data)



a:7:{s:2:"94";O:8:"stdClass":3:{s:9:"operation";s:3:"514";s:5:"value";s:1:"2";s:9:"frequency";s:1:"0";}s:3:"102";O:8:"stdClass":3:{s:9:"operation";s:3:"511";s:5:"value";s:1:"4";s:9:"frequency";s:1:"1";}s:2:"90";O:8:"stdClass":3:{s:9:"operation";s:1:"0";s:5:"value";s:1:"0";s:9:"frequency";s:1:"0";}s:2:"68";O:8:"stdClass":3:{s:9:"operation";s:3:"501";s:5:"value";s:1:"3";s:9:"frequency";s:1:"2";}s:2:"66";O:8:"stdClass":3:{s:9:"operation";s:1:"0";s:5:"value";s:1:"0";s:9:"frequency";s:1:"0";}s:2:"84";O:8:"stdClass":3:{s:9:"operation";s:1:"0";s:5:"value";s:1:"0";s:9:"frequency";s:1:"0";}s:2:"98";O:8:"stdClass":3:{s:9:"operation";s:1:"0";s:5:"value";s:1:"0";s:9:"frequency";s:1:"0";}}

【问题讨论】:

  • 您的某些代码很奇怪(不会按原样运行 - print_r() 之后的括号太多)。循环位看起来应该可以正常运行,而最后一行应该会导致错误。您可以通过运行它来确认这一点吗?当我尝试类似的代码时,我的循环运行良好。
  • @Matt,额外的括号是由于代码位于客户端 CMS 的深处。该数组由客户端 CMS 提供,所以我认为它的编码不正确!

标签: php array-key-exists


【解决方案1】:

您使用的是字符串 '94' 而不是 int 94。试试:

print_r(array_key_exists(94, $appliance_data));

编辑:我根本无法在本地重现这个 - 其他人可以吗?

我尝试使用以下代码复制它:

$first = new stdClass();
$first->operation = 0;
$first->value = 0;
$second = new stdClass();
$second->operation = 501;
$second->value = 4;
$third = new stdClass();
$third->operation = 0;
$third->value = 0;

$appliance_data = array(94 => $first, 102 => $second, 90 => $third);
// Same output when using these lines too:
// $appliance_data = array('94' => $first, '102' => $second, '90' => $third);
// $appliance_data = array("94" => $first, "102" => $second, "90" => $third);

print_r($appliance_data);
echo "\n\n";
foreach ($appliance_data as $adKey => $adValue) {
    print_r($adKey);
    echo "\n";
    print_r($adValue);
    print_r(array_key_exists($adKey, $appliance_data));
    echo "\n";
    print_r(isset($appliance_data[$adKey]));
    echo "\n\n";
}

得到这个输出:

Array
(
    [94] => stdClass Object
        (
            [operation] => 0
            [value] => 0
        )

    [102] => stdClass Object
        (
            [operation] => 501
            [value] => 4
        )

    [90] => stdClass Object
        (
            [operation] => 0
            [value] => 0
        )

)


94
stdClass Object
(
    [operation] => 0
    [value] => 0
)
1
1

102
stdClass Object
(
    [operation] => 501
    [value] => 4
)
1
1

90
stdClass Object
(
    [operation] => 0
    [value] => 0
)
1
1

【讨论】:

  • 这不是循环中的字符串吗?
  • 是的,循环看起来仍然很奇怪。
  • 我怀疑这不是直接复制粘贴的,因为 print_r($adValue));括号太多了。
  • 循环调用array_key_exists时是否需要重置数组索引?使用isset() 会发生什么
  • 好消息:根据 manhon824 对手册页 php.net/manual/en/function.array-key-exists.php 的评论,您确实需要先调用 reset()。但是我尝试了类似的代码,它适用于循环结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2018-10-30
  • 2011-09-10
相关资源
最近更新 更多