- 包含其他数组的数组成为多维数组
- 关联数组(即非数字索引数组)使用更有意义的数据作为数组的索引
1、数组索引数组
$products = array( ‘a’, ‘b’, ‘c’);//就像一个对象一样初始化
- 数组的复制:$arra = $arrb;//即可将数组arrb的内容复制到数组arra中
使用range可以将一个范围的值,直接放到一个数组中返回,比如:
$numbers = range(1,10);
$letters = range(‘a’, ‘z’);
range具有第三个参数,是间隔的意思,比如要用1到10之间的奇数数组:
$odds = range(1,10,2);
数组具有的一些功能:
- 如果信息存放在磁盘文件中,可以直接将文件载入到数组中
- 如果数组中的数据存放在数据库中,可以直接从数据库载入该数组
- 可以使用函数每次提取数组的一部分内容,或者对数组进行重新排序
- PHP的数组不需要预先初始化或创建,第一次使用,会自动创建
如果数组arra有2个元素,那么语句arra[2] = ‘a’;将会自动添加一个新元素
对数组的foreach访问
1
2
3
|
foreach
(
$
arra
as
$
c
)
{
echo
$
c
.
" "
;
}
|
2、使用不同索引的关联数组
关联数组,可以将每个变量值和任何关键字或者索引联系起来
关联数组的初始化:
$price = array(‘Tires’=>100, ‘oil’=>10, ‘Spark’=>4);
3、使用foreach对关联数组进行遍历
foreach每次将数组内容,放到一个键值对里面进行访问:
1
2
3
|
foreach
(
$
price
as
$
key
=
>
$
value
)
{
echo
$
key
.
" - "
.
$
value
.
"<br />"
;
}
|
结果:
测试关联数组————–
Tires – 100
oil – 10
Spark – 4
4、使用while + each()结构访问关联数组
每次将一个键值对作为整体返回,类似pair(key, value):
1
2
3
|
while
(
$
elem
=
each
(
$
price
)
)
{
echo
$
elem
[
'key'
]
.
" - "
.
$
elem
[
'value'
]
.
"<br />"
;
}
|
结果是一样的。
5、访问关联数组值list()和each()搭配进行(高级用法)
1
|
reset
(
$
price
)
;
//
|
貌似遍历了因此数组,数组指针就变成了最后一个,所以要重置一下
1
2
3
4
|
echo
"<br>使用list()+each()遍历数组:<br>"
;
while
(
list
(
$
product
,
$
pri
)
=
each
(
$
price
)
)
{
echo
$
product
.
" - "
.
$
pri
.
"<br />"
;
}
|
注意:each()函数,数组将记录当前元素,如果希望两次以上使用该数组,就必须用reset()函数将当前元素重新设置到数组开始的地方
6、数组操作符
主要是+,即联合操作符,解释如下:
+,例如$arra+$arrb,两个数组的联合,数组arrb会被附加到arra中,但是任何关键字冲突的元素不会被添加
7、数字索引数组升序排序
bool sort ( array
&$array
[, int$sort_flags
= SORT_REGULAR ] )
第二个参数:
SORT_REGULAR
– 默认SORT_NUMERIC
– 作为数字比较SORT_STRING
– 作为字符串比较
8、关联数组升序排序
分为两种:
- 按照关键字排序,即按照$key的内容排序
bool ksort ( array
&$array
[, int$sort_flags
= SORT_REGULAR ] )
- 按照值排序,即按照$value排序
bool asort ( array
&$array
[, int$sort_flags
= SORT_REGULAR ] )
其中第二个参数和sor是相同的
9、对数组的降序排序
- sort、ksort、asort都是对数组进行升序排序的
- rsort、krsort、arsort是对数组进行降序排序,但是用法相同
10、使用回调函数对多维数组进行排序
如下一个排序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
echo
"<br>使用回调函数对多维数组排序:<br>"
;
$
products
=
array
(
array
(
'TIR'
,
'Tires'
,
100
)
,
array
(
'OIL'
,
'Oil'
,
10
)
,
array
(
'SPK'
,
'Spark Plugs'
,
4
)
)
;
//以下是回调函数,两个参数是数组的一维元素
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'
)
;
//传入函数的名字
|
usor中的u代表用户,因为要求用户传入比较函数,同样的,有uasort和uksort函数
多维数组的排序,如果要进行反向排序,只要将回调函数的返回值取反就行了,比如
usrot($products, ‘reverse_compare’);
11、对数组进行重新排序
bool shuffle ( array
&$array
) //该函数将一个数组随机打乱
array_reverse 返回原数组的反序副本,不会改变原数组。
array array_reverse ( array
$array
[, bool$preserve_keys
= false ] )
12、array_push和array_pop
int array_push ( array
&$array
, mixed$var
[, mixed$...
] )
向数组末尾添加元素,例如代码:
array_push($stack, “apple”, “raspberry”);
另一个是array_pop
mixedarray_pop ( array
&$array
) //array_pop() 弹出并返回末尾元素
1
2
3
4
5
|
<?php
$stack
=
array
(
"orange"
,
"banana"
,
"apple"
,
"raspberry"
)
;
$fruit
=
array_pop
(
$stack
)
;
print_r
(
$stack
)
;
?>
|
结果(和栈一样,末尾元素被删除):
Array ( [0] => orange [1] => banana [2] => apple )
13、explode将字符串拆分成数组
array explode ( string
$delimiter
, string$string
[, int$limit
] )
第三个参数若被设置,则只返回前最多limit个元素
1
2
3
4
5
6
7
8
9
|
<?php
$str
=
'one|two|three|four'
;
// positive limit
print_r
(
explode
(
'|'
,
$str
,
2
)
)
;
// negative limit (since PHP 5.1)
print_r
(
explode
(
'|'
,
$str
,
-
1
)
)
;
?>
|
结果:
Array ( [0] => one [1] => two|three|four )
Array ( [0] => one [1] => two [2] => three )
14、PHP的其他数组函数
在数组中浏览的函数:
数组中都有一个内部指针,用来遍历数组,该指针可以被使用和改变,比如each()就是使用该指针的
- each():返回当前元素,然后前移指针
- current()
- reset():将指针指向数组开头
- end():将指针指向数组末尾
- next():前移指针,然后返回元素,和each()相反
- pos()
- prev():前移指针,然后返回元素,与next()相反
15、超级强大:对数组一个元素使用任何回调函数:array_walk()
bool array_walk ( array
&$array
, callable$funcname
[, mixed$userdata
=NULL
] )
注意,该函数是不管数组指针指向哪里,它就是从头到位开始遍历
- 如果第三个参数被设置,我们可以在自己的回调函数中,使用该参数
回调函数的形式如下:
myfunc( value, key, userdata);//
一般来说,funcname有2个参数,第一个是value,第二个是key,可以忽略key和userdata,只带1个参数即value
1
2
3
4
5
6
7
8
9
10
11
|
echo
"<br>使用array_walk对每个元素应用一个函数:<br>"
;
$
arrint
=
array
(
1
,
2
,
3
,
4
,
5
,
6
)
;
echo
"原数组:<br>"
;
printArr
(
$
arrint
)
;
//注意第一个参数,因为要改变,所以用引用
function
myfunc
(
&
$
val
,
$
key
,
$
count
)
{
$
val *
=
$
count
;
}
array_walk
(
$
arrint
,
myfunc
,
3
)
;
//每个元素乘以3
echo
"使用了array_walk以后的数组:<br>"
;
printArr
(
$
arrint
)
;
|
结果:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
)
使用了array_walk以后的数组:
1
2
3
4
5
6
7
8
9
|
Array
(
[
0
]
=
>
3
[
1
]
=
>
6
[
2
]
=
>
9
[
3
]
=
>
12
[
4
]
=
>
15
[
5
]
=
>
18
)
|
16、统计数组元素个数:count()、sizeof()和array_count_values()
sizeof()和count()的返回值相同
array_count_values用法不同,返回的是统计数目:
1
2
3
4
|
<?php
$array
=
array
(
1
,
"hello"
,
1
,
"world"
,
"hello"
)
;
print_r
(
array_count_values
(
$array
)
)
;
?>
|
结果:
1
2
3
4
5
6
|
Array
(
[
1
]
=
>
2
[
hello
]
=
>
2
[
world
]
=
>
1
)
|
17、将键值对的关联数组的每个元素建立一个变量extract()
int extract ( array
&$var_array
[, int$extract_type
= EXTR_OVERWRITE [, string$prefix
=NULL
]] )
比如代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?php
/* Suppose that $var_array is an array returned from wddx_deserialize */
$size
=
"large"
;
$var_array
=
array
(
"color"
=
>
"blue"
,
"size"
=
>
"medium"
,
"shape"
=
>
"sphere"
)
;
extract
(
$var_array
,
EXTR_PREFIX_SAME
,
"wddx"
)
;
echo
"$color, $size, $shape, $wddx_size\n"
;
?>
|
1
|
blue
,
large
,
sphere
,
medium
|
可以看出,意思是将键作为变量名,新建了变量,为了防止冲突,设定第二个和第三个参数,用于处理冲突,第三个参数指定新建变量的前缀。
18、小结
数组在PHP用的是超级多
本章主要对数组进行了概念定义、foreach,each,list的遍历方法、array_walk回调的使用、打乱、排序、抽取等各种数组操作。