定义数组的方式:

使用array内置关键字

使用[]定义

直接赋值

<?php
echo'<pre>';

//定义数组的方式
//
//1、使用array内置关键字
$arr=array(1,2,4);
print_r($arr);

//2、使用[]定义
$brr=[1,2,4];
print_r($brr);

//3、直接赋值
$crr[]=1;
$crr[]=2;
$crr[]=4;

print_r($crr);

$drr[1]=1;
$drr[2]=2;
$drr[3]=4;

print_r($drr);

数组的分类:

按照维度来分:一维数组、二维数组、多维数组

按照下标来分:关联数组、索引数组

<?php
echo'<pre>';
//数组的分类
//按照维度来分:一维、二维、多维
//一维数组
$arr=array('jack','boy',23);
print_r($arr);

//二维数组
$arr=array(array('jack','boy',23),array('rose','girl',18));
print_r($arr);

//多维数组
$arr=array(array('jack','boy',23,'18nan'=>array(18000,180,18)),array('rose','girl',18));
print_r($arr);
echo'<hr>';
//按照下标分
//下标是Int类型的 数组 叫索引数组
//下标是string类型的 数组 叫关联数组
//关联数组
$arr=array('username'=>'fengfeng','sex'=>'girl','age'=>18,'boyfriend'=>array('xiaohei','xiaobai','xiaohuang'));
print_r($arr);

//索引数组
$brr=array(0=>'jack',1=>'boy',2=>23);
print_r($brr);

注意:在PHP中,索引数组的下标可以是非连续的值,只要在初始化时指定非连续的下标值即可。如果指定的下标值已经声明过,则属于对变量重新赋值。(前边已指定的索引值将被覆盖)。如果没有指定索引值的元素与指定索引索引值的元素混在一起赋值,没有指定索引值的元素的默认索引值,将紧跟指定索引值元素中的最高的索引值递增。


<?php
echo'<pre>';
$count=array(1,14=>'gaomou','A gongsi','beijingshi',14=>'0103243223','gaoluofeng@qq.com');
print_r($count);
结果:
Array
(
[0]=>1
[14]=>0103243223
[15]=>A gongsi
[16]=>beijingshi
[17]=>gaoluofeng@qq.com
)

访问数组的方式:

访问一维数组是使用数组的名称和索引值,二维数组也一样。

<?php
echo'<pre>';
$count=array(1,14=>'gaomou','A gongsi','beijingshi',14=>'0103243223','gaoluofeng@qq.com');

echo$count[14];

输出结果:0103243223


直接赋值下标的分析:


<?php
echo'<pre>';
$arr[]='a';
$arr[][]='b';
$arr[1][]='c';
$arr[1][][]='d';
$arr[][]='f';
$arr[][][]='e';
print_r($arr);

输出结果:

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

count()获取 数组单元 个数 或者 对象成员 属性个数

<?php
$arr=array('daoyan','zhuren','xiaozhang','jiaoshou','gaolaoshi');

//count()获取数组 单元个数 或者 对象成员属性个数
echocount($arr);
echo'<hr>';

$num=count($arr);
echo$num;

输出结果:5

5

遍历数组的几种方法:


1、使用for语句循环遍历(索引)数组:


<?php
$arr=array('daoyan','zhuren','xiaozhang','jiaoshou','gaolaoshi');


//方法一
$num=count($arr);
echo$num;
echo'<hr>';

//使用for循环,遍历连续的索引数组,关联数组会丢失无法打印出来
for($i=0; $i<$num;$i++){
echo$arr[$i].'<br>';
}

//方法二
echocount($arr);

//不推荐使用,因为在for循环中count($arr)要执行N次,效率不高
for($i=0; $i<count($arr);$i++){
echo$arr[$i].'<br>';
}

2、foreach()遍历数组:

使用foreach语句遍历数组时与数组的下标无关,不管是否是连续的数字索引数组,还是以字符串为下标的关联数组,都可以使用foreach语句遍历。


foreach语句有两种语法格式,第二种比较次要,但却是第一种有用的扩展。


第一种语法格式:

foreach($arras$value){

循环体

}

第二种语法格式:

foreach($arras$key=>$value){

循环体

}

第一种格式遍历给定的$arr数组。每次循环中,当前元素的值被赋给变量$value,并且把数值内部的指针向后移动一步,因此下一次循环中将会得到该数组的下一个元素,直到数组的结尾停止循环,结束数组的遍历。

第二种格式和第一种格式是做同样的事情,只是当前元素的键名也会在每次循环中被赋给变量$key。

<?php
$arr=['daoyan','user1'=>'zhuren','username'=>'xiaozhang',9=>'jiaoshou','gaolaoshi'];

//第一种,其中$v是任意值,随便取
foreach($arras$v){
echo$v.'<br>';
}
echo'<hr>';
//第二种,将数组中每个单元的键和值全部输出,其中$k是键、$v是值,$k,$v同样是任意值,可随便取
foreach($arras$k=>$v){
echo'键:'.$k.'=>值'.$v.'<hr>';
}

结果:

daoyan
zhuren
xiaozhang
jiaoshou
gaolaoshi
键:0=>值daoyan
键:user1=>值zhuren
键:username=>值xiaozhang
键:9=>值jiaoshou
键:10=>值gaolaoshi

3、联合使用list()、each()和while循环遍历数组


each()函数

each()函数需要传递一个数组作为参数,返回数组中当前元素的键/值对,并向后移动数组指针到下一个元素的位置。

键值对被返回为四个单元的数组,键名为 0,1,key 和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。

如果内部指针越过了数组的末端,则 each() 返回 FALSE。


<?php
$brr=['lily','girl','age','xiaoming'];

//each ---返回数组中当前的 键值对 并将数组指针向前移动一步

echo'<pre>';

//1
$id=each($brr);
print_r($id);
//2
$bd=each($brr);
print_r($bd);
//3
$cd=each($brr);
print_r($cd);
//4
$fd=each($brr);
print_r($fd);
var_dump($fd);
//5
$qd=each($brr);
print_r($qd);
var_dump($qd);


结果:

1Array
(
[1]=>lily
[value]=>lily
[0]=>0
[key]=>0
)
2Array
(
[1]=>girl
[value]=>girl
[0]=>1
[key]=>1
)
3Array
(
[1]=>age
[value]=>age
[0]=>2
[key]=>2
)
4Array
(
[1]=>xiaoming
[value]=>xiaoming
[0]=>3
[key]=>3
)
4.array(4) {
[1]=>
string(8)"xiaoming"
["value"]=>
string(8)"xiaoming"
[0]=>
int(3)
["key"]=>
int(3)
}
5.bool(false)

list()函数

它不是真正的函数,而是PHP的语言结构。

list() 用一步操作给一组变量进行赋值,即把数组中的值赋给一些变量。

注: list() 仅能用于数字索引的数组并假定数字索引从0开始。


语法格式:

list(mixed varname,mixed...) =array_expression

list()语句和其他函数在使用上有很大的区别,并不是直接接收一个数组作为参数。而是通过“=”运算符以赋值的方式,将数组中每个元素的值,对应的赋值给list()函数中的每个参数。list()函数又将它中的每个参数转换为直接可以在脚本中使用的变量。


<?php
$brr=['lily','girl','age','xiaoming'];

//list ---把数值中的值赋给一些变量
list($a,$b,$c)=$brr;

echo$a.'<br>';
echo$b.'<br>';
echo$c.'<br>';

结果: lily
girl
age


while循环遍历数组:


while( list($key,$value) = each(array_expression) ){

循环体

}


<?php
echo'<pre>';
$arr=['user1'=>'zhanglaoshi','user2'=>'lilaoshi','user3'=>'wanglaoshi'];

while(list($key,$value)=each($arr)){
echo'key:'.$key.'=>value'.$value.'<br>';
}

结果:
key:user1=>valuezhanglaoshi
key:user2=>valuelilaoshi
key:user3=>valuewanglaoshi

注意:在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用reset( )。

while和foreach语句两种方法的区别:

相同点:两者遍历数组的结果相同。

不同点:在使用while语句遍历数组之后,each()语句已经将传入的数组参数内部指针指向了数组的末端。当再次使用while语句遍历同一个数组时,数组指针已经在数组的末端,each()语句直接返回FALSE,while语句不会执行循环。只有在while语句执行之前先调用一下reset()函数,重新将数组指针指向第一个元素。

而foreach语句会自动重置数组的指针位置,当foreach开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在foreach循环之前调用reset函数。

简单的说就是:while需要先调用一下reset()函数,而foreach不需要。

数组指针相关操作函数:

current();

key();

next();

prev();

end();

reset();

<?php
//数组指针相关操作函数

echo'<pre>';
$arr=array('danyan','zhuren','xiaozhang','jiaoshou','gaolaoshi');
print_r($arr);

//current()返回指针指向的数据单元的值
var_dump((current($arr)));
var_dump(next($arr));
echocurrent($arr);

//返回指针的下一个位置所指向的数组单元的值
echonext($arr);
echo'<hr>';

//返回指针的上一个位置所指向的数组单元的值
echoprev($arr);
echo'<hr>';

echoend($arr);

//如果已经到了最后一个单元,再想访问下一个,会返回布尔值false
var_dump(next($arr));

//重置指针位置
reset($arr);

echocurrent($arr);

超全局变量预定义数组:

<?php
echo'<pre>';
// print_r($_SERVER);

//网站根目录
echo$_SERVER['DOCUMENT_ROOT'];
echo'<br>';
// 客户端ip地址
echo$_SERVER['REMOTE_ADDR'];
echo'<br>';

//来源地址
echo$_SERVER['HTTP_REFERER'];

//当前执行的php脚本文件地址
echo$_SERVER['PHP_SELF'];


// print_r($_ENV);
echo'<br>';


// 此关联数组包含 $_GET,$_POST 和 $_COOKIE 中的全部内容。
print_r($_REQUEST);


//通过 HTTP POST 方法传递的已上传文件项目组成的数组
$_FILES;

//通过 HTTP cookies 传递的变量组成的数组。是自动全局变量。
$_COOKIE;

//包含当前脚本中 session 变量的数组
$_SESSION;

$username='alibaba';
print_r($GLOBALS);