php数组访问

三维数组
Array( 
[0]=>Array(
[id]=12345
)
)
三维数组这样访问即可:$myarray['sheep'][0]['id']

一维数组访问
例:
//建立数组
$arr=array(
"key"=>"value"
);
//访问数组“key”元素
echo $arr["key"];

二维数组访问
例1:
//建立数组
$arr=array("key"=>array("key2"=>"value"));
//访问二维数组“key2”元素
echo $arr["key"]["key2"];
例2:
//建立数组
$arr=array(array("key2"=>"value"));
//访问二维数组“key2”元素
echo $arr[0]["key2"];

更多维数组以此类推
$arr["键值"]["键值"]["键值"]["键值"]["键值"]。。。


1. 数组的初始化
(1)用array创建数组
 a: $products = array('Tires','Oil','Spark Plugs');
  array()实际上是一个语言结构,而不是一个函数

 b: 初始化相关数组
  $prices = array('Tires'=>100,'Oil'=>10,'Spark Plugs'=>4);  //创建具有3个元素的数组

  $prices = array('Tires'=>100);  //这个方式不是创建一个具有3个元素的数组,
  $prices['Oil'] = 10;            //而是创建只有一个元素的数组,然后再加上另外两个元素
  $prices['Spark Plus'] = 4;
    
  $prices['Tires'] = 100;         //数组时在向这个数组加入第一个元素时创建的
  $prices['Oil'] = 10;            //是先创建一个空的数组,再把值放进去
  $prices['Spark Plus'] = 4;

(2)用range创建数组

如果需要将升序排列的数字保存在一个数组中,可以使用range()函数自动创建这个数组
range(first,second,step)  //step 可选。规定元素之间的步进制。默认是 1。
$number = range(1,10);  //创建一个从1到10的数字数组
$odds = range(1,10,2);  //创建一个1到10之间的奇数数组
$letters = range('a','z'); 

(3)直接创建数组
$products[0] = "Tires";
$products[1] = "Oil";
$products[2] = "Spark Plugs";
注意该段程序创建数组的顺序:
 如果$products并不存在,第一行代码将创建一个只有一个元素的数组,
 而后续代码将在这个数组中添加新的数值。


2. 访问数组
(1)当然数组的取值最方便的就是foreach啦,这个不用多说了
要注意数组的索引是从0开始的哦

(2)还有第二种方法,用while 和 each()
while($element = each($prices)){
 echo $element['key'];
 echo '-';
 echo $element['value'];
 echo '<br />';
}

each()返回当前元素,并将下一个元素作为当前元素
each() 函数生成一个由数组当前内部指针所指向的元素的键名和键值组成的数组,并把内部指针向前移动。
返回的数组中包括的四个元素:键名为 0,1,key 和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
如果内部指针越过了数组范围,本函数将返回 FALSE。

(3)list和each遍历数组
while(list($product,$price) = each($prices))
 echo "$product - $price<br />";

如果在相同的脚本中两次使用该数组,就必须使用reset()将当前元素重新设置到数组开始
reset($prices);
while(list($product,$price) = each($prices))
 echo "$product - $price<br />";

3. 数组操作符
---------------------------------------------------------------------------------------
  操作符         名称         使用方法                        结果
---------------------------------------------------------------------------------------
    +            联合          $a+$b                $a和$b的联合,数组$b将被附加到$a中,
             但是任何关键字重读的元素将不会被添加
    ==           等价          $a==$b               如果$a和$b具有相同的元素,就返回true
    ===          恒等          $a===$b              两者具有相同元素且顺序相同,返回true
    !=           非等价        $a!=$b               如果$a和$b不是等价的就返回true
 <>           非等价        $a<>$b               如果$a和$b不是等价的就返回true
    !==          非恒等        $a!==$b              如果$a和$b不是恒等的就返回true
---------------------------------------------------------------------------------------

+ 对标量类型执行加法操作,而联合对数组执行加法操作

标量:
标量代表了存储数据项的实际内存位置:字符串或数字。是PHP存储的数据项的最基本单元
简单来说,变量就是字符串和数字

4. 数组排序
使用sort()函数 按升序对给定数组的值排序
sort()函数区分字母大小写,所有的大写字母都在小写字母的前面,
第二个参数,可选,有SORT_REGULAR,SORT_NUMERIC或SORT_STRING,指定排序类型的功能,
要比较包含有数字2和12的字符串时,从数字角度,2要小于12,作为字符串,'12'却要小于'2'

asort()按数组元素值排序
ksort()按数组key排序

sort()方向排序rsort()
asort()==>arsort()
ksort()==>krsort()

asort(array,sorttype)
ksort(array,sorttype)

5. 多维数组的排序
function compare($x,$y){
 if($x[1] == $y[1])
  return 0;
 else if($x[1] < $y[1])
  return -1;
 else
  return 1;
}

usort($products,'compare');

sort()==>usort()
asort()==>uasort()
ksort()==>uksort()

但是用户定义的排序没有反向变体
但可以编写反向排序函数
function reverse_compare($x,$y){

 if($x[1] == $y[1])
  return 0;
 else if($x[1] < $y[1])
  return 1;
 else
  return -1;

}

usort($products,'reverse_compare');

usort(array,sorttype)
 array 必需。规定要排序的数组。
 function 必需。用户自定义的函数。

 函数必须设计为返回 -1, 0, 或 1,并应该接受两个供比较的参数,同时以类似下面这样的方式来工作:

 如果 a = b, 返回 0
 如果 a > b, 返回 1
 如果 a < b, 返回 -1    规定的返回值0,1,-1
 

6. 对数组重新排序
 (1)shuffle()将数组重新排序
 本函数为数组中的单元赋予新的键名。这将删除原有的键名而不仅是重新排序。


 <?php
 $my_array = array("a" => "Dog", "b" => "Cat", "c" => "Horse");
 shuffle($my_array);
 print_r($my_array);
 ?>输出:

 Array ( [0] => Cat [1] => Horse [2] => Dog ) //原来的a,b,c键名被删除,新的键名是0,1,2


 (2)array_rand(array,number)函数从数组中随机选出一个或多个元素,并返回。
 如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名。
 返回的是键名,而不是值

 如:
 <?php
 $a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse");
 print_r(array_rand($a,2));
 ?>
 
 输出:

 Array ( [0] => c [1] => b )
 
 (3) array_reverse(array,preserve)
 返回一个内容与参数数组相同但顺序相反的数组,创建新的数组并返回。
 如果第二个参数指定为 true,则元素的键名保持不变,否则键名将丢失。

 (4)如果数组是一系列整数,可以用range()函数
 $number = range(10,1,-1) //以相反的顺序创建数组

 小结:(1)array_reverse(),shuffle()都是要创建新的数组,
    而array_rand则不需要创建新的数组,

    (2)array_rand返回的是键名数组,
    shuffle()原来的键名被新的键名代替,
    array_recerse()可以设置是否保留原来键名


7. 从文件载入数组的方法

 //注册登录的信息放在文件时,登录验证用file把文件取出放到数组中,然后再处理,而不是单个处理

 $file_array = file("$DOCUMENT_ROOT//test//content.txt");
 foreach($file_array as $key=>$value){
  $value_array = explode("|",$value);
  foreach($value_array as $value_key=>$value_value){
   echo $value_value."<br>";
  }
 }

8. 数组其他有用的操作
each()返回当前指针元素,把指针前移一个位置,直到到数组末尾,
next()将指针前移一个元素,和each一样,不同的是,next()将指针前移,然后再返回新的当前元素,
 而each()会在指针前移一个位置之前返回当前元素
 (为什么说指针是前移呢,因为数组是像堆栈那样先进后出的,所以当前元素的下一个元素的就是在当前元素的上面)
prev()将当前指针往回移一个位置然后再返回新的当前元素,和next()相反

current() 返回第一个元素(就是说返回创建一个新数组时,当前指针就被初始化,当前指针就是第一个元素)

reset()返回数组第一个元素的指针
end()将指针移到数组末尾

current()和reset()的区别
current() 函数返回当前被内部指针指向的数组元素的值,并不移动指针。是返回数组初始化时的第一个元素,不影响使用指针的函数
reset() 是会把指针移到数组的第一个元素,然后就会影响使用指针的函数

以上的函数返回的值都是元素值,


9. array_walk()

定义和用法
array_walk() 函数对数组中的每个元素应用回调函数。如果成功则返回 TRUE,否则返回 FALSE。

典型情况下 function 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata ,将被作为第三个参数传递给回调函数。

如果 function 函数需要的参数比给出的多,则每次 array_walk() 调用 function 时都会产生一个 E_WARNING 级的错误。这些警告可以通过在 array_walk() 调用前加上 PHP 的错误操作符 @ 来抑制,或者用 error_reporting()。

语法
array_walk(array,function,userdata...)参数 描述
array 必需。规定数组。
function 必需。用户自定义函数的名称。
userdata 可选。用户输入的值,可作为回调函数的参数。
提示和注释
提示:您可以为函数设置一个或多个参数。

注释:如果回调函数需要直接作用于数组中的值,可以将回调函数的第一个参数指定为引用:&$value。(参见例子 3)

注释:将键名和 userdata 传递到 function 中是 PHP 4.0 新增加的。
例子 1
<?php
function myfunction($value,$key)
{
echo "The key $key has the value $value<br />";
}
$a=array("a"=>"Cat","b"=>"Dog","c"=>"Horse");
array_walk($a,"myfunction");
?>输出:

The key a has the value Cat
The key b has the value Dog
The key c has the value Horse例子 2
带有一个参数:

<?php
function myfunction($value,$key,$p)
{
echo "$key $p $value<br />";
}
$a=array("a"=>"Cat","b"=>"Dog","c"=>"Horse");
array_walk($a,"myfunction","has the value");
?>输出:

a has the value Cat
b has the value Dog
c has the value Horse例子 3
改变数组元素的值(请注意 &$value):

<?php
function myfunction(&$value,$key)
{
$value="Bird;
}
$a=array("a"=>"Cat","b"=>"Dog","c"=>"Horse");
array_walk($a,"myfunction");
print_r($a);
?>输出:

Array ( [a] => Bird [b] => Bird [c] => Bird )


10. 统计数组个数
 count(array,mode)

 mode 可选。规定函数的模式。可能的值:

   0 - 默认。不检测多维数组(数组中的数组)。
   1 - 检测多维数组。 (或者COUNT_RECURSIVE)
   注释:该参数是 PHP 4.2 中加入的。
sizeof() 是count的别名

array_count_value() 统计数组中所有值出现的次数
返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数
 <?php
 $a=array("Cat","Dog","Horse","Dog");
 print_r(array_count_values($a));
 ?>输出:

 Array ( [Cat] => 1 [Dog] => 2 [Horse] => 1 )

 $array=array(4,5,1,2,3,1,2,1);
 $ac=array_count_value($array);
 将创建一个名为$ac数组,该数组包括:
        
          key       value
        4          1
        5          1
        1          3
        2          2
        3          1


11. 将数组转换称标量变量 extract()
 extract(array,extract_rules,prefix)
 第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。
 
 比较常用的3种类型
 EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
 EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。自 PHP 4.0.5 起,这也包括了对数字索引的处理。
 EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix(第三个参数)。

 $ = "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

如果之前存在相同的变量

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

 extract($my_array,EXTR_PREFIX_SAME,'dup');

 echo "/$a = $a; /$b = $b; /$c = $c; /$dup_a = $dup_a;";
 ?>输出:

 $a = Original; $b = Dog; $c = Horse; $dup_a = Cat;

注意: extract()可以提取出一个元素,该元素的关键字必须是一个有效的变量名称
就是说以数字开头或者包含空格的关键字将被跳过,不放入变量。

posted @ 2013-12-15 06:36  某人2013  阅读(428)  评论(0编辑  收藏  举报