php面试题:数组

数组的key 会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。注意:字符浮点会当做字符串处理,不转为整型
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type
  • 多个同key数组,替换原则为最后一个值替换原来的值,数组顺序不会因此改变。

示例

#
$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);

答案

array(1) {
  [1]=>
  string(1) "d"
}
#因为每次都是被覆盖

示例

$array = array(
    "foo" => "bar",
    "bar" => "foo",
    100   => -100,
    -100  => 100,
);
var_dump($array);

答案:

array (size=5)
  'foo' => string 'bar' (length=3)
  'bar' => string 'foo' (length=3)
  100 => int -100
  -100 => int 100
  101 => int 100

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。


示例

$array = array(
         "a",
         "b",
    6 => "c",
         "d",
);
var_dump($array);

答案:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [6]=>
  string(1) "c"
  [7]=>
  string(1) "d"
}

示例

$array = array(
         "a",
    "0" => "b",
    "H" => "c",
         "d",
);
var_dump($array);

答案:

array (size=3)
  0 => string 'b' (length=1)
  'H' => string 'c' (length=1)
  1 => string 'd' (length=1)
# a被溢出

方括号和花括号可以互换使用来访问数组单元(例如 array[42] 和array{42} 在上例中效果相同)。


示例

$array = array(1, 2, 3, 4, 5);
foreach ($array as $i => $value) {
    unset($array[$i]);
}
$array[] = 6;
#1
echo $array[5];

#2
echo $array[1];

$array = array_values($array);
$array[] = 7;

#3
print_r($array);

答案:

#1:5
#2:报错
#3:Array
(
    [0] => 6
    [1] => 7
)

如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 0。
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
array_values()重新索引数组


不建议的写法

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>

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

$key="name";
$arr=array("name"=>"zhangsan");
echo $arr[$key];
#$key 本身为字符串。所以是正确的写法。

以下写法也是正确的

<?php
function name($key)
{
    return $key;
}
$arr=array("name"=>"zhangsan");
echo $arr[name("name")];
?>

重申一次,在双引号字符串中,不给索引加上引号是合法的因此$foo[bar]是合法的(“合法”的原文为 valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的 notice。无论如何,强烈建议不要使用 foo[bar]这样的写法,而要使用foo['bar'] 来访问数组中元素。--haohappy 注)。至于为什么参见以上的例子和字符串中的变量解析中的解释。


php在线面试题集:http://cainiaophp.com/
php面试讨论群:536633782

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,557评论 0 13
  • 一、数组定义 array() 1、索引数组 在一个变量中,存储一个或多个值。数组中的每一个元素都有一个访问ID,根...
    竹与豆阅读 580评论 0 0
  • 1.strlen()与mb_strlen()的作用分别是什么? strlen()和mb_strlen()都是作用于...
    落魄PHP女程序员阅读 407评论 0 2
  • 今天,5月5日立夏,小敏却送上“东莞雪”。记得那年,百年一遇的东莞雪惹得莞人欣喜若狅,刚好放寒假在家,疯姑...
    小敏乐园阅读 687评论 4 18
  • 一、tomcat web服务器 tomcat 1.提供数据的接收与发送2.管理网站应用(资源,处理程序)3.we...
    雁_9587阅读 487评论 0 0

友情链接更多精彩内容