初学PHP的时候对数组的一些基本总结。适用于小白的快速复习
<?php
header('content-type:text/html;charset=utf-8');
//数组概念
PHP其实并不区分 索引数组 和 关联数组
访问数组单元的时候 $array[0] 和 $array{0} 是一样的
索引数组的key是整数(可以不连接)(array() =>直接转化成为 0 或者最大的 索引+1)
关联数组的key是字符串(null直接转化成"");
枚举数组就是把key和value都当做了value
//数组(对于数组而言,
$key只能是int或者string,浮点型或者布尔型会强制转换成为int,如果key相同,最后的value会覆盖之前的//所以$arr[age]是错误的,应该是$arr['age']
$value可以是任何类型)
foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
// 数组函数非常重要!!!!
$str2 = array(0, 1, 3, 5, 50);
$str = array('name' =>'zhangsan' ,'2'=>3, '1'=>'3', '5'=>$str2[3] );
print_r($str); //Array ( [name] => zhangsan [2] => 3 [1] => 3 [5] => 5 )
echo '<br />';
print_r($str2); //Array ( [0] => 0 [1] => 1 [2] => 3 [3] => 5 [4] => 50 )
echo '<hr />';
//数组的增删改查
$str[] = 'nihao'; //增加
unset($str['name']);//删除
$str[1] = 30;//改
echo $str[5];//读取,即查
print_r($str); //Array ( [2] => 3 [1] => 30 [5] => 5 [6] => nihao )
echo '<br />';
//数组比较大小
array_diff — 计算数组的差集
数组运算符(+ == === != <> !==)
$a + $b 联合 $a 和 $b 的联合。$b会覆盖$a中相同键值得元素
$a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。
$a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
$a != $b 不等 如果 $a 不等于 $b 则为 TRUE。
$a <> $b 不等 如果 $a 不等于 $b 则为 TRUE。
$a !== $b 不全等 如果 $a 不全等于 $b 则为 TRUE。
//遍历数组
//利用for循环结构遍历
$arr = array(0, 1, 3, 5, 50, 6);
for ($key=0; $key<count($arr) ; $key++) {
echo $arr[$key].'<br />';
}
/*0
1
3
5
50
6
*/
//利用foreach循环结构遍历,
foreach ($arr as $key => $value) {
echo $key,'~',$value.'<br />';
}
/*0~0
1~1
2~3
3~5
4~50
5~6*/
foreach ($arr as $value) {
echo $value.'<br />';
}
/*0
1
3
5
50
6*/
//利用 list() 和 each() 来遍历数组,each() 每调用一次,指针向后移动一位,list() 把数组中的值赋给变量
//http://www.cnblogs.com/ggbd-lie/p/3269192.html 详细解释
$t1 = array('a' =>'apple', 'b'=>'bababa', 'c'=>'couuenrnt' );
reset($t1); //必须重置,在执行完each()后,数组的指针会移动到下一个单元,如果想要遍历数组,必须要使用reset()
while (list($key, $val) = each($t1)) {
echo "$key => $val \n"; //必须使用"",如果使用''没有效果
}
echo '<br />';
//list操作 从右向左赋值 快捷地给一组变量赋值,返回值为void
//each 返回数组中当前的键和值组成的数组,键名0和key表示当前的单元的键,键名1和value表示当前单元的值。指针自动向下一个单元移动
数组指针操作
数组尽量不要进行应用,在PHP底层分析中有一节课是讲数组引用时的怪现象
current(array) 返回数组中当前的键/值 并且将数组指针向前移动一个单位
reset(array) 将数组的内部指针指向第一个单元
end(array) 把指针指向最后一个单元
next(array) 指针向前移动一个单元
prev(array) 指着 向后移动一个单元
//数组常用函数
/**
Count() //计算数组中的对象个数,返回值为int
array_sum(); //计算数组中所有值得和
implode(); //把数组元素组合成字符串,返回string
addslashed(); //使用反斜线引用字符串,返回字符串
array_key_exists() //检查键是否在数组中,返回值为bool
in_array() //检查值是否存在数组中,返回值为bool
array_change_key_case($str, CASE_UPPER / CASE_LOWER); //将数组中键名全部改为大写或者小写,返回一个数组
array_fill(5, 6,banana); //用banana填充6个数组,下标以5开始,返回值为array
array_filter() //使用回调函数来过滤数组中的值,详情查看手册
array_values() //返回数组中所有的值,键以0,1,2,3,来表示,返回值为array
array_keys() //返回数组中所有的键名,键变成值以数组形式返回
array_push() //向数组的末尾加入变量,入栈,返回值为array
array_pop() //将数组末尾弹出,出栈
array_shift() //将开头单元移除数组
array_unshift() //在开头数组插入单元
Sort() //把数组按照值进行排序,有默认排序,原有键被删除,返回bool,可以使用foreach来展现
Rsort() //逆向排序,同上
Usort() //把数组按照值进行排序,规则自定义,原有键被删除,返回bool
asort() //把数据按照值进行排序,但是键被保存,返回值bool
natsort() //把数组的值按照自然算法排序,区别于sort(),返回bool
natcasesort() //自然排序算法,不区分大小写,同上,
ksort() //把数组按照键名排序,返回值bool 主要用于关联数组
array_merge() //合并数组,如果键名相同,后面值覆盖前面,如果是数字键名相同,后面值会添加而且键名改变,用 + 可避免改键名,返回值array
array_merge_recursive() //主要用于二维数组的情况,键名相同,则合并数组,不会覆盖
array_diff($t1, $t2) //返回数组为值在$t1中出现但是$t2中没有出现的数组,键名不会改变
array_diff_assoc() //同上,但是键和值会同时比较,然后返回$t1中多余的
array_intersect($t1,$t2) //交集,返回在 $t1 和 $t2 中值同时出现的数组
array_intersect_assoc() //同上,但是键名和值都必须进行比较
array_flip(); //数组键和值进行对调,如果有多个相同的值,只取最后一个,其余丢弃,返回值array
array_reverse($t1 [,true]) //将数组顺序反转,如果有true将会保留键名,返回值array //[]表示可以忽略,
array_unique() //去掉数组中重复的值,值保留第一个,返回值array
shuffle() //把数据随机打乱,删除键名,重新排列
Range(0,100,10) //建立一个指定范围内的数组,返回自array,从 0 到 100 按照 10 的台阶重新形成数组,即0, 10, 20, ...,70, 80, 90, 100,
Srand($seed) //不懂 //用seed播下随机数发生器种子,无返回值 4.2.0之后不再使用
array_rand() //从数组中随机选取1个或者2个单元,如果只取一个,返回键名,如果多取几个,返回随机组成的数组 $rand_keys = array_rand($input, 2 );
*/
//数组指针操作 返回类型是数组中value的值,同时也包含类型
/*
current() 当前位置
next()
prve() 前一个
end()
reset() 复位,指向第一个
key() 获取当前的键名
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = next($transport); // $mode = 'car';
$mode = prev($transport); // $mode = 'bike';
$mode = end($transport); // $mode = 'plane';
$mode = key($transport); // $mode = '3';
$mode = reset($transport); // $mode = 'foot';
*/
//小羊繁殖案例及其面试题 小羊在第1年和第3年生,第五年死,有第0年,求20年后有多少只
$arr = array(1, 0, 0, 0, 0);
for ($i=1; $i<=20 ; $i++) {
$tam = $arr[1] + $arr[3];
array_unshift($arr, $tam);
array_pop($arr);
}
echo array_sum($arr);
print_r($arr);
echo '<br />';
//猴子称大王游戏 n个猴子绕成圈,数到m的猴子出局,剩下最后的是大王
//假设有5只猴子,数到7的出局,问最后第几只是大王
function king($n, $m){ //定义函数king
$monkey = range(1, $n); //创建函数指定范围内的数组
$i = 0;
while (count($monkey)>1) { //剩余猴子必须大于只
$i+=1;//开始进行计数
$head = array_shift($monkey); //将第一只猴子移出列表
if ($i%$m != 0) { //如果第i只猴子不是 m 的倍数,则移到数组末尾
array_push($monkey, $head);
}
}
return $monkey[0];
}
echo '剩余',king(3,4),'号猴子';//剩余2号猴子
echo '<br />';
//数组面试题
/*
http://www.zixue.it/forum.php?mod=viewthread&tid=160
http://www.zixue.it/forum.php?mod=viewthread&tid=164
http://www.zixue.it/forum.php?mod=viewthread&tid=225
http://www.zixue.it/forum.php?mod=viewthread&tid=189
http://www.zixue.it/forum.php?mod=viewthread&tid=133
http://www.zixue.it/forum.php?mod=viewthread&tid=249
*/