字符串 - PHP 中的数组歧义

Posted

技术标签:

【中文标题】字符串 - PHP 中的数组歧义【英文标题】:string - array ambiguity in PHP 【发布时间】:2012-05-15 02:16:44 【问题描述】:

我依稀记得,从我第一次阅读 php 文档(10 多年前)开始,访问数组中字符的类似数组的语法 ($string[0]) 存在一些歧义或未定义的行为。

O'Reilly PHP 袖珍参考(第 2 版)指出:

为了解决字符串和数组之间的歧义问题,一个 引入了新语法来取消引用单个字符 来自字符串:

$string2

此语法等效于$string[2],并且更可取。

我知道$string[2] 可能会令人困惑,但我不确定它怎么会模棱两可?

此外:考虑到花括号 (apparently) 也适用于“真实”数组,我想知道 the new syntax $string2 如何消除歧义/混淆。

【问题讨论】:

我不确定我是否理解正确,但我在这里没有看到问题,因为从这个角度来看,$string2(或 $string[2])用于作为一个字符串,选择第二个字符或从数组的角度,检索第二个元素,这对于解释器来说基本上是一样的,因为字符串对于解释器来说也只是一个数组。 最新的php版本变得很奇怪$str = 'hi'; echo $str[0][0][0][0][0][0][0];//outputs h,只是递归地为第一个字符做substr 【参考方案1】:

唯一的歧义是,如果您期望一个数组,但实际上有一个字符串,$var[0] 将给您字符串的第一个字节而不是第一个数组元素。这可能会导致很多人摸不着头脑,想知道为什么 PHP 只给你第一个字符而不是整个数组元素。对于像$var['foo'] 这样的非数字索引更是如此,如果$var 是一个字符串,它实际上是有效的(是的,请不要问)。 IE。如果您的程序一开始就出错,可能会使调试更加困难。

正确的程序没有歧义,因为变量不能同时是字符串和数组。

【讨论】:

+1 和咆哮:这是一个典型的 PHP“解决方案”,它......什么也解决不了。错误地将[] 放在字符串上会得到意外结果,而将 错误地放在数组上也会得到意外结果,因为您总是只期待一个字符。当然这不是真的,因为正如 OP 所说, 在数组上也“正常”工作,所以现在[] 有同样的问题,导致 被引入。也许未来的尝试会在我们用完标点符号之前设法做到这一点。呃。 $var['foo'] 有效,因为 PHP 知道它不是一个数组,'foo' 不是这个非数组的有效键,所以它被强制为 0 并变为 $var[0] @Marc 是的,有一个解释,但这并没有真正让它变得更好。 :) 5.4 中至少触发通知的行为更有意义。【参考方案2】:

由于字符串偏移量和数组偏移量之间的歧义导致的许多问题已随着 5.4 中的更改(在您的参考发布日期之后)被删除。 http://php.net/manual/en/migration54.incompatible.php

因此,我建议在新代码中使用 [] 作为字符串偏移量。

【讨论】:

【参考方案3】:

好吧,我已经用这段代码测试了一些变量:

<pre><?php 

dumpling(array("php"));
dumpling(array());
dumpling(0);
dumpling(1);
dumpling(TRUE);
dumpling(FALSE);
dumpling(NULL);
dumpling("php");

function dumpling($var)
    var_dump($var[0]);
    var_dump($var0);


?>

这两者之间似乎没有任何区别。

输出是:

string(3) "php"
string(3) "php"
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
string(1) "p"
string(1) "p"

【讨论】:

array(TRUE) 的输出是 bool(TRUE);bool(TRUE); BTW,如果有人想知道的话:)

以上是关于字符串 - PHP 中的数组歧义的主要内容,如果未能解决你的问题,请参考以下文章

day01_12.字符串

PHP - 有没有办法将字符串中的数组转换为 PHP 中的有效数组?

PHP:删除多维数组中的空数组字符串[重复]

php编程:如何确定数组中的元素是不是包含某一字符串?

PHP 数组中的PHP搜索字符串 - 不区分大小写

PHP中的数组