数组指针操作函数,PHP中的数组

复制代码 代码如下:$array=array; echo
$array[count-1];//计算数组长度,然后获取数组最后一个元素,如果数组中最后一个元素含有非数字键名,结果可能跟预期不符合
//适用于键名为数字的数组 echo ‘
‘; echo end;//将数组的内部指针指向最后一个单元,适用于所有数组

数组分类

  1. 索引数组
  2. 关联数组

一、数组遍历的3个方法介绍

总体来说,php的内置函数end还是最好的方法的了。大家可以测试下。

数组遍历

  1. 传值遍历
  2. 传址遍历

1. foreach()

PHP取值很容易,可以使用循环遍历、类指针,但是如果去数组最后一个值的时候也采用遍历的话是不是消耗了很多性能啊??

数组函数

  1. 指针操作函数
  • current($array) 当前位置的内容
  • key($array) 当前位置的键值
  • next($array) 指针移动到下一个单元
  • prev($array) 指针移动到上一个单元
  • reset($array) 指针移动到第一个单元
  • end($array) 指针移动到最后一个单元
  1. 单元函数操作
  • array_pop($array) 删除数组中的最后一个元素

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

Array ( [0] => red [1] => green )
  • array_push($array,$ele,$ele2) 数组尾部插N个元素

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

Array ( [0] => red [1] => green [2] => blue [3] => yellow )
  • array_shift($array)
    删除数组中的第一个元素(red),并返回被删除元素的值

<?php
$a=array("a"=>"red","b"=>"green","c"=>"blue");
echo array_shift($a);
print_r ($a);
?>

redArray ( [b] => green [c] => blue )
  • array_unshift($array,$ele) 把元素插入数组中

<?php
$a=array("a"=>"red","b"=>"green");
array_unshift($a,"blue");
print_r($a);
?>

Array ( [0] => blue [a] => red [b] => green )
  • array_slice($array,2)
    从数组的第三个元素开始取出,并返回数组中的其余元素

<?php
$a=array("red","green","blue","yellow","brown");
print_r(array_slice($a,2));
?>

Array ( [0] => blue [1] => yellow [2] => brown )
  • array_splice($array,2,$要替换的元素)
    把数组中的一部分去掉并用其它值取代,2后面的元素都去掉

<?php
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("a"=>"purple","b"=>"orange");
array_splice($a1,0,2,$a2);
print_r($a1);
?>

Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )
  • array_map(‘two’,$array)
    可以对数组中的每一个元素,按照two函数的规则操作返回一个新的数组

<?php
function myfunction($v)
{
  return($v*$v);
}

$a=array(1,2,3,4,5);
print_r(array_map("myfunction",$a));
?>

Array ( [0] => 1 [1] => 4 [2] => 9 [3] => 16 [4] => 25 )
  • compact(‘变量名字’,’变量名字’) 把多个变量的名字和内容,合成一个数组

<?php
$firstname = "Bill";
$lastname = "Gates";
$age = "60";

$result = compact("firstname", "lastname", "age");

print_r($result);
?>

Array ( [firstname] => Bill [lastname] => Gates [age] => 60 )
  • extract($array) 把数组中的内容分解成一个一个变量

<?php
$a = "Original";
$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
extract($my_array);
echo "$a = $a; $b = $b; $c = $c";
?>

$a = Cat; $b = Dog; $c = Horse
  • array_merge($array,$array) 合成多个数组

<?php
$a1=array("red","green");
$a2=array("blue","yellow");
print_r(array_merge($a1,$a2));
?

Array ( [0] => red [1] => green [2] => blue [3] => yellow )
  • array_chunk($array,2,true) 把数组分割为带有两个元素的数组

<?php
$cars=array("Volvo","BMW","Toyota","Honda","Mercedes","Opel");
print_r(array_chunk($cars,2));
?>

Array ( [0] => Array ( [0] => Volvo [1] => BMW ) [1] => Array ( [0] => Toyota [1] => Honda ) [2] => Array ( [0] => Mercedes [1] => Opel ) )

foreach()是一个用来遍历数组中数据的最简单有效的方法。

下面有三种取值方法可以更好的取出数组的最后一个值:

排序

  1. sort 排序
  2. asort 下标保留
  3. ksort
  4. usort
  5. rsort
  6. shuffle 乱序

#example1:复制代码
代码如下:”;}?>显示结果:

这是三个函数的取值方法,直接有效,按需选择吧

Do you like red? Do you like blue? Do you like green? Do you like
yellow?

2012年3月31日编辑:第二种方法有一种弊端,Array_pop()函数会把原来的数据的最后一个数“取出来”,也就是相当于剪切的意思,原来的数据中将不不再有最后一个值了

2. while()

#example2:复制代码
代码如下:”;}?>显示结果:

Other list of red. Other list of blue. Other list of green. Other list
of yellow.

3. for()

#example3:复制代码 代码如下:
“zero”,”1″=> “one”,”2″=> “two”);for ; $i++){$str= $arr[$i];echo
“the number is $str.
“;}?>显示结果:

the number is zero. the number is one. the number is two.

二、数组指针操作函数介绍

key()

key()函数返回input_array中位于当前指针位置的键元素。

#example4复制代码 代码如下:
“Columbus”,”Towa”=> “Des Moines”,”Arizona”=> “Phoenix”);echo “

Can you name the capitals of these states?

“;while {echo $key.”
“;next调用不会推进指针。为此要使用next()函数}?>

Can you name the capitals of these states? Ohio Towa Arizona

reset()

mixed reset

reset()函数用来将input_array的指针设置回数组的开始位置。如果需要在一个脚本中多次查看或处理同一个数组,就经常使用这个函数,另外这个函数还常用于排序结束时。

#example5 - 在#example1上追加代码

复制代码 代码如下:”;}reset;while= each
{echo “$key=> $val
“;}?>

Do you like red? Do you like blue? Do you like green? Do you like
yellow? 0 => red 1 => blue 2 => green 3 => yellow

注意:将一个数组赋值给另一个数组时会重置原来的数组指针,因此在上例中如果我们在循环内部将
$colors 赋给了另一个变量的话将会导致无限循环。 例如将 $s1 = $colors;
添加到while循环内,再次执行代码,浏览器就会无休止地显示结果。

each()

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

#example6复制代码 代码如下:
“Columbus”,”Towa”=> “Des Moines”,”Arizona”=> “Phoenix”);$s1=
each;print_r;?>

Array ( [1] => Columbus [value] => Columbus [0] => Ohio
[key] => Ohio )

current

mixed current

current()函数返回位于target_array数组当前指针位置的数组值。与next函数不同,current函数返回紧接着放在当前数组指针的下一个位置的数组值。
prev()函数返回位于当前指针的前一个位置的数组值,如果指针本来就位于数组的第一个位置,则返回FALSE。
end()函数将指针移向target_array的最后一个位置,并返回最后一个元素。

#example7复制代码 代码如下:”;$fruit=
next; //return “orange”echo $fruit.”
“;$fruit= prev; //return “apple”echo $fruit.”
“;$fruit= end; //return “banana”echo $fruit.”
“;?>显示结果:

apple orange apple banana

三、测试三种遍历数组的速度

一般情况下,遍历一个数组有三种方法,for、while、foreach。其中最简单方便的是foreach。下面先让我们来测试一下共同遍历一个有50000个下标的一维数组所耗的时间。

测试环境: Intel Core Due2 2GHz 2GB 1067MHz DDR3 Mac OS X 10.5.7 Apache
2.0.59 MySQL 5.0.41 PHP 5.2.6

#example8复制代码 代码如下:
‘;unset($str, $time_start, $time_end,
$time_used);######################################$time_start=
GetRunTime();while= each{$str= $val;}$time_end=
GetRunTime();$time_used= $time_end- $time_start;echo ‘Used time of
while:’.round

‘;unset($str, $key, $val, $time_start, $time_end,
$time_used);######################################$time_start=
GetRunTime();foreach{$str= $val;}$time_end= GetRunTime();$time_used=
$time_end- $time_start;echo ‘Used time of foreach:’.round

‘;?>测试结果:

Used time of for:0.0228429

Used time of while:0.0544658

Used time of foreach:0.0085628

经过反复多次测试,结果表明,对于遍历同样一个数组,foreach速度最快,最慢的则是while。从原理上来看,foreach是对数组副本进行操作,而while则通过移动数组内部指标进行操作,一般逻辑下认为,while应该比foreach快(因为foreach在开始执行的时候首先把数组复制进去,而while直接移动内部指标。),但结果刚刚相反。原因应该是,foreach是PHP内部实现,而while是通用的循环结构。所以,在通常应用中foreach简单,而且效率高。在PHP5下,foreach还可以遍历类的属性。