PHP语法、数组和错误

3
以下代码为什么在php中会报错?: $b = array("1" => "2")["1"]; 我收到的错误是解析错误...
请帮忙。
3个回答

5

不幸的是,在PHP中,您需要执行以下操作:

$a = array("1" => "2");
$b = $a["1"];

感觉你的例子应该可以工作,因为在其他语言中也是这样。但这只是PHP的方式。


在 PHP 数组文档中没有提到任何特定的原因,尽管其中一个评论提到了类似的内容。点击 http://php.net/manual/en/language.types.array.php 并搜索页面中的“)[”即可找到“John at nowhere dot com”的评论,但它对问题没有任何帮助。也许未来的 PHP 语言增强将支持这种语法。与此同时,您只能使用两行语法。 - Asaph
顺便提一下,写$b = array("1" => "2")["1"]没有多大意义,因为数组会立即被丢弃。同样的事情可以简单地写成$b = "2"。从函数返回一个数组并立即访问数组元素的用例(如我上面提到的评论中的“John at nowhere do com”所提到的)更加实用。 - Asaph

4

有几个要点需要注意。在创建数组时,不能立即从中提取数据。数值键会自动转换为整数,即使它们本来是字符串。


1
实际上,你提到的第二个原因(“数字键自动转换为整数”)并没有真正破坏他的代码。如果你将数组赋值和数组访问分开,就可以访问到正确的值。PHP会进行一些类型转换魔法,并找到正确的索引。 - Asaph
没错,Asaph。我并不是说它是他问题的原因,只是要提醒大家要注意,因为它包含在他的例子中。 - Sampson
@Jonathan Sampson:“在创建期间无法立即从数组中提取” <-- 为什么? - Haim Bender
@Haim,这还不是PHP的一个功能。我认为它会很快推出。 - Sampson

0
你可以使用一个函数来为你完成这个任务:
function Get($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return $array;
    }

    return $default;
}

使用方法如下:

$b = Get(array("1" => "2"), "1"); // 2

如果您不需要访问多维数组,您也可以使用这个更短的函数:
function Get($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        return (array_key_exists($value, $array) === true) ? $array[$value] : $default;
    }

    return $default;
}

1
我想你可以使用一个函数,但为什么要这么长呢?为什么不使用像 function getArrayValue(array $a, $index, $default=null) { return array_key_exists($index, $a) ? $a[$index] : $default; } 这样的东西? - Asaph
@Asaph:只要函数有用,我认为“长”函数并没有什么害处。我的第一个函数允许获取多维索引,并且性能基本相同。 - Alix Axel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接