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 = 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()重新索引数组


不建议的写法


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

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

以下写法也是正确的

"zhangsan");
echo $arr[name("name")];
?>

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


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

你可能感兴趣的:(php面试题:数组)