绝想首页

数组做什么和不做什么

王威s107jn [感伤] 2013-05-21 05:52:57 星期二 晴天 查看:110 回复:0 发消息给作者

数组做什么和不做什么 为什么 $foo[bar] 错了?

应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么 $foo[bar] 错了呢?可能在老的脚本中见过如下语法:

这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。

注: 这并不意味着总是给键名加上引号。用不着给键名为常量或变量的加上引号,否则会使 PHP 不能解析它们。

注: 上例的输出类似于:

Checking 0:Notice: Undefined index: $i in /path/to/script.php on line 10Bad:Good: 1Notice: Undefined index: $i in /path/to/script.php on line 12Bad:Good: 1Checking 1:Notice: Undefined index: $i in /path/to/script.php on line 10Bad:Good: 2Notice: Undefined index: $i in /path/to/script.php on line 12Bad:Good: 2

演示此效应的更多例子:

当打开 error_reporting() 来显示 E_NOTICE 级别的错误(例如将其设为 E_ALL)时将看到这些错误。默认情况下 error_reporting 被关闭不显示这些。

和在语法一节中规定的一样,在方括号(“[”和“]”)之间必须有一个表达式。这意味着可以这样写:

这是一个用函数返回值作为数组索引的例子。PHP 也可以用已知常量,可能之前已经见过 E_*。

注意 E_ERROR 也是个合法的标识符,就和第一个例子中的 bar 一样。但是上一个例子实际上和如下写法是一样的:

因为 E_ERROR 等于 1,等等。

如同在以上例子中解释的那样,$foo[bar] 起作用但其实是错误的。它起作用是因为根据语法的预期,bar 被当成了一个常量表达式。然而,在这个例子中不存在名为 bar 的常量。PHP 就假定指的是字面上的 bar,也就是字符串 "bar",但忘记加引号了。

那么为什么这样做不好?

在未来的某一时刻,PHP 开发小组可能会想新增一个常量或者关键字,或者用户可能希望以后在自己的程序中引入新的常量,那就有麻了。例如已经不能这样用 empty 和 default 这两个词了,因为他们是保留字。

注: 重申一次,在双引号字符串中,不给索引加上引号是合法的因此 "$foo[bar]"是合法的。至于为什么参见以上的例子和字符串中的变量解析中的解释。

转换为数组

对于任何的类型:整型、浮点、字符串、布尔和资源,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为 0),该元素即为此标量的值。

如果将一个对象转换成一个数组,所得到的数组的元素为该对象的属性(成员变量),其键名为成员变量名。

如果将一个 NULL 值转换成数组,将得到一个空数组。

比较

有可能通过 array_diff() 和数组运算符来比较数组。

例子

PHP 中的数组类型有非常多的用途,因此这里有一些例子展示数组的完整威力。

例子 11-6. 使用 array()

例子 11-7. 集合

上例将输出:

Do you like red?Do you like blue?Do you like green?Do you like yellow?

直接改变数组的值在 PHP 5 中可以通过引用传递来做到。之前的版本需要需要采取别的方法:

例子 11-8. 集合

上例将输出:

Array( [0] => RED [1] => BLUE [2] => GREEN [3] => YELLOW)

本例产生一个下标从 1 开始的数组。

例子 11-9. 下标从 1 开始的数组

上例将输出:

Array( [1] => 'January' [2] => 'February' [3] => 'March')*/?>

例子 11-10. 填充数组

数组是有序的。也可以使用不同的排序函数来改变顺序。更多信息参见数组函数。可以用 count() 函数来数出数组中元素的个数。

例子 11-11. 数组排序

因为数组中的值可以为任意值,也可是另一个数组。这样可以产生递归或多维数组。

例子 11-12. 递归和多维数组

需要注意数组的赋值总是会涉及到值的拷贝。这还意味着在 current() 以及类似函数中使用的内部数组指针会被重置。需要在复制数组时用引用符号(&)。


顶一下(33 写日记 1260650 243484
上一篇:昨天的心情下一篇:无奈被破相~
分享排行

 

 

留住已经逝去的峥嵘岁月 记住曾经绽现的万种风情 在记忆即将淡漠的时候 来把这些重新回味

Copyright (C) 2008-2014 www.juexiang.com, All Rights Reserved.

京ICP备2023001011号-3   京公网安备11010802011908号

客服QQ 1017160561 违法和不良信息举报电话 13148464312 邮箱 1017160561@qq.com