<div style="height:30px;line-height:30px;background:#f1f1f1;font-weight:bold;font-size:14px;padding:5px 10px;margin-bottom:10px;border-bottom:1px solid #ccc">类型>Array数组</div>
<p style="font-size:14px;font-weight:bold;padding:5px;background:#f8f8f8;border-radius:8px;border:1px solid #ddd;text-indent: 2em;">
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。最后一个元素后面的逗号可以被省略。
</p>
* * * * *
<p style="font-size:14px;font-weight:bold;padding:5px;background:#f8f8f8;border-radius:8px;border:1px solid #ddd;text-indent: 2em;">
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。最后一个元素后面的逗号可以被省略。
</p>
<p style="font-size:14px;font-weight:bold;padding:5px;background:#f8f8f8;border-radius:8px;border:1px solid #ddd;text-indent: 2em;">
要删除某键值对,对其调用 unset() 函数。
</p>
key 可以是 integer 或者 string。value 可以是任意类型。
关于Key,有如下强制转化:
* 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
* 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
* 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
* Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
* 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
**注意:**
1.元素键名相同,后面的元素会将前面的元素覆盖。
2.如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。
3.key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。
4.方括号和花括号可以互换使用来访问数组单元(例如 $array[42] 和 $array{42} 在上例中效果相同)。
5.试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL。
6.unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。
7.foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
8. 重申一次,在双引号字符串中,不给索引加上引号是合法的因此 "$foo[bar]" 是合法的(“合法”的原文为 valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的 notice。无论如何,强烈建议不要使用 $foo[bar]这样的写法,而要使用 $foo['bar'] 来访问数组中元素。--haohappy 注)。至于为什么参见以上的例子和字符串中的变量解析中的解释。
特殊案例:
~~~
<?php
$array = array(
"a",
"b",
6 => "c",
"d",
);
var_dump($array);
?>
~~~
输出 0=>a,2=>b,6=>c,7=>d
~~~
$arr[key] = value;
$arr[] = value;
~~~
都是合法的写法。
~~~
<?php
// 创建一个简单的数组
$array = array(1, 2, 3, 4, 5);
print_r($array);//0,1,2,3,4,5,的键
// 现在删除其中的所有元素,但保持数组本身不变:
foreach ($array as $i => $value) {
unset($array[$i]);
}
print_r($array);
//删除了所有数组,但是他的最大键还是存在的
// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
$array[] = 6;
print_r($array);
//[5]=>6
// 重新索引:
$array = array_values($array);
$array[] = 7;
print_r($array);
//array_values 是重新索引
//0=>6,1=>7
?>
~~~
~~~
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?>
~~~
这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
注意:这并不意味着总是给键名加上引号。用不着给键名为常量或变量的加上引号,否则会使 PHP 不能解析它们。有些数组的键值可能就是常量,甚至有些键就是一个变量,这些是可以不用加引号的。
案例:
~~~
<?php
// Show all errors
error_reporting(E_ALL);
$arr = array('fruit' => 'apple', 'veggie' => 'carrot');
// Correct
print $arr['fruit']; // apple
print $arr['veggie']; // carrot
// Incorrect. This works but also throws a PHP error of level E_NOTICE because
// of an undefined constant named fruit
//
// Notice: Use of undefined constant fruit - assumed 'fruit' in...
print $arr[fruit]; // apple
// This defines a constant to demonstrate what's going on. The value 'veggie'
// is assigned to a constant named fruit.
define('fruit', 'veggie');
// Notice the difference now
print $arr['fruit']; // apple
print $arr[fruit]; // carrot
// The following is okay, as it's inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]"; // Hello apple
// With one exception: braces surrounding arrays within strings allows constants
// to be interpreted
print "Hello {$arr[fruit]}"; // Hello carrot
print "Hello {$arr['fruit']}"; // Hello apple
// This will not work, and will result in a parse error, such as:
// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// This of course applies to using superglobals in strings as well
print "Hello $arr['fruit']";
print "Hello $_GET['foo']";
// Concatenation is another option
print "Hello " . $arr['fruit']; // Hello apple
?>
~~~
**转换为数组**
* * * * *
对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 完全一样。
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:
**版本差别:**
*1.自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。
2.自 PHP 5.5 起可以用数组间接引用一个数组原型。*
<div style="background:#f0f0f0;text-align:center;font-size:12px;padding:20p">
© 2017-版权 杜二红 如要转载,请注明出处!
</div>