数组不存储整个字符串(看似)

时间:2017-11-30 03:59:56

标签: php php-7

为什么以下代码无法将“name”列中的整个字符串存储到输出数组中?代码确实在某些方面起作用。

$contacts = "";
$sql = "SELECT * FROM s_issue.t_contact WHERE orgid='$orgid' ORDER BY id";
$results = db_query($db, $sql, "psql");
while($row = pg_fetch_assoc($results)){
    $contacts[$row["id"]] = $row["name"];
}

return $contacts;

数据库列id包含整数,name列包含字符串。预期的输出是联系人姓名列表,但在我最初的试验中,我得到了一个空白列表。

我被要求查看一些非常古老的遗留代码。关于升级到PHP7的新近程度并不明显,当我开始寻找时,我甚至不确定它是否是PHP7。

1 个答案:

答案 0 :(得分:2)

如果您遇到这样的遗留代码,并且发现自己想知道为什么输出数组不包含您期望的内容,您最近是否已升级到PHP7?因为那就是原因。

PHP7中的初始行现在强制(默认)键入$contacts作为字符串。此外,可以用数字索引字符串以访问该字符串中的每个字符。那就是:

$foo = "abcde";
echo $foo[1]; // outputs 'b'

因此当$row["id"]为数字时,$contacts[$row["id"]]将成为带有数字索引的字符串。因此,只能在该位置存储一个字符,它是字符串$row["name"]的第一个字符。

正确的解决方法是要么完全删除$contacts = ""的错误类型的初始化行,要么正确地将其初始化为实际需要的类型,数组:

$contacts = array();

有问题的代码在PHP7之前运行良好。它将在PHP7中以神秘的方式失败。