数字索引的数组:
数字索引数组就是键为数字的数组;
初始化一个数字索引的数组:
$a = array('a1', 'a2', 'a3');
循环数组的元素:
for($i = 0; $i < 3; $i++) {
echo $a[$i].' ';
}
当然也可以使用foreach
:
foreach ($a as $cur) {
echo $cur.' ';
}
关联数组
数组的键为任意的,好比java中的Map。
初始化关联数组:
$a1 = array('a' => 10, 'e' => 50, 'c' => 100, 'b' => 30, 'd' => 60);
定义a1数组,有5个元素。
遍历数组有多种方法:
(1) 直接访问
echo $a1['a'];
(2) 通过foreach访问,key为键,value为值
foreach ($a1 as $key => $value) {
echo $key.' - '.$value.'<br/>';
}
(3)通过each获取数组的每一个元素,each()函数会返回一个带有4个数值和4个指向数组位置的索引数组。位置key和0包含了当前元素的键,而位置value和1包含了当前元素的值
while($everyone = each($a1)) {
echo $everyone['key'];
echo ' - ';
echo $everyone['value'].'<br/>';
}
(4)通过list()函数将从each()函数返回的数组中所包含的0、1两个元素变为自定义名的新变量。
while(list($position, $price) = each($a1)) {
echo $position.' - '.$price.'<br/>';
}
数组操作符
( 记录几个比较重要的)
现在又数组$a, $b
$a + $b 将符号+右边的数组元素(除去键与左边数组键相同的那些元素)附加到左边数组的后面;但是任何重复的键值不会被覆盖。
$a == $b 表示相等。如果$a和$b具有相同的键和值;
$a === $b表示恒等。如果$a和$b具有相同的键和值,并且元素的顺序和类型完全相同。
数组排序
1.sort
函数 ,根据值从小到大排序。第一个参数为数组,第二个参数可选,这个可先参数可以传递SORT_REGULAR、SORT_NUMBER、SORT_STRING,分别表示默认排序、对数字排序、对字符串排序。
$a3 = array(10, 2, 11, 3, 5);
sort($a3);
print_r($a3);
输出的为 Array ( [0] => 2 [1] => 3 [2] => 5 [3] => 10 [4] => 11 ),注意这里的下标。可以看到每个值对应的下表都是重新赋值的。 原本10的下标是0,现在是3。
2.asort
函数,根据元素值排序,不过他不会改变数组的下标。
$a3 = array(10, 2, 11, 3, 5);
asort($a3);
print_r($a3);
输出效果 Array ( [1] => 2 [3] => 3 [4] => 5 [0] => 10 [2] => 11 ) ,可以看到元素值对应的下表没有改变。这是很有用的,当数组为关联数组时,下标不会丢失。可以看sort和asort分别排序关联数组的结果:
加入现在有数组:
$astr = array(
'java' => 10,
'c' => 70,
'c#' => 35,
'php' => 50,
'c++' => 20
);
asort
排序结果 Array ( [java] => 10 [c++] => 20 [c#] => 35 [php] => 50 [c] => 70 )
sort
排序结果 Array ( [0] => 10 [1] => 20 [2] => 35 [3] => 50 [4] => 70 )
区别在哪里很明显。
3.ksort
函数,根据元素的键来排序,同样会保留下标。
$astr = array(
'java' => 10,
'c' => 70,
'c#' => 35,
'php' => 50,
'c++' => 20
);
ksort($astr);
print_r($astr);
输出结果 Array ( [c] => 70 [c#] => 35 [c++] => 20 [java] => 10 [php] => 50 )
4.反向排序函数: rsort
类似sort
,不过结果和sort
相反,arsort
同样类似asort
,结果和它相反,krsort
也是如此。
5.自定义排序 usort
,它有2个参数,第一个为数组,第二个为自定义的函数。
可以看下usort
函数对第二个参数的说明
@param callback $cmp_function
* The comparison function must return an integer less than, equal to, or
* greater than zero if the first argument is considered to be
* respectively less than, equal to, or greater than the second.
如果第一个值比第二个小,就要返回-1;如果第一个值比第二个大,就要返回1;如果第一个值和第二个相等,就要返回0;
$astr = array(
array('boo1', 'java' , 10),
array('boo2', 'c', 70),
array('boo1', 'c#', 35),
array('boo2', 'php', 50),
array('boo3', 'c++', 20)
);
function cmp($x, $y) {
if($x[0] == $y[0]) {
return $x[2] < $y[2] ? -1 : 1;
} else {
return $x[0] < $y[0] ? -1 : 1;
}
}
usort($astr, 'cmp');
print_r($astr);
这里函数的作用是现根据第0列从小到大排序,如果第0列元素相同,根据第2列元素从小到大排序。
输出结果 Array ( [0] => Array ( [0] => boo1 [1] => java [2] => 10 ) [1] => Array ( [0] => boo1 [1] => c# [2] => 35 ) [2] => Array ( [0] => boo2 [1] => php [2] => 50 ) [3] => Array ( [0] => boo2 [1] => c [2] => 70 ) [4] => Array ( [0] => boo3 [1] => c++ [2] => 20 ) )
asort
和ksort
对应的就是uasort
和uksort
数组中的一些函数
current() 返回当前指针指向的数组元素。
next() 将指向数组元素的指针向后移动以为,然后返回指向的那个元素。
prev() 和next()相反。
reset() 将指针指向数组的开始元素。
end() 将指针指向数组的最后一个元素。
array_walk() 可以对数组的每个元素进行相同的操作。有三个参数,第三个参数可选;第一个为数组,第二个为用户自定义并将作用于数组每个元素的函数。第三个如果使用了,它可以作为一个参数传递给我们自己的函数。
用法:
$a = array(2=>10, 5=>2, 11=>4, 6=>1, 4=>3, 9=>7);
function my_multiply($value, $key, $factor) {
echo $value.' '.$key.' '.$factor.'<br/>';
}
array_walk($a, 'my_multiply', 999);
输出:
10 2 999
2 5 999
4 11 999
1 6 999
3 4 999
7 9 999
可以看到自定义函数中第一个参数是数组的值,第二个参数为数组的键,第三个参数为array_walk的第三个参数。
count()函数返回数组元素的个数。
sizeof()函数是count()的别名,貌似没区别。
array_count_values()函数会统计数组每个元素的值在数组中出现的次数。这个函数会返回一个包含频率表的关联数组。将以数组的值为关联数组的键,每个数组元素值出现的次数作为关联数组的值。
extract() 函数将数组转化为变量。