按字符串键x访问数组,其中x为“123”

时间:2011-08-10 09:15:02

标签: php arrays

我们有一个数组,其键是字符串,但这些字符串有时只是数字(例如“123”)。当尝试通过键“123”访问数组时,我们得到一个未定义的索引通知。当仅通过整数123访问它时,我们得到Undefined Offset通知。这告诉我们我们正在尝试使用“123”字符串正确编制索引,但它仍未设置。

尝试为这个SO问题提出一个例子这很难,因为PHP会自动将我们的测试用例中的数组键转换为整数,而在我们的实际应用程序中,这不会发生(由于使用了Java Bridge) )。我们现在尝试的测试数组是:

<?php
$array = array("123" => array(108, 8));
var_dump($array);
?>

返回:

array(1) { [123]=> array(2) { [0]=> int(108) [1]=> int(8) } }

虽然在我们的现实世界中,它会返回:

array(1) { ["123"]=> array(2) { [0]=> int(108) [1]=> int(8) } }

所以在现实世界中,索引实际上是一个字符串:

<?php
var_dump(array_keys($array));
?>

返回

array(1) { [0]=> string(3) "123" }

所以,最后问题是以下代码的输出:

<?php
foreach ($array as $key => $value) {
    if (!isset($array[$key])) {
        print "What is happening here?";
    }
} 
?>

给出:

What is happening here?

根据Yoshi的评论,这是工作测试代码:

<?php
$array = (array)json_decode('{"123":[108,8]}');
foreach ($array as $key => $value) {
    if (!isset($array[$key])) {
        print "What is happening here?";
    } else {
        print "Nothing to see here, move along";
    }
} 
?>

3 个答案:

答案 0 :(得分:2)

也不是非常优雅的解决方案,但也可以工作,不需要重新创建阵列。此外,您还可以访问元素值。

$array = (array)json_decode('{"123":100}');
$array_keys = array_keys($array);
$array = (object)$array;

foreach ($array_keys as $key)
{

    if (!isset($array->$key))
    {
        print "What is happening here?";
    }
    else {
        print "It's OK val is {$array->$key}";
    }
} 

在键入$之前注意$array->$key,这很重要。

答案 1 :(得分:1)

查看此代码(和行$array[(string)$key]

<?php
$array = array("123" => array(108, 8));

foreach ($array as $key => $value)
{
    if (!isset($array[(string)$key]))
    {
        print "What is happening here?";
    }
    else print "It's just types";
} 

$ key的类型自动转换为整数,这就是为什么在数组中找不到这个键的原因。

您可以在手册中找到有关它的所有信息:http://php.net/manual/en/language.types.type-juggling.php

此代码适用于两种情况:

foreach ($array as $key => $value)
{
    if (!array_key_exists($key, $array))
    {
        print "What is happening here?";
    }
    else print "It's just types";
} 

答案 2 :(得分:0)

我遇到了同样的问题(但是使用了array_intersect_key)。

这是我的解决方案:

$array = array_combine(array_keys($array), $array)