代码改变世界

第三章 使用数组(5)

2016-07-23 18:55  yojiaku  阅读(208)  评论(0编辑  收藏  举报

 

  • 在数组中浏览:each() , current() , reset() , end() , next() , pos() ,  prev()

每个数组都有一个内部指针指向数组中的当前元素。当使用 each() 函数时就间接地使用了这个指针。如果创建一个新数组,那么当前指针就将被初始化,并指向数组的第一个元素,调用 current($array_name) 将返回第一个元素。

调用 next() 或 each() 将使指针前移一个元素。调用 each($array_name) 会在指针前移一个位置之前返回当前元素。

next() 函数则不同——调用 next($array_name) 是将指针前移,然后返回新的当前元素。

reset() 函数将返回数组第一个元素的指针。 

调用 end($array_name) 可将指针移到数组末尾。

reset() 和 end() 可分别返回数组的第一个元素和最后一个元素。

end() 和 prev() 可以反向遍历一个数组。 prev() 和 next() 相反,它是将当前指针往回移一个位置然后再返回新的当前元素。

//show the content of one array in the opposite way
$array = array(1, 2, 3);
$value = end($array);
while($value){
    echo "$value<br />";
    $value = prev($array);
}

显示效果:

 

对数组的每一个元素应用任何函数:array_walk()

有时候,我们想以相同方式使用或者修改数组中的每一个元素。 array_walk() 函数的功能就是这个。

array_walk() 原型:bool array_walk(array arr, string func, [mixed userdata])

array_walk() 需要先声明一个自己的函数。

参数解释:arr - 需要处理的数组;func - 用户自定义并将作用于数组中每个元素的函数;userdata - 可选参数,如果使用,它可以作为一个参数传递给我们自己的函数。

例子1:

//array_walk()
function my_print($value){
    echo "$value<br />";
}
array_walk($array,'my_print');

解释:自定义函数 my_print() 表示将数组中每个元素显示在一个新行。

对于数组中的每个元素,array_walk() 将以关键字和保存在数组中的值作为参数

 例子2:

$array2 = array(4, 5, 6);
function my_multiply($value, $key, $factory){
    $value *= $factory;
    echo $value." ";
}
array_walk($array2, 'my_multiply', 3);

解释:可以忽略my_multiply中的$key关键字。这里定义了名为 my_multiply() 的函数,它可以用所提供的乘法因子(这里是3)去乘以数组中的每个元素。需要 array_walk() 函数的第三个参数来传递这个乘法因子,所以在定义 my_multiply() 函数时

需要三个参数——一个数组元素值($value),一个数组元素的关键字($key),参数($factory)。

注意:这个例子与书中不同的是,我们传递参数,直接使用的$value,而书中使用的是&$value,但这种方式已经被PHP5.4移除了。

 

  • 统计数组元素个数:count() , sizeof() , array_count_values()

sizeof() 是 count() 的别名,用法与之相同。

array_count_values():array array_count_values( array $input)——统计数中所有值出现的次数,返回一个数组,该数组用input数组中的值作为键名,改值在input数组中出现的次数作为值。

例如:

<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
?>

会输出:

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)
表示 1 在array数组中出现了 2 次,hello 在array数组中出现了 2 次,world 在array数组中出现了 1 次。
  • 将数组转换成标量变量:extract()

对于一个非数字索引数组,而该数组又有许多关键字-值对,可使用函数 extract() 将它们转换成一系列的标量变量。

extract(): extract(array var_array[, int extract_type] [, string prefix]);

通过一个数组创建一系列的标量变量,这些变量的名称必须是数组中关键字的名称,而变量值则是数组中的值。

例子:

$array3 = array('key1'=>'value1', 'key2'=>'value2', 'key3'=>'value3');
extract($array3);
echo "$key1 $key2 $key3";

输出结果为:value1 value2 value3

解释:这个数组具有三个元素,我们用extract() 函数创建了三个标量变量:$key1,$key2,$key3.