6.8 遍历数组

6.8 遍历数组

通常需要遍历数组并获得各个键或值(或者同时取得键和值),所以毫不奇怪,PHP为此提供了一些函数.许多函数能完成两项任务,不仅能获取当前指针位置的键或值,还能将指针移向下一个适当的位置.本节将介绍这些函数.

/*********************************************
* PHPfans系列教程:
* http://www.phpfans.net/bbs/forumdisplay.php?fid=25
* 作 者: 我不是鱼
* Email:[email protected]
* 博 客:  http://www.phpfans.net/space/?2
*********************************************/

先来介绍一下遍历数组要用到的几个函数

count ( mixed var [, int mode] )
(PHP 3, PHP 4, PHP 5)
计算数组中的单元数目或对象中的属性个数,返回 var 中的单元数目,通常是一个 array,任何其它类型都只有一个单元.

注: 可选的 mode 参数自 PHP 4.2.0 起可用.
如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数.对计算多维数组的所有单元尤其有用.mode 的默认值是 0.count() 识别不了无限递归.

示例:

[复制到剪切板]
CODE:
<?php 
$arr 
= array('phpfans','php','MySQL','javascript','html','css');
echo 
"数组长度:".count($arr);
?> ;


输出:
数组长度:6
示例:带参数mode

[复制到剪切板]
CODE:
<?php 
//PHPfans站系列教程:
//http://www.phpfans.net/bbs/forumdisplay.php?fid=25
$arr = array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

$array[] = 'phpfans';
$array[] = $arr;//数组的值又是一个数组
$array[] = 'MySQL';
$array[] = 'javascript';
$array[] = 'html';
$array[] = 'css';

echo 
"不递归:".count($array)."\n";
echo 
"递归:".count($array,COUNT_RECURSIVE);
?> ;


输出:
不递归:6
递归:10
还有提一提的是 sizeof() 是 count() 的别名,说点题外话,有一次我去面试,那个主管和我说count不是获得数组的长度而是 sizeof .
我和他说 sizeof 只是 count 的别名. 真是服了.

好了,我们随即来利用count来遍历一下数组
示例:

[复制到剪切板]
CODE:
<?php 
$arr 
= array('phpfans','php','MySQL','javascript','html','css');

for(
$i=0;$i<count($arr);$i++){//一定要记得数组索引是从0开始的
    
echo "第".$i."个元素是:".$arr[$i]."\n";
}
?> ;


输出:
第0个元素是:phpfans
第1个元素是:php
第2个元素是:MySQL
第3个元素是:javascript
第4个元素是:html
第5个元素是:css
很显然这种遍历只能适用与数字索引,并且是规则的数字索引
那么想字符索引那些如何遍历呢,下面将作介绍

利用 current next 遍历数组
示例:

[复制到剪切板]
CODE:
<?php 
$arr 
= array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

while(
$value current($arr)){
    echo 
$value."\n";
    
next($arr);
}
?> ;


输出:
www.phpfans.net
www.php.net
www.mysql.com
www.apache.org
另一种写法

[复制到剪切板]
CODE:
<?php 
$arr 
= array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

while(
1){//while循环会在控制语句那章说到
    
echo key($arr).'=>'.current($arr)."\n";
    if(!
next($arr)) break;
}
?> ;


输出:
phpfans=>www.phpfans.net
php=>www.php.net
mysql=>www.mysql.com
apache=>www.apache.org
利用 list() 和 each() 遍历数组

each()函数返回input_array的当前键/值对,并将指针推进一个位置.返回的数组包含四个键,键0和key包含键名,而键1和value包含相应的数据.如果执行each()前指针位于数组末尾,则返回FALSE.

list()

list()函数与array()类似,只是它可以在一次操作中从一个数组内提取多个值,同时为多个变量赋值.从数据库或文件中提取信息时,这种构造尤其有用.

示例:

[复制到剪切板]
CODE:
<?php
$arr 
= array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

while (list(
$key$val) = each($arr)) {
    echo 
"$key => $val\n";
}
?> ;


输出:
phpfans => www.phpfans.net
php => www.php.net
mysql => www.mysql.com
apache => www.apache.org
好了,我们最常用的遍历数组的函数是foreach
foreach 控制结构是专门用于数组的.它提供了一个简单的方法来遍历数组.

foreach仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误.有两种语法,第二种比较次要但却是第一种的有用的扩展.
foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement
第一种格式遍历给定的 array_expression 数组.每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元).

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key.

自PHP 5 起,还可能遍历对象.

示例:

[复制到剪切板]
CODE:
<?php 
$arr 
= array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

foreach(
$arr as $value){
   echo 
$value."\n";
}
?> ;


输出:
www.phpfans.net
www.php.net
www.mysql.com
www.apache.org
示例:

[复制到剪切板]
CODE:
<?php 
$arr 
= array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

foreach(
$arr as $key => $value){
   echo 
$key."=>".$value."\n";
}
?> ;


输出:
phpfans=>www.phpfans.net
php=>www.php.net
mysql=>www.mysql.com
apache=>www.apache.org
多围数组遍历
学习之前先学习一个函数is_array(),这是个变量函数,变量那章会说到.

is_array ( mixed var )
(PHP 3, PHP 4, PHP 5)
检测变量是否是数组
如果 var 是 array,则返回 TRUE,否则返回 FALSE.

好了现在来遍历多维数组
示例:

[复制到剪切板]
CODE:
<?php 
$arr 
= array(
   
'phpfans' => 'www.phpfans.net',
   
'php' => 'www.php.net',
   
'mysql' => 'www.mysql.com',
   
'apache' => 'www.apache.org'
);

$array[] = 'phpfans';
$array[] = $arr;//数组的值又是一个数组
$array[] = 'MySQL';
$array[] = 'javascript';
$array[] = 'html';
$array[] = 'css';

foreach(
$array as $value){
    if(
is_array($value)){
        foreach(
$value as $val){
            echo 
"  ".$val."\n";
        }
    }
    else echo 
$value."\n";
}
?> ;


输出:
phpfans
  www.phpfans.net
  www.php.net
  www.mysql.com
  www.apache.org
MySQL
javascript
html
css
好了,有人或者会疑问,这只适用二维数组,对多维或不预知围数的数组进行遍历
好了下面用递归的方法遍历多维数组,递归将在函数那章说到.不过函数那章的教程还没有完成.

示例:

[复制到剪切板]
CODE:
<?php 
$array
[0] = 'php';
$array[1]['phpfans']['name'] = "php爱好者";
$array[1]['phpfans']['url'] = "www.phpfans.net";
$array[1]['apache'] = 'www.apache.org';
$array[2] = 'MySQL';
$array[3] = 'javascript';
$array[4] = 'html';
$array[5] = 'css';

function 
traversingArr($arr){
    foreach(
$arr as $value){
        if(
is_array($value)){
            
traversingArr($value);//递归调用
        
}
        else echo 
$value."\n";
    }
}

traversingArr($array);
?> ;


输出:
php
php爱好者
www.phpfans.net
www.apache.org
MySQL
javascript
html
css
如履薄冰

很重要

说的很详细,.....顶

说的很好.谢谢楼主.