mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-17 21:16:57 +08:00
771 lines
78 KiB
HTML
771 lines
78 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||
<html>
|
||
<head>
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<title>Array 数组</title>
|
||
</head>
|
||
<div id="layout">
|
||
<div id="layout-content"><div id="language.types.array" class="sect1">
|
||
<h2 class="title">Array 数组</h2>
|
||
|
||
<p class="para">
|
||
PHP 中的<span class="type"><span class="type 数组">数组</span></span>实际上是一个有序映射。映射是一种把 <em class="emphasis">values</em>
|
||
关联到 <em class="emphasis">keys</em> 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的。
|
||
</p>
|
||
|
||
<p class="para">
|
||
解释这些结构超出了本手册的范围,但对于每种结构至少会提供一个例子。要得到这些结构的更多信息,建议参考有关此广阔主题的其它著作。
|
||
</p>
|
||
|
||
<div class="sect2" id="language.types.array.syntax">
|
||
<h3 class="title">语法</h3>
|
||
|
||
<div class="sect3" id="language.types.array.syntax.array-func">
|
||
<h4 class="title">定义数组 <span class="function"><a href="array.html" class="function">array()</a></span></h4>
|
||
|
||
<p class="para">
|
||
可以用 <span class="function"><a href="array.html" class="function">array()</a></span> 语言结构来新建一个数组。它接受任意数量用逗号分隔的
|
||
<em><span class="replaceable">键(key)</span> => <span class="replaceable">值(value)</span></em>对。
|
||
</p>
|
||
|
||
<pre class="synopsis">
|
||
array( <span class="optional"> <span class="replaceable">key</span> => </span> <span class="replaceable">value</span>
|
||
, ...
|
||
)
|
||
// <span class="replaceable">键(key)</span>可是是一个整数 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> 或字符串 <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
|
||
// <span class="replaceable">值(value)</span>可以是任意类型的值</pre>
|
||
|
||
|
||
<p class="para">
|
||
最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用
|
||
<em>array(1, 2)</em> 而不是
|
||
<em>array(1, 2, )</em>。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。
|
||
</p>
|
||
|
||
<p class="para">
|
||
自 5.4 起可以使用短数组定义语法,用 <em>[]</em> 替代
|
||
<em>array()</em>。
|
||
</p>
|
||
|
||
<div class="example" id="example-71">
|
||
<p><strong>Example #1 一个简单数组</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$array </span><span style="color: #007700">= array(<br /> </span><span style="color: #DD0000">"foo" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"bar" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"foo"</span><span style="color: #007700">,<br />);<br /><br /></span><span style="color: #FF8000">// 自 PHP 5.4 起<br /></span><span style="color: #0000BB">$array </span><span style="color: #007700">= [<br /> </span><span style="color: #DD0000">"foo" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"bar" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"foo"</span><span style="color: #007700">,<br />];<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
<span class="replaceable">key</span> 可以是 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> 或者
|
||
<span class="type"><a href="language.types.string.html" class="type string">string</a></span>。<span class="replaceable">value</span> 可以是任意类型。
|
||
</p>
|
||
|
||
<p class="para">
|
||
此外 <span class="replaceable">key</span> 会有如下的强制转换:
|
||
<ul class="itemizedlist">
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
包含有合法整型值的字符串会被转换为整型。例如键名
|
||
<em>"8"</em> 实际会被储存为
|
||
<em>8</em>。但是 <em>"08"</em>
|
||
则不会强制转换,因为其不是一个合法的十进制数值。
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名
|
||
<em>8.7</em> 实际会被储存为 <em>8</em>。
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
布尔值也会被转换成整型。即键名
|
||
<em>true</em> 实际会被储存为 <em>1</em>
|
||
而键名 <em>false</em> 会被储存为 <em>0</em>。
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
<span class="type"><a href="language.types.null.html" class="type Null">Null</a></span> 会被转换为空字符串,即键名
|
||
<em>null</em> 实际会被储存为 <em>""</em>。
|
||
</span>
|
||
</li>
|
||
<li class="listitem">
|
||
<span class="simpara">
|
||
数组和对象<em class="emphasis">不能</em>被用为键名。坚持这么做会导致警告:<em>Illegal offset type</em>。
|
||
</span>
|
||
</li>
|
||
</ul>
|
||
</p>
|
||
|
||
<p class="para">
|
||
如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
|
||
</p>
|
||
|
||
<div class="example" id="example-72">
|
||
<p><strong>Example #2 类型强制与覆盖示例</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$array </span><span style="color: #007700">= array(<br /> </span><span style="color: #0000BB">1 </span><span style="color: #007700">=> </span><span style="color: #DD0000">"a"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"1" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"b"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">=> </span><span style="color: #DD0000">"c"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">true </span><span style="color: #007700">=> </span><span style="color: #DD0000">"d"</span><span style="color: #007700">,<br />);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
array(1) {
|
||
[1]=>
|
||
string(1) "d"
|
||
}
|
||
</pre></div>
|
||
</div>
|
||
<div class="example-contents"><p>
|
||
上例中所有的键名都被强制转换为 <em>1</em>,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个
|
||
<em>"d"</em>。
|
||
</p></div>
|
||
</div>
|
||
|
||
<p class="para">
|
||
PHP 数组可以同时含有 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> 和 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 类型的键名,因为
|
||
PHP 实际并不区分索引数组和关联数组。
|
||
</p>
|
||
|
||
<p class="para">
|
||
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。
|
||
</p>
|
||
|
||
<div class="example" id="example-73">
|
||
<p><strong>Example #3 混合 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> 和 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 键名</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$array </span><span style="color: #007700">= array(<br /> </span><span style="color: #DD0000">"foo" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"bar" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"foo"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">100 </span><span style="color: #007700">=> -</span><span style="color: #0000BB">100</span><span style="color: #007700">,<br /> -</span><span style="color: #0000BB">100 </span><span style="color: #007700">=> </span><span style="color: #0000BB">100</span><span style="color: #007700">,<br />);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
array(4) {
|
||
["foo"]=>
|
||
string(3) "bar"
|
||
["bar"]=>
|
||
string(3) "foo"
|
||
[100]=>
|
||
int(-100)
|
||
[-100]=>
|
||
int(100)
|
||
}
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<p class="para">
|
||
<span class="replaceable">key</span> 为可选项。如果未指定,PHP
|
||
将自动使用之前用过的最大 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> 键名加上 1 作为新的键名。
|
||
</p>
|
||
|
||
<div class="example" id="example-74">
|
||
<p><strong>Example #4 没有键名的索引数组</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$array </span><span style="color: #007700">= array(</span><span style="color: #DD0000">"foo"</span><span style="color: #007700">, </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">, </span><span style="color: #DD0000">"hallo"</span><span style="color: #007700">, </span><span style="color: #DD0000">"world"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
array(4) {
|
||
[0]=>
|
||
string(3) "foo"
|
||
[1]=>
|
||
string(3) "bar"
|
||
[2]=>
|
||
string(5) "hallo"
|
||
[3]=>
|
||
string(5) "world"
|
||
}
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<p class="para">
|
||
还可以只对某些单元指定键名而对其它的空置:
|
||
</p>
|
||
|
||
<div class="example" id="example-75">
|
||
<p><strong>Example #5 仅对部分单元指定键名</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$array </span><span style="color: #007700">= array(<br /> </span><span style="color: #DD0000">"a"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"b"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">6 </span><span style="color: #007700">=> </span><span style="color: #DD0000">"c"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"d"</span><span style="color: #007700">,<br />);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
array(4) {
|
||
[0]=>
|
||
string(1) "a"
|
||
[1]=>
|
||
string(1) "b"
|
||
[6]=>
|
||
string(1) "c"
|
||
[7]=>
|
||
string(1) "d"
|
||
}
|
||
</pre></div>
|
||
</div>
|
||
<div class="example-contents"><p>
|
||
可以看到最后一个值 <em>"d"</em> 被自动赋予了键名
|
||
<em>7</em>。这是由于之前最大的整数键名是 <em>6</em>。
|
||
</p></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="sect3" id="language.types.array.syntax.accessing">
|
||
<h4 class="title">用方括号语法访问数组单元</h4>
|
||
|
||
<p class="para">
|
||
数组单元可以通过 <em>array[key]</em> 语法来访问。
|
||
</p>
|
||
|
||
<div class="example" id="example-76">
|
||
<p><strong>Example #6 访问数组单元</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$array </span><span style="color: #007700">= array(<br /> </span><span style="color: #DD0000">"foo" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">42 </span><span style="color: #007700">=> </span><span style="color: #0000BB">24</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"multi" </span><span style="color: #007700">=> array(<br /> </span><span style="color: #DD0000">"dimensional" </span><span style="color: #007700">=> array(<br /> </span><span style="color: #DD0000">"array" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"foo"<br /> </span><span style="color: #007700">)<br /> )<br />);<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"foo"</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">42</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"multi"</span><span style="color: #007700">][</span><span style="color: #DD0000">"dimensional"</span><span style="color: #007700">][</span><span style="color: #DD0000">"array"</span><span style="color: #007700">]);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
string(3) "bar"
|
||
int(24)
|
||
string(3) "foo"
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
方括号和花括号可以互换使用来访问数组单元(例如 $array[42]
|
||
和 $array{42} 在上例中效果相同)。
|
||
</p>
|
||
</p></blockquote>
|
||
|
||
<p class="para">
|
||
自 PHP 5.4 起可以用直接对函数或方法调用的结果进行数组解引用,在此之前只能通过一个临时变量。
|
||
</p>
|
||
|
||
<p class="para">
|
||
自 PHP 5.5 起可以直接对一个数组原型进行数组解引用。
|
||
</p>
|
||
|
||
<div class="example" id="example-77">
|
||
<p><strong>Example #7 数组解引用</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">getArray</span><span style="color: #007700">() {<br /> return array(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">// on PHP 5.4<br /></span><span style="color: #0000BB">$secondElement </span><span style="color: #007700">= </span><span style="color: #0000BB">getArray</span><span style="color: #007700">()[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">// previously<br /></span><span style="color: #0000BB">$tmp </span><span style="color: #007700">= </span><span style="color: #0000BB">getArray</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$secondElement </span><span style="color: #007700">= </span><span style="color: #0000BB">$tmp</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">// or<br /></span><span style="color: #007700">list(, </span><span style="color: #0000BB">$secondElement</span><span style="color: #007700">) = </span><span style="color: #0000BB">getArray</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致
|
||
<strong><code>E_NOTICE</code></strong> 级别错误信息,其结果为 <strong><code>NULL</code></strong>。
|
||
</p>
|
||
</p></blockquote>
|
||
</div>
|
||
|
||
<div class="sect3" id="language.types.array.syntax.modifying">
|
||
<h4 class="title">用方括号的语法新建/修改</h4>
|
||
|
||
<p class="para">
|
||
可以通过明示地设定其中的值来修改一个已有数组。
|
||
</p>
|
||
|
||
<p class="para">
|
||
这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号(<em>[]</em>)。
|
||
</p>
|
||
|
||
<pre class="synopsis">
|
||
$arr[<span class="replaceable">key</span>] = <span class="replaceable">value</span>;
|
||
$arr[] = <span class="replaceable">value</span>;
|
||
// <span class="replaceable">key</span> 可以是 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span> 或 <span class="type"><a href="language.types.string.html" class="type string">string</a></span>
|
||
// <span class="replaceable">value</span> 可以是任意类型的值</pre>
|
||
|
||
<p class="para">
|
||
如果 <var class="varname"><var class="varname">$arr</var></var>
|
||
还不存在,将会新建一个,这也是另一种新建数组的方法。不过并不鼓励这样做,因为如果
|
||
<var class="varname"><var class="varname">$arr</var></var> 已经包含有值(例如来自请求变量的 <span class="type"><a href="language.types.string.html" class="type string">string</a></span>)则此值会保留而
|
||
<em>[]</em> 实际上代表着<a href="language.types.string.html#language.types.string.substr" class="link">字符串访问运算符</a>。初始化变量的最好方式是直接给其赋值。。
|
||
</p>
|
||
|
||
<p class="para">
|
||
要修改某个值,通过其键名给该单元赋一个新值。要删除某键值对,对其调用
|
||
<span class="function"><a href="unset.html" class="function">unset()</a></span> 函数。
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$arr </span><span style="color: #007700">= array(</span><span style="color: #0000BB">5 </span><span style="color: #007700">=> </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">12 </span><span style="color: #007700">=> </span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$arr</span><span style="color: #007700">[] = </span><span style="color: #0000BB">56</span><span style="color: #007700">; </span><span style="color: #FF8000">// This is the same as $arr[13] = 56;<br /> // at this point of the script<br /><br /></span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">"x"</span><span style="color: #007700">] = </span><span style="color: #0000BB">42</span><span style="color: #007700">; </span><span style="color: #FF8000">// This adds a new element to<br /> // the array with key "x"<br /> <br /></span><span style="color: #007700">unset(</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">5</span><span style="color: #007700">]); </span><span style="color: #FF8000">// This removes the element from the array<br /><br /></span><span style="color: #007700">unset(</span><span style="color: #0000BB">$arr</span><span style="color: #007700">); </span><span style="color: #FF8000">// This deletes the whole array<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
如上所述,如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上
|
||
1(但是最小为 0)。如果当前还没有整数索引,则键名将为
|
||
<em>0</em>。
|
||
</p>
|
||
|
||
<p class="para">
|
||
注意这里所使用的最大整数键名<em class="emphasis">不一定</em>当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// 创建一个简单的数组<br /></span><span style="color: #0000BB">$array </span><span style="color: #007700">= array(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 现在删除其中的所有元素,但保持数组本身不变:<br /></span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as </span><span style="color: #0000BB">$i </span><span style="color: #007700">=> </span><span style="color: #0000BB">$value</span><span style="color: #007700">) {<br /> unset(</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">]);<br />}<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[] = </span><span style="color: #0000BB">6</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 重新索引:<br /></span><span style="color: #0000BB">$array </span><span style="color: #007700">= </span><span style="color: #0000BB">array_values</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[] = </span><span style="color: #0000BB">7</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<p class="para">以上例程会输出:</p>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
Array
|
||
(
|
||
[0] => 1
|
||
[1] => 2
|
||
[2] => 3
|
||
[3] => 4
|
||
[4] => 5
|
||
)
|
||
Array
|
||
(
|
||
)
|
||
Array
|
||
(
|
||
[5] => 6
|
||
)
|
||
Array
|
||
(
|
||
[0] => 6
|
||
[1] => 7
|
||
)
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
</p></blockquote>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.array.useful-funcs">
|
||
<h3 class="title">实用函数</h3>
|
||
|
||
<p class="para">
|
||
有很多操作数组的函数,参见<a href="ref.array.html" class="link">数组函数</a>一节。
|
||
</p>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<p class="para">
|
||
<span class="function"><a href="unset.html" class="function">unset()</a></span> 函数允许删除数组中的某个键。但要注意数组将<em class="emphasis">不会</em>重建索引。如果需要删除后重建索引,可以用
|
||
<span class="function"><a href="array_values.html" class="function">array_values()</a></span> 函数。
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$a </span><span style="color: #007700">= array(</span><span style="color: #0000BB">1 </span><span style="color: #007700">=> </span><span style="color: #DD0000">'one'</span><span style="color: #007700">, </span><span style="color: #0000BB">2 </span><span style="color: #007700">=> </span><span style="color: #DD0000">'two'</span><span style="color: #007700">, </span><span style="color: #0000BB">3 </span><span style="color: #007700">=> </span><span style="color: #DD0000">'three'</span><span style="color: #007700">);<br />unset(</span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">]);<br /></span><span style="color: #FF8000">/* will produce an array that would have been defined as<br /> $a = array(1 => 'one', 3 => 'three');<br /> and NOT<br /> $a = array(1 => 'one', 2 =>'three');<br />*/<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">array_values</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Now $b is array(0 => 'one', 1 =>'three')<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
</p></blockquote>
|
||
|
||
<p class="para">
|
||
<a href="control-structures.foreach.html" class="link">foreach</a> 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.array.donts">
|
||
<h3 class="title">数组做什么和不做什么</h3>
|
||
|
||
<div class="sect3" id="language.types.array.foo-bar">
|
||
<h4 class="title">为什么 <em>$foo[bar]</em> 错了?</h4>
|
||
|
||
<p class="para">
|
||
应该始终在用字符串表示的数组索引上加上引号。例如用
|
||
<em>$foo['bar']</em> 而不是 <em>$foo[bar]</em>。但是为什么呢?可能在老的脚本中见过如下语法:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$foo</span><span style="color: #007700">[</span><span style="color: #0000BB">bar</span><span style="color: #007700">] = </span><span style="color: #DD0000">'enemy'</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$foo</span><span style="color: #007700">[</span><span style="color: #0000BB">bar</span><span style="color: #007700">];<br /></span><span style="color: #FF8000">// etc<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而
|
||
PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为
|
||
PHP 自动将<em class="emphasis">裸字符串</em>(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为
|
||
<strong><code>bar</code></strong>,PHP 将把它替代为 <em>'bar'</em> 并使用之。
|
||
</p>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<span class="simpara">
|
||
这并不意味着<em class="emphasis">总是</em>给键名加上引号。用不着给键名为<a href="language.constants.html" class="link">常量</a>或<a href="language.variables.html" class="link">变量</a>的加上引号,否则会使 PHP
|
||
不能解析它们。
|
||
</span>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">E_ALL</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'display_errors'</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'html_errors'</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Simple array:<br /></span><span style="color: #0000BB">$array </span><span style="color: #007700">= array(</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br />for (</span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">< </span><span style="color: #0000BB">$count</span><span style="color: #007700">; </span><span style="color: #0000BB">$i</span><span style="color: #007700">++) {<br /> echo </span><span style="color: #DD0000">"\nChecking </span><span style="color: #0000BB">$i</span><span style="color: #DD0000">: \n"</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"Bad: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">'$i'</span><span style="color: #007700">] . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"Good: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"Bad: </span><span style="color: #007700">{</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">'$i'</span><span style="color: #007700">]}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /> echo </span><span style="color: #DD0000">"Good: </span><span style="color: #007700">{</span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">]}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
<p class="para">以上例程会输出:</p>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
Checking 0:
|
||
Notice: Undefined index: $i in /path/to/script.html on line 9
|
||
Bad:
|
||
Good: 1
|
||
Notice: Undefined index: $i in /path/to/script.html on line 11
|
||
Bad:
|
||
Good: 1
|
||
|
||
Checking 1:
|
||
Notice: Undefined index: $i in /path/to/script.html on line 9
|
||
Bad:
|
||
Good: 2
|
||
Notice: Undefined index: $i in /path/to/script.html on line 11
|
||
Bad:
|
||
Good: 2
|
||
</pre></div>
|
||
</div>
|
||
</p></blockquote>
|
||
|
||
<p class="para">
|
||
演示此行为的更多例子:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Show all errors<br /></span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">(</span><span style="color: #0000BB">E_ALL</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$arr </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'fruit' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'apple'</span><span style="color: #007700">, </span><span style="color: #DD0000">'veggie' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'carrot'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Correct<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'fruit'</span><span style="color: #007700">]; </span><span style="color: #FF8000">// apple<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'veggie'</span><span style="color: #007700">]; </span><span style="color: #FF8000">// carrot<br /><br />// Incorrect. This works but also throws a PHP error of level E_NOTICE because<br />// of an undefined constant named fruit<br />// <br />// Notice: Use of undefined constant fruit - assumed 'fruit' in...<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">fruit</span><span style="color: #007700">]; </span><span style="color: #FF8000">// apple<br /><br />// This defines a constant to demonstrate what's going on. The value 'veggie'<br />// is assigned to a constant named fruit.<br /></span><span style="color: #0000BB">define</span><span style="color: #007700">(</span><span style="color: #DD0000">'fruit'</span><span style="color: #007700">, </span><span style="color: #DD0000">'veggie'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Notice the difference now<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'fruit'</span><span style="color: #007700">]; </span><span style="color: #FF8000">// apple<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">fruit</span><span style="color: #007700">]; </span><span style="color: #FF8000">// carrot<br /><br />// The following is okay, as it's inside a string. Constants are not looked for<br />// within strings, so no E_NOTICE occurs here<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">"Hello </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">fruit</span><span style="color: #007700">]</span><span style="color: #DD0000">"</span><span style="color: #007700">; </span><span style="color: #FF8000">// Hello apple<br /><br />// With one exception: braces surrounding arrays within strings allows constants<br />// to be interpreted<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">"Hello </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">fruit</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">; </span><span style="color: #FF8000">// Hello carrot<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">"Hello </span><span style="color: #007700">{</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'fruit'</span><span style="color: #007700">]}</span><span style="color: #DD0000">"</span><span style="color: #007700">; </span><span style="color: #FF8000">// Hello apple<br /><br />// This will not work, and will result in a parse error, such as:<br />// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'<br />// This of course applies to using superglobals in strings as well<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">"Hello </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'fruit']"</span><span style="color: #007700">;<br />print </span><span style="color: #DD0000">"Hello </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'foo']"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Concatenation is another option<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">"Hello " </span><span style="color: #007700">. </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #DD0000">'fruit'</span><span style="color: #007700">]; </span><span style="color: #FF8000">// Hello apple<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
当打开 <a href="errorfunc.configuration.html#ini.error-reporting" class="link">error_reporting</a> 来显示
|
||
<strong><code>E_NOTICE</code></strong> 级别的错误(将其设为
|
||
<strong><code>E_ALL</code></strong>)时将看到这些错误。默认情况下
|
||
<a href="errorfunc.configuration.html#ini.error-reporting" class="link">error_reporting</a>
|
||
被关闭不显示这些。
|
||
</p>
|
||
|
||
<p class="para">
|
||
和在<a href="language.types.array.html#language.types.array.syntax" class="link">语法</a>一节中规定的一样,在方括号(“<em>[</em>”和“<em>]</em>”)之间必须有一个表达式。这意味着可以这样写:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">somefunc</span><span style="color: #007700">(</span><span style="color: #0000BB">$bar</span><span style="color: #007700">)];<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
这是一个用函数返回值作为数组索引的例子。PHP 也可以用已知常量,可能之前已经见过:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$error_descriptions</span><span style="color: #007700">[</span><span style="color: #0000BB">E_ERROR</span><span style="color: #007700">] = </span><span style="color: #DD0000">"A fatal error has occured"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$error_descriptions</span><span style="color: #007700">[</span><span style="color: #0000BB">E_WARNING</span><span style="color: #007700">] = </span><span style="color: #DD0000">"PHP issued a warning"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$error_descriptions</span><span style="color: #007700">[</span><span style="color: #0000BB">E_NOTICE</span><span style="color: #007700">] = </span><span style="color: #DD0000">"This is just an informal notice"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
注意 <em>E_ERROR</em> 也是个合法的标识符,就和第一个例子中的
|
||
<em>bar</em> 一样。但是上一个例子实际上和如下写法是一样的:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$error_descriptions</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #DD0000">"A fatal error has occured"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$error_descriptions</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">] = </span><span style="color: #DD0000">"PHP issued a warning"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$error_descriptions</span><span style="color: #007700">[</span><span style="color: #0000BB">8</span><span style="color: #007700">] = </span><span style="color: #DD0000">"This is just an informal notice"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
因为 <em>E_ERROR</em> 等于 <em>1</em>,等等。
|
||
</p>
|
||
|
||
<div class="sect4" id="language.types.array.foo-bar.why">
|
||
<h5 class="title">那么为什么这样做不好?</h5>
|
||
|
||
<p class="para">
|
||
也许有一天,PHP 开发小组可能会想新增一个常量或者关键字,或者用户可能希望以后在自己的程序中引入新的常量,那就有麻烦了。例如已经不能这样用
|
||
<em>empty</em> 和 <em>default</em> 这两个词了,因为他们是<a href="reserved.html" class="link">保留字</a>。
|
||
</p>
|
||
|
||
<blockquote class="note"><p><strong class="note">Note</strong>:
|
||
<span class="simpara">
|
||
重申一次,在双引号字符串中,不给索引加上引号是合法的因此
|
||
<em>"$foo[bar]"</em>
|
||
是合法的(“合法”的原文为 valid。在实际测试中,这么做确实可以访问数组的该元素,但是会报一个常量未定义的
|
||
notice。无论如何,强烈建议不要使用 $foo[bar]这样的写法,而要使用 $foo['bar']
|
||
来访问数组中元素。--haohappy 注)。至于为什么参见以上的例子和<a href="language.types.string.html#language.types.string.parsing" class="link">字符串中的变量解析</a>中的解释。
|
||
</span>
|
||
</p></blockquote>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.array.casting">
|
||
<h3 class="title">转换为数组</h3>
|
||
|
||
<p class="para">
|
||
对于任意 <span class="type"><a href="language.types.integer.html" class="type integer">integer</a></span>,<span class="type"><a href="language.types.float.html" class="type float">float</a></span>,<span class="type"><a href="language.types.string.html" class="type string">string</a></span>,<span class="type"><a href="language.types.boolean.html" class="type boolean">boolean</a></span>
|
||
和 <span class="type"><a href="language.types.resource.html" class="type resource">resource</a></span> 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为
|
||
0,该元素即为此标量的值。换句话说,<em>(array)$scalarValue</em> 与
|
||
<em>array($scalarValue)</em> 完全一样。
|
||
</p>
|
||
|
||
<p class="para">
|
||
如果一个 <span class="type"><a href="language.types.object.html" class="type object">object</a></span> 类型转换为
|
||
<span class="type"><a href="language.types.array.html" class="type array">array</a></span>,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个
|
||
'*' 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$A</span><span style="color: #007700">; </span><span style="color: #FF8000">// This will become '\0A\0A'<br /></span><span style="color: #007700">}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$A</span><span style="color: #007700">; </span><span style="color: #FF8000">// This will become '\0B\0A'<br /> </span><span style="color: #007700">public </span><span style="color: #0000BB">$AA</span><span style="color: #007700">; </span><span style="color: #FF8000">// This will become 'AA'<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">((array) new </span><span style="color: #0000BB">B</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
上例会有两个键名为 'AA',不过其中一个实际上是 '\0A\0A'。
|
||
</p>
|
||
|
||
<p class="para">
|
||
将 <strong><code>NULL</code></strong> 转换为 <span class="type"><a href="language.types.array.html" class="type array">array</a></span> 会得到一个空的数组。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.array.comparing">
|
||
<h3 class="title">比较</h3>
|
||
|
||
<p class="para">
|
||
可以用 <span class="function"><a href="array_diff.html" class="function">array_diff()</a></span> 和<a href="language.operators.array.html" class="link">数组运算符</a>来比较数组。
|
||
</p>
|
||
</div>
|
||
|
||
<div class="sect2" id="language.types.array.examples">
|
||
<h3 class="title">示例</h3>
|
||
|
||
<p class="para">
|
||
PHP 中的数组类型有非常多的用途。以下是一些示例:
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// This:<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= array( </span><span style="color: #DD0000">'color' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'red'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'taste' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'sweet'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'shape' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'round'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'name' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'apple'</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">4 </span><span style="color: #FF8000">// key will be 0<br /> </span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'a'</span><span style="color: #007700">, </span><span style="color: #DD0000">'b'</span><span style="color: #007700">, </span><span style="color: #DD0000">'c'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// . . .is completely equivalent with this:<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= array();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #DD0000">'color'</span><span style="color: #007700">] = </span><span style="color: #DD0000">'red'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #DD0000">'taste'</span><span style="color: #007700">] = </span><span style="color: #DD0000">'sweet'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #DD0000">'shape'</span><span style="color: #007700">] = </span><span style="color: #DD0000">'round'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">] = </span><span style="color: #DD0000">'apple'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">[] = </span><span style="color: #0000BB">4</span><span style="color: #007700">; </span><span style="color: #FF8000">// key will be 0<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= array();<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">[] = </span><span style="color: #DD0000">'a'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">[] = </span><span style="color: #DD0000">'b'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">[] = </span><span style="color: #DD0000">'c'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// After the above code is executed, $a will be the array<br />// array('color' => 'red', 'taste' => 'sweet', 'shape' => 'round', <br />// 'name' => 'apple', 0 => 4), and $b will be the array <br />// array(0 => 'a', 1 => 'b', 2 => 'c'), or simply array('a', 'b', 'c').<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="example" id="example-78">
|
||
<p><strong>Example #8 使用 array()</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Array as (property-)map<br /></span><span style="color: #0000BB">$map </span><span style="color: #007700">= array( </span><span style="color: #DD0000">'version' </span><span style="color: #007700">=> </span><span style="color: #0000BB">4</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'OS' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'Linux'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'lang' </span><span style="color: #007700">=> </span><span style="color: #DD0000">'english'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">'short_tags' </span><span style="color: #007700">=> </span><span style="color: #0000BB">true<br /> </span><span style="color: #007700">);<br /> <br /></span><span style="color: #FF8000">// strictly numerical keys<br /></span><span style="color: #0000BB">$array </span><span style="color: #007700">= array( </span><span style="color: #0000BB">7</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">8</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">0</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">156</span><span style="color: #007700">,<br /> -</span><span style="color: #0000BB">10<br /> </span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// this is the same as array(0 => 7, 1 => 8, ...)<br /><br /></span><span style="color: #0000BB">$switching </span><span style="color: #007700">= array( </span><span style="color: #0000BB">10</span><span style="color: #007700">, </span><span style="color: #FF8000">// key = 0<br /> </span><span style="color: #0000BB">5 </span><span style="color: #007700">=> </span><span style="color: #0000BB">6</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">3 </span><span style="color: #007700">=> </span><span style="color: #0000BB">7</span><span style="color: #007700">, <br /> </span><span style="color: #DD0000">'a' </span><span style="color: #007700">=> </span><span style="color: #0000BB">4</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">11</span><span style="color: #007700">, </span><span style="color: #FF8000">// key = 6 (maximum of integer-indices was 5)<br /> </span><span style="color: #DD0000">'8' </span><span style="color: #007700">=> </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #FF8000">// key = 8 (integer!)<br /> </span><span style="color: #DD0000">'02' </span><span style="color: #007700">=> </span><span style="color: #0000BB">77</span><span style="color: #007700">, </span><span style="color: #FF8000">// key = '02'<br /> </span><span style="color: #0000BB">0 </span><span style="color: #007700">=> </span><span style="color: #0000BB">12 </span><span style="color: #FF8000">// the value 10 will be overwritten by 12<br /> </span><span style="color: #007700">);<br /> <br /></span><span style="color: #FF8000">// empty array<br /></span><span style="color: #0000BB">$empty </span><span style="color: #007700">= array(); <br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="example" id="example-79">
|
||
<p><strong>Example #9 集合</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$colors </span><span style="color: #007700">= array(</span><span style="color: #DD0000">'red'</span><span style="color: #007700">, </span><span style="color: #DD0000">'blue'</span><span style="color: #007700">, </span><span style="color: #DD0000">'green'</span><span style="color: #007700">, </span><span style="color: #DD0000">'yellow'</span><span style="color: #007700">);<br /><br />foreach (</span><span style="color: #0000BB">$colors </span><span style="color: #007700">as </span><span style="color: #0000BB">$color</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"Do you like </span><span style="color: #0000BB">$color</span><span style="color: #DD0000">?\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
Do you like red?
|
||
Do you like blue?
|
||
Do you like green?
|
||
Do you like yellow?
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<p class="para">
|
||
直接改变数组的值自 PHP 5 起可以通过引用传递来做到。之前的版本需要需要采取变通的方法:
|
||
</p>
|
||
|
||
<div class="example" id="example-80">
|
||
<p><strong>Example #10 在循环中改变单元</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// PHP 5<br /></span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$colors </span><span style="color: #007700">as &</span><span style="color: #0000BB">$color</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$color </span><span style="color: #007700">= </span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(</span><span style="color: #0000BB">$color</span><span style="color: #007700">);<br />}<br />unset(</span><span style="color: #0000BB">$color</span><span style="color: #007700">); </span><span style="color: #FF8000">/* ensure that following writes to<br />$color will not modify the last array element */<br /><br />// Workaround for older versions<br /></span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$colors </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=> </span><span style="color: #0000BB">$color</span><span style="color: #007700">) {<br /> </span><span style="color: #0000BB">$colors</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">] = </span><span style="color: #0000BB">strtoupper</span><span style="color: #007700">(</span><span style="color: #0000BB">$color</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$colors</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
Array
|
||
(
|
||
[0] => RED
|
||
[1] => BLUE
|
||
[2] => GREEN
|
||
[3] => YELLOW
|
||
)
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<p class="para">
|
||
本例生成一个下标从 1 开始的数组。
|
||
</p>
|
||
|
||
<div class="example" id="example-81">
|
||
<p><strong>Example #11 下标从 1 开始的数组</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$firstquarter </span><span style="color: #007700">= array(</span><span style="color: #0000BB">1 </span><span style="color: #007700">=> </span><span style="color: #DD0000">'January'</span><span style="color: #007700">, </span><span style="color: #DD0000">'February'</span><span style="color: #007700">, </span><span style="color: #DD0000">'March'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$firstquarter</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
<div class="example-contents"><p>以上例程会输出:</p></div>
|
||
<div class="example-contents screen">
|
||
<div class="cdata"><pre>
|
||
Array
|
||
(
|
||
[1] => 'January'
|
||
[2] => 'February'
|
||
[3] => 'March'
|
||
)
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="example" id="example-82">
|
||
<p><strong>Example #12 填充数组</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// fill an array with all items from a directory<br /></span><span style="color: #0000BB">$handle </span><span style="color: #007700">= </span><span style="color: #0000BB">opendir</span><span style="color: #007700">(</span><span style="color: #DD0000">'.'</span><span style="color: #007700">);<br />while (</span><span style="color: #0000BB">false </span><span style="color: #007700">!== (</span><span style="color: #0000BB">$file </span><span style="color: #007700">= </span><span style="color: #0000BB">readdir</span><span style="color: #007700">(</span><span style="color: #0000BB">$handle</span><span style="color: #007700">))) {<br /> </span><span style="color: #0000BB">$files</span><span style="color: #007700">[] = </span><span style="color: #0000BB">$file</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">closedir</span><span style="color: #007700">(</span><span style="color: #0000BB">$handle</span><span style="color: #007700">); <br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
数组是有序的。也可以使用不同的排序函数来改变顺序。更多信息参见<a href="ref.array.html" class="link">数组函数</a>。可以用
|
||
<span class="function"><a href="count.html" class="function">count()</a></span> 函数来数出数组中元素的个数。
|
||
</p>
|
||
|
||
<div class="example" id="example-83">
|
||
<p><strong>Example #13 数组排序</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />sort</span><span style="color: #007700">(</span><span style="color: #0000BB">$files</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$files</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
因为数组中的值可以为任意值,也可是另一个数组。这样可以产生递归或多维数组。
|
||
</p>
|
||
|
||
<div class="example" id="example-84">
|
||
<p><strong>Example #14 递归和多维数组</strong></p>
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$fruits </span><span style="color: #007700">= array ( </span><span style="color: #DD0000">"fruits" </span><span style="color: #007700">=> array ( </span><span style="color: #DD0000">"a" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"orange"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"b" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"banana"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"c" </span><span style="color: #007700">=> </span><span style="color: #DD0000">"apple"<br /> </span><span style="color: #007700">),<br /> </span><span style="color: #DD0000">"numbers" </span><span style="color: #007700">=> array ( </span><span style="color: #0000BB">1</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">2</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">3</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">4</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">5</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">6<br /> </span><span style="color: #007700">),<br /> </span><span style="color: #DD0000">"holes" </span><span style="color: #007700">=> array ( </span><span style="color: #DD0000">"first"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">5 </span><span style="color: #007700">=> </span><span style="color: #DD0000">"second"</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"third"<br /> </span><span style="color: #007700">)<br /> );<br /><br /></span><span style="color: #FF8000">// Some examples to address values in the array above <br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$fruits</span><span style="color: #007700">[</span><span style="color: #DD0000">"holes"</span><span style="color: #007700">][</span><span style="color: #0000BB">5</span><span style="color: #007700">]; </span><span style="color: #FF8000">// prints "second"<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$fruits</span><span style="color: #007700">[</span><span style="color: #DD0000">"fruits"</span><span style="color: #007700">][</span><span style="color: #DD0000">"a"</span><span style="color: #007700">]; </span><span style="color: #FF8000">// prints "orange"<br /></span><span style="color: #007700">unset(</span><span style="color: #0000BB">$fruits</span><span style="color: #007700">[</span><span style="color: #DD0000">"holes"</span><span style="color: #007700">][</span><span style="color: #0000BB">0</span><span style="color: #007700">]); </span><span style="color: #FF8000">// remove "first"<br /><br />// Create a new multi-dimensional array<br /></span><span style="color: #0000BB">$juices</span><span style="color: #007700">[</span><span style="color: #DD0000">"apple"</span><span style="color: #007700">][</span><span style="color: #DD0000">"green"</span><span style="color: #007700">] = </span><span style="color: #DD0000">"good"</span><span style="color: #007700">; <br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<p class="para">
|
||
<span class="type"><span class="type 数组(Array)">数组(Array)</span></span> 的赋值总是会涉及到值的拷贝。使用<a href="language.operators.html" class="link">引用运算符</a>通过引用来拷贝数组。
|
||
</p>
|
||
|
||
<div class="informalexample">
|
||
<div class="example-contents">
|
||
<div class="phpcode"><code><span style="color: #000000">
|
||
<span style="color: #0000BB"><?php<br />$arr1 </span><span style="color: #007700">= array(</span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$arr2 </span><span style="color: #007700">= </span><span style="color: #0000BB">$arr1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$arr2</span><span style="color: #007700">[] = </span><span style="color: #0000BB">4</span><span style="color: #007700">; </span><span style="color: #FF8000">// $arr2 is changed,<br /> // $arr1 is still array(2, 3)<br /> <br /></span><span style="color: #0000BB">$arr3 </span><span style="color: #007700">= &</span><span style="color: #0000BB">$arr1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$arr3</span><span style="color: #007700">[] = </span><span style="color: #0000BB">4</span><span style="color: #007700">; </span><span style="color: #FF8000">// now $arr1 and $arr3 are the same<br /></span><span style="color: #0000BB">?></span>
|
||
</span>
|
||
</code></div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div></div></div></body></html> |