foreach 数组用法和实例

PHP4 引入了 foreach 结构,与 Perl 以及其他语言很像,它是一种遍历数组的简便方法。

foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。

foreach 有两种语法:

语法1:

foreach (array_expression as $value)
    statement

语法2:
foreach (array_expression as $key => $value)
    statement

第一种语法格式,遍历给定的 array_expression 数组。每次循环中,当前元素的值被赋给 $value 并且数组内部的指针向后移一步(因此下一次循环中将会得到下一个单元)。

第二种语法格式,做同样的事,只是除了当前元素的值被赋给 $value 外,它的键名也会在每次循环中被赋给变量 $key。第二种语法格式比较次要但却是第一种的有用扩展。

 

第一种语法格式

先来看第一个语句,这个语句比较简单,array_expression指的是一个数组表达式,as $val语句将顺序取得该数组的值并保存到$val变量中,此种方法只能取得数组内的值,而不能取得数组的下标索引值$key

代码示例:

$mimvp_array = array('blog'=>'blog.mimvp.com', 'proxy'=>'proxy.mimvp.com', 
					 'forum'=>'forum.mimvp.com', 'apprank'=>'apprank.mimvp.com');

foreach ($mimvp_array as $value)
	print $value . "<br/>";

运行结果:

blog.mimvp.com
proxy.mimvp.com
forum.mimvp.com
apprank.mimvp.com

 

第二种语法格式

第二种格式除了能像第一种格式一样得到数组内元素的值外,还能得到元素的索引值,并保存到$key变量中。如果数组的索引值未经过人工设定,则返回系统默认的设定值。

一维数组示例:

$mimvp_array = array('blog'=>'blog.mimvp.com', 'proxy'=>'proxy.mimvp.com',
					 'forum'=>'forum.mimvp.com', 'apprank'=>'apprank.mimvp.com');

foreach ($mimvp_array as $key=>$value)
	print $key . " -> " . $value . "<br/>";

运行结果:

blog -> blog.mimvp.com
proxy -> proxy.mimvp.com
forum -> forum.mimvp.com
apprank -> apprank.mimvp.com

 

二维数组示例:

$myArray = array (
		"1" => array (
				"11" => "val_11",
				"12" => "val_12",
				"13" => "val_13" 
		),
		"2" => array (
				"21" => "val_21",
				"22" => "val_22",
				"23" => "val_23" 
		),
		"3" => array (
				"31" => "val_31",
				"32" => "val_32",
				"33" => "val_33" 
		) 
);
print ("<ul>") ;
foreach ( $myArray as $key => $val ) {
	print ("<li>" . $key . "</li>") ;
	if (is_array ( $val )) { // 判断$val的值是否是一个数组,如果是,则进入下层遍历
		print ("<ul>") ;
		foreach ( $val as $key => $val ) {
			print ("<li>" . $key . "=>" . $val . "</li>") ;
		}
		print ("</ul>") ;
	}
}
print ("</ul>") ;

运行结果:

  • 1

    • 11=>val_11
    • 12=>val_12
    • 13=>val_13
  • 2

    • 21=>val_21
    • 22=>val_22
    • 23=>val_23
  • 3

    • 31=>val_31
    • 32=>val_32
    • 33=>val_33

<ul> 和 <li>是标签,作用是显示个实心小圆点和空心小圆点。

由于上面的是一个二维数组,在第一次遍历后所得到的$val值将是一个数组,所以在第二次遍历前加了一个判断,以便进行二层数组遍历。

 

php 数组使用技巧

数组是PHP数据应用中较重要的一种方式,PHP数组函数众多,下面是学习小结。 

1. 数组定义 

数组使用 array()方式定义,可以定义空数组。

代码示例:

<?php 
    // 定义空数组
    $null_array = array();        
    
    // 定义默认下标数组
    $num_array = array(1, 3, 5, 7, 9);
    $str_array = array('blog', 'forum', 'proxy', 'apprank');
    
    // 定义带键值数组
    $mimvp_array = array('blog'=>'blog.mimvp.com', 'proxy'=>'proxy.mimvp.com', 
                         'forum'=>'forum.mimvp.com', 'apprank'=>'apprank.mimvp.com');
    
    // 定义二维数组
    $two_array = array(
        "mimvp"=>array('proxy', 'apprank'),
        'ithomer'=>array('blog', 'forum')
    );
    
    // 输出数组
    echo "null_array : " . (print_r( $null_array, True )) . "<br/>";
    echo "num_array : " . (print_r( $num_array, True )) . "<br/>";
    echo "str_array : " . (print_r( $str_array, True )) . "<br/>";
    echo "mimvp_array : " . (print_r( $mimvp_array, True )) . "<br/>";
    echo "two_array : " . (print_r( $two_array, True )) . "<br/>";
    
    // 空数组添加值
    $null_array[0] = 'blog';
    $null_array[1] = 'forum';
    array_push($null_array, 'proxy', 'domain');                // 添加到数组末尾
    array_unshift($null_array, 'apprank', 'apptop');        // 添加到数组开头
    echo "null_array : " . (print_r( $null_array, True )) . "<br/>";
?> 

运行结果:

null_array : Array ( ) 
num_array : Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 ) 
str_array : Array ( [0] => blog [1] => forum [2] => proxy [3] => apprank ) 
mimvp_array : Array ( [blog] => blog.mimvp.com [proxy] => proxy.mimvp.com [forum] => forum.mimvp.com [apprank] => apprank.mimvp.com ) 
two_array : Array ( [mimvp] => Array ( [0] => proxy [1] => apprank ) [ithomer] => Array ( [0] => blog [1] => forum ) ) 
null_array :
Array ( [0] => apprank [1] => apptop [2] => blog [3] => forum [4] => proxy [5] => domain ) 

 

2. 创建数组 

compact() 函数

将一个或多个变量(包含数组)转换为数组。当然也包含数组变量。其参数是变量的名称而非带有$全名。

相反的函数是extract()作用顾名思义就是将数组转换为单个的字符串,键值作为其字符串名称,数组值作为字符串的值。 

语法格式:

array compact ( mixed $varname [, mixed $... ] )

代码示例:

<?PHP 
    $number = '1,3,5,7,9';
    $string = 'blog.mimvp.com';
    $marray = array('proxy', 'apprank');
    
    $newArray = compact("number", "string", "marray");
    print_r($newArray);
?> 

运行结果:

Array ( [number] => 1,3,5,7,9 [string] => blog.mimvp.com [marray] => Array ( [0] => proxy [1] => apprank ) )

 

array_combine() 函数

将两个数组重组成一个数组,前一个作键,后一个做值。

语法格式:

array array_combine ( array $keys , array $values ) 

代码示例:

<?PHP 
    $number =  array(1,3,5,7,9);
    $string = array('blog', 'forum', 'proxy', 'apprank', 'domain');
    
    $newArray = array_combine($number, $string);
    print_r($newArray);
?> 

运行结果:

Array ( [1] => blog [3] => forum [5] => proxy [7] => apprank [9] => domain )

 

range() 函数

创建指定范围的数组

代码示例:

<?PHP 
    // 0为起始值,100为结束值,10为步进值(默认步进值为1)
    $number =  range(0,100,10);        
    print_r($number);
    echo "<br/><br/>";
    
    $number =  range(100, 0, 10);
    print_r($number);
    echo "<br/><br/>";
    
    $string = range("A", "G");
    print_r($string);
    echo "<br/><br/>";

    $string = range("g", "a");
    print_r($string);
    echo "<br/><br/>";
?> 

运行结果:

Array ( [0] => 0 [1] => 10 [2] => 20 [3] => 30 [4] => 40 [5] => 50 [6] => 60 [7] => 70 [8] => 80 [9] => 90 [10] => 100 ) 

Array ( [0] => 100 [1] => 90 [2] => 80 [3] => 70 [4] => 60 [5] => 50 [6] => 40 [7] => 30 [8] => 20 [9] => 10 [10] => 0 ) 

Array ( [0] => A [1] => B [2] => C [3] => D [4] => E [5] => F [6] => G ) 

Array ( [0] => g [1] => f [2] => e [3] => d [4] => c [5] => b [6] => a ) 

 

array_fill() 函数

填充数组函数

代码示例:

<?PHP 
    $number = range(1, 10);
    $fill_array = range('a', 'c');
    
    // 用一个数组批量初始化一个数组
    $filled_array = array_fill(0, 5, $fill_array);
    echo "<pre>";
    print_r($filled_array);
    echo "</pre>";
    
    // 用一个值初始化一个数组
    $keys = array('mimvp', 'ithomer');
    $fill_key_array = array_fill_keys($keys, 'testing');
    echo "<pre>";
    print_r($fill_key_array);
    echo "</pre>";
?> 

运行结果: 

Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [2] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [3] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [4] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

)
Array
(
    [mimvp] => testing
    [ithomer] => testing
)

 

3. 数组的遍历 

foreach遍历 

foreach (array_expression as $value) {} 
foreach (array_expression as
$key => $value) {} 

<?PHP 
     $speed = array(50,120,180,240,380); 
     foreach($speed as $keys=>$values){ 
          echo $keys."=>".$values."<br />"; 
     
?> 

运行结果: 

0=>50 
1=>120 
2=>180 
3=>240 
4=>380 

 

while循环遍历 

while循环遍历一般结合list函数

代码示例:

<?PHP 
    $staff = array (
                array("姓名","性别","年龄"), 
                array("小张","男",24), 
                array("小王","女",25), 
                array("小李","男",23) 
            );
    
    echo "<table border=2 width=300 style='border-collapse:collapse;'>";
    while ( list ( $keys, $value ) = each ( $staff ) ) {
        list ( $name, $sex, $age ) = $value;
        echo "<tr><td>$name</td><td>$sex</td><td>$age</td></tr>";
    }
    echo "</table>";
?> 

运行结果:

姓名 性别 年龄
小张 24
小王 25
小李 23

 

for 循环遍历 

<?PHP 
$speed = range(0,220,20); 
    for($i =0; $i<count($speed); $i++) { 
    echo $speed[$i] . " "; 

?> 

运行结果: 

0 20 40 60 80 100 120 140 160 180 200 220 

 

4. 数组的指针操作 

涉及函数包括 reset、prev、end、next、current、each

实例1:next 与 prev  

<?PHP 
    $speed = range ( 20, 220, 20 );
    print_r( $speed );
    echo "<br/>";
    
    echo current ( $speed ) . "<br/>";         // 输出当前位置的值(在数组的开头位置)
    $i = rand ( 1, 11 );
    echo "i : " . $i . "<br/>";
    
    while ( $i-- ) {
        next ( $speed );                     // 指针从当前位置向后移动一位
    }
    echo "current : " . current ( $speed ) . "<br />";     // 输出当前位置的值
    
    echo "prev : " . prev ( $speed ) . "<br />";         // 输出前一位置数组值
    echo "next : " . next ( $speed ) . "<br />";         // 输出后一位置数组值(注意:prev已前移过一次)
    
    echo "reset : " . reset ( $speed ) . "<br />";         // 重置数组的指针,将指针指向起始位置
    echo "current : " . current ( $speed ) . "<br />";     // 输出当前位置的值
    echo "end : " . end ( $speed ) . "<br />";             // 输出最后位置的数组值
?> 

运行结果: 

Array ( [0] => 20 [1] => 40 [2] => 60 [3] => 80 [4] => 100 [5] => 120 [6] => 140 [7] => 160 [8] => 180 [9] => 200 [10] => 220 ) 
20
i : 2

current : 60
prev : 40
next : 60

reset : 20
current : 20
end : 220

 

实例2:each函数指针操作  

<?PHP 
    $speed = range ( 0, 200, 40 );
    echo "each实现指针下移 <br />";
    echo "0挡的速度是" . current ( each ( $speed ) ) . "<br />";
    echo "1挡的速度是" . current ( each ( $speed ) ) . "<br />";
    echo "2挡的速度是" . current ( each ( $speed ) ) . "<br />";
    echo "3挡的速度是" . current ( each ( $speed ) ) . "<br />";
    echo "4挡的速度是" . current ( each ( $speed ) ) . "<br />";
    echo "5挡的速度是" . current ( each ( $speed ) ) . "<br />";
    
    echo "使用each函数实现数组指针的移动,进行数组遍历 <br />";
    reset ( $speed ); // 这里是将数组指针指向数组首
    while ( list ( $key, $value ) = each ( $speed ) ) {
        echo $key . "=>" . $value . "<br />";
    }
?> 

运行结果: 

each实现指针下移 
0挡的速度是0 
1挡的速度是40 
2挡的速度是80 
3挡的速度是120 
4挡的速度是160 
5挡的速度是200 
使用each函数实现数组指针的移动,进行数组遍历 
0=>0 
1=>40 
2=>80 
3=>120 
4=>160 
5=>200 

 

5. 数组的增添删改操作 

增添数组成员 

实例1:$num[] = value直接赋值追加到数组末尾: 

<?PHP 
    $num = array(1=>80,2=>120,3=>160); 
    $num[] = 240; 
    print_r($num); 
?> 

运行结果: 

Array ( [0] => 80 [1] => 120 [2] => 160 [3] => 240

 

实例2:array_pad函数,数组数组首尾选择性追加  

<?PHP 
    $num = array(1=>80, 2=>120, 3=>160); 
    $num = array_pad ( $num, 4, 200 );
    print_r ( $num );
    echo "<br/>";
    
    $num = array_pad ( $num, - 8, 40 );
    print_r ( $num );
?> 

运行结果: 

Array ( [0] => 80 [1] => 120 [2] => 160 [3] => 200
Array (
[0] => 40 [1] => 40 [2] => 40 [3] => 40 [4] => 80 [5] => 120 [6] => 160 [7] => 200 )

 

实例3:入栈操作追加(array_push): 

<?PHP 
$num = array(1=>80,2=>120,3=>160); 
array_push($num,200,240,280);    //可以自己追加,直接加在数组结尾 
print_r($num); 
?> 

运行结果: 

Array ( [1] => 80 [2] => 120 [3] => 160 [4] => 200 [5] => 240 [6] => 280

 

实例4:array_unshift() 在开头添加数组成员  


<?PHP 
$num = array(1=>80,2=>120,3=>160); 
array_unshift($num,0,40);  //可以自己追加,直接加在数组结尾 
print_r($num); 
?> 

运行结果: 

Array ( [0] => 0 [1] => 40 [2] => 80 [3] => 120 [4] => 160 ) 

注意:array_unshift()函数使用后数组的键值将会从0开始! 

 

删减数组成员 

实例1:unset()命令删除数组成员或数组:  

<?PHP 
$num = array_fill(0,5,rand(1,10)); 
print_r($num); 
echo "<br />"; 
unset($num[4]); 
print_r($num); 
echo "<br />"; 
unset($num); 
if(is_array){ 
echo "unset命令不能删除整个数组"; 
}else{ 
echo "unset命令可以删除数组"; 

?> 

运行结果:(运行出错及说明数组也被删除,不再存在) 
Array ( [0] => 9 [1] => 9 [2] => 9 [3] => 9 [4] => 9 ) 
Array ( [0] => 9 [1] => 9 [2] => 9 [3] => 9 ) 

Notice: Use of undefined constant is_array - assumed 'is_array' in H:\wamp\www\testing\editorplus\test.php on line 21 
unset命令不能删除整个数组 

 

实例2:array_splice()函数删除数组成员 

<?php 
$a=array("red", "green", "blue", "yellow"); 
count ($a); //得到4 
array_splice($a,1,1); //删除第二个元素 
count ($a); //得到3 
echo $a[2]; //得到yellow 
echo $a[1]; //得到blue 
?> 

 

实例3:array_unique删除数组中的重复值:  


<?php 
$a=array("red", "green", "blue", "yellow","blue","green"); 
$result = array_unique($a); 
print_r($result); 
?> 

运行结果: 
Array ( [0] => red [1] => green [2] => blue [3] => yellow ) 

 

实例4:array_merge、array_merge_recursive 合并数组  

<?php 
$array1 = array("r"=>"red",1,2,3,4); 
$array2 = array("b"=>"blue",4=>5,6,7,8,9); 
$array3 = array("r"=>"read",4=>10,2=>11); 
$array4 = array( 
array(4=>10), 
array(7=>13) 
); 
$array5 = array( 
array(4=>11), 
array(6=>12) 
); 
$result = array_merge($array1,$array2,$array3,$array4,$array5); 
echo "<pre>"; 
print_r($result); 
echo "</pre>"; 
$result = array_merge_recursive($array1,$array2,$array3,$array4,$array5); 
echo "<pre>"; 
print_r ($result); 
echo "</pre>"; 
?> 

运行结果:  

Array 

[r] => read 
[0] => 1 
[1] => 2 
[2] => 3 
[3] => 4 
[b] => blue 
[4] => 5 
[5] => 6 
[6] => 7 
[7] => 8 
[8] => 9 
[9] => 10 
[10] => 11 
[11] => Array 

[4] => 10 

 

 

 

[12] => Array 

[7] => 13 

[13] => Array 

[4] => 11 

[14] => Array 

[6] => 12 


Array 

[r] => Array 

[0] => red 
[1] => read 

[0] => 1 
[1] => 2 
[2] => 3 
[3] => 4 
[b] => blue 
[4] => 5 
[5] => 6 
[6] => 7 
[7] => 8 
[8] => 9 
[9] => 10 
[10] => 11 
[11] => Array 

[4] => 10 

[12] => Array 

[7] => 13 

[13] => Array 

[4] => 11 

[14] => Array 

[6] => 12 

注:

1. array_merge的键名是数字的将重新建立索引;遇到相同的字符串键名时,后面的将覆盖前面的。

2. array_merge_recursive函数的作用是将相同字符串的键名单元整合成一个数组。 

 

6. 数组的键值和值操作 

实例1:in_array()检测数组中是否有某个值存在  

<?php 
$array = range(0,9); 
if(in_array(9, $array)){ 
       echo "数组中存在"; 

?> 

运行结果:

数组中存在 

 

实例2:key()取得数组当前位置的键名:  

<?php 
    $array = range ( 2, 6 );
    print_r($array);
    echo "<br/>";
    
    $num = rand ( 2, 5 );
    echo "num : " . $num . "<br/>";
    
    while ( $num-- )
        next ( $array );
    $key = key ( $array );
    echo "key : " . $key;
?> 

运行结果:

Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 ) 
num : 3
key : 3

 

实例3:list()函数把数组中的值赋给指定变量:  

<?PHP 
$staff = array( 
array("姓名","性别","年龄"), 
array("小张","男",24), 
array("小王","女",25), 
array("小李","男",23) 
); 
echo "<table border=2>"; 
while(list($keys,$value) = each($staff)){ 
    list($name,$sex,$age) = $value; 
    echo "<tr><td>$name</td><td>$sex</td><td>$age</td></tr>"; 

echo "</table>"; 
?> 

 

实例4:array_flip()交换数组的键值和值:  

<?PHP 
$array = array("red","blue","yellow","Black"); 
print_r($array); 
echo "<br />"; 
$array = array_flip($array); 
print_r($array); 
?> 

运行结果: 
Array ( [0] => red [1] => blue [2] => yellow [3] => Black ) 
Array ( [red] => 0 [blue] => 1 [yellow] => 2 [Black] => 3 )  

 

<?PHP 
$array = array("red","blue","yellow","Black"); 
$result = array_keys($array); 
print_r($result); 
echo "<br />"; 
$result = array_values($array); 
print_r($result); 
?> 

运行结果: 
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 ) 
Array ( [0] => red [1] => blue [2] => yellow [3] => Black ) 

 

实例6:array_search()搜索数值: 

<?PHP 
$array = array("red","blue","yellow","Black"); 
$result = array_search("red",$array); 
if(($result === NULL)){ 
    echo "不存在数值red"; 
}else{ 
    echo "存在数值 $result"; 

?> 

运行结果:

存在数值 0 

函数array_search()返回的值可能为false或0或NULL,所以在判断时注意要用"===" 

 

7. 数组的排序 

实例1:sort()、rsort()/asort()、arsort()对数组排序:  

<?PHP 
$array = array("b","c","d","a"); 
sort($array);//从低到高排序 
print_r($array); 
echo "<br />"; 
rsort($array);//逆向排序 
print_r($array); 
?> 

结果: 
Array ( [0] => a [1] => b [2] => c [3] => d ) 
Array ( [0] => d [1] => c [2] => b [3] => a ) 
sort()、rsort()函数对数组进行从低到高的排序,返回结果为bool值; 
asort()、arsort()函数是保留键值的排序,排序后键值不重新索引。 

 

实例2:将数组顺序打乱——shuffle()函数: 

<?PHP 
$array = array("a","b","c","d"); 
shuffle($array);//从低到高排序 
print_r($array); 
?> 

结果为动态结果: 
Array ( [0] => c [1] => a [2] => d [3] => b ) 
shuffle的结果有点随机的意味,每次刷新都不一样。 

 

实例3:array_reverse()数组反向: 

<?PHP 
$array = array("d","b","a","c"); 
$array = array_reverse($array);//从低到高排序 
print_r($array); 
?> 

运行结果: 
Array ( [0] => c [1] => a [2] => b [3] => d ) 

 

实例4:自然排序算法——natsort()和natcasesort();  

<?PHP 
$array = array("sort2","Sort5","sort1","sort4"); 
natsort($array);//从低到高排序 
print_r($array); 
echo "<br />"; 
natcasesort($array); 
print_r($array); 
?> 

结果: 
Array ( [1] => Sort5 [2] => sort1 [0] => sort2 [3] => sort4 ) 
Array ( [2] => sort1 [0] => sort2 [3] => sort4 [1] => Sort5 ) 

natsort()、natcasesort()对数组进行自然排序,就是使用数字的正常排序算法。natcasesort会忽略大小写。 
 

实例5:对数组进行键值排序ksort():  

<?PHP 
$array = array(1=>"sort2",4=>"Sort5",2=>"sort1",3=>"sort4"); 
ksort($array);//从低到高排序 
print_r($array); 
?> 

结果: 
Array ( [1] => sort2 [2] => sort1 [3] => sort4 [4] => Sort5 ) 
注意:ksort()函数重新建立了索引。 

 

8. 数组的其他用法  

       cout($array) --------统计数组的单元个数 
  array_diff($array1,$array2)----------统计数组之间的不同点,返回第一个数组中有而第二个数组中没有的。 
  array_diff_assoc($array1,$array2)---------同array_diff(),只是它对键值也比较 
  array_diff_key($array1,$array2)------------比较键值 
  array_product($array)-----------返回数组的所有数的乘积 
  array_sum($array)--------------所有数值的和 
  array_rand($array,$n)----------在$array数组中取出$n个数值,返回数组 
  array_intersect($array1,$array2)----------------取得两个数组的交集 
  array_intersect_assoc($array1,$array2)---------------在array_intersect 的基础上进行键值比较 
  array_intersect_key($array1,$array2)-----------------比较两个数组键值的交集 

 

总结 

数组的使用在PHP中至关重要,由于PHP没有指针,所以数组承担了很大的数据操作任务。

学好数组,才能把PHP应用的得心应手

 

 

参考推荐:

PHP 数组使用小结

PHP 字符串函数总结

PHP 判断字符串包含

PHP 判断数字,字母,特殊符号,中文

php 常用函数总结(数组,字符串,时间,文件操作)

PHP 输出字符串(echo,print,printf,sprinf,print_r,var_dump)

PHP 数据类型转换