PHP学习(二)----数组
数组:
首先说一下对PHP中的理解,建立一个好的理解模型还是很关键的:
1.PHP中的数组实际上可以理解为键值对,key=>value;而对于key的取值,可以是string/integer;value则是任意数据类型,不仅仅是基本数据类型,引用类型也是可以的,比如说数组;
2.既然key是数据类型,就有相互转换,当定义key是1.0时,将会被转换成1,等等之类的;当然,key也可以是空,也可以重复,只是后面的会覆盖前面的
3.由于是弱语言,里边就有很多松散的样子,比如arr[]="value";这也可以存在,会直接创建数组(先理解到这,以后再精确的理解和整理);
定义: PHP 中的 数组 实际上是一个有序映射.映射是一种把values关联到keys的类型.在数组中长度不固定,切能够是任何数据类型. 出于这个原因, 数组有两种类型: 索引数组和关联数组.
索引数组: 数组中的keys值是integer,即从0开始到(length-1); 可以通过索引直接访问数组中的values;
关联数组:keys的数据类型是string类型, 也可以通过索引直接访问,只是不能应用到类似于for循环这样的遍历数组之中.
注:PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。
定义语法:
$arr_1=array( keys1 => values1,keys2 => values2
//, ...关联数组
);
$arr_2=array( values1,values2
// .....索引数组
);
// 键(key)可是是一个整数 integer 或字符串 string
// 值(value)可以是任意类型的值
遍历数组:
1.for循环:由于用到整型才能执行for循环,所以for循环只能用到索引数组中.
语法:
for($i=0;$i<count($arr);$i++){};
2.foreach:遍历数组,可以遍历任何类型的数组,最为常用的一种.
foreach($arr as $values){ //对值操作
echo $values." ";
};
echo "<br/>";
foreach($arr as $key => $values){ //操作keys和values
echo $key."=>".$values." ";
};
/*
结果:
1 2 3 4 aa
0=>1 1=>2 2=>3 3=>4 4=>aa
*/
3.each()和list():
each():返回数组中当前的键/值对并将数组指针向前移动一步, 在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元(执行最后一个之后,下一次执行将会返回一个空数组)。返回一个数组,包括当前指针下的数组元素的keys和values;
$arr=array(1,2,3,4,"aa");
print_r($arr);
echo "<br/>";
$arr1=array("one"=>10,"two"=>20,"three"=>"aa");
print_r($arr1);
echo "<br/>";
$arr2=each($arr);
print_r($arr2);
echo "<br/>";
//执行了3次;
$arr3=each($arr1);
print_r($arr3);
echo "<br/>";
$arr3=each($arr1);
print_r($arr3);
echo "<br/>";
$arr3=each($arr1);
print_r($arr3);
结果:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => aa )
Array ( [one] => 10 [two] => 20 [three] => aa )
Array ( [1] => 1 [value] => 1 [0] => 0 [key] => 0 )
Array ( [1] => 10 [value] => 10 [0] => one [key] => one ) //指针向前移动了
Array ( [1] => 20 [value] => 20 [0] => two [key] => two )
Array ( [1] => aa [value] => aa [0] => three [key] => three )
list():把数组中的值赋给一些变量 ,像 array() 一样,这不是真正的函数,而是语言结构。 list() 用一步操作给一组变量进行赋值。 list() 仅能用于数字索引的数组并假定数字索引从 0 开始。
$arr=array(1,2,3,4,"aa");
print_r($arr);
echo "<br/>";
$arr1=array("one"=>10,"2"=>20,"three"=>"aa");
print_r($arr1);
list($first,$second,$three)=$arr;
echo "<br>";
echo $first." ".$second." ".$three;
list($first,$second,$three)=$arr1;
echo "<br>";
echo $first." ".$second." ".$three;//对key不是整数的赋值
echo "<br/>";
list(,,$three)=$arr;//可以跳过输入,不能不写,用,隔开
echo $three;
运行的结果:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => aa )
Array ( [one] => 10 [2] => 20 [three] => aa )
1 2 3
20
3
这个地方来回顾一下boolean类型:
这是一个最简单的数据类型
要明确地将一个值转换成 boolean ,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。
参见类型转换的判别。
当转换为 boolean 时,以下值被认为是 FALSE :
- 布尔值
FALSE本身 - 整型值 0(零)
- 浮点型值 0.0(零)
- 空字符串,以及字符串 "0"
- 不包括任何元素的数组
- 不包括任何成员变量的对象(仅 PHP 4.0 适用)
- 特殊类型 NULL(包括尚未赋值的变量)
- 从空标记生成的 SimpleXML 对象
所有其它值都被认为是 TRUE (包括任何资源)。
<?php
var_dump ((bool) "" ); // bool(false)
var_dump ((bool) 1 ); // bool(true)
var_dump ((bool) - 2 ); // bool(true)
var_dump ((bool) "foo" ); // bool(true)
var_dump ((bool) 2.3e5 ); // bool(true)
var_dump ((bool) array( 12 )); // bool(true)
var_dump ((bool) array()); // bool(false)
var_dump ((bool) "false" ); // bool(true)
?>
这样我们可以利用这一点来用list()和each()来输出数组,和foreach的功能是一样的,可以访问两种数组
while (list($key,$value)=each($arr)){//这个地方就是当为空的时候停止
echo $key."=>".$value."<br/>";
};
while (list($key,$value)=each($arr)){//不会再执行,因为指针已经是最后一个
echo $key."=>".$value."<br/>";
};
运行结果:
0=>1
1=>2
2=>3
3=>4
4=>5
for循环来实现这个功能
for($i=0;$i<count($arr);$i++){
list($a,$b)=each($arr);
echo $a."=>".$b."<br/>";
}
运行结果:
0=>1
1=>2
2=>3
3=>4
4=>5
4.使用指针来遍历数组
key()-返回数组中的key
current() - 返回数组中的当前value
end() - 将数组的内部指针指向最后一个单元
prev() - 将数组的内部指针倒回一位
next()- 将数组的内部指针向前一位
reset() - 将数组的内部指针指向第一个单元,复原
这里边的参数都是要操作的数组
echo key($arr);//返回当前数组当前指针下的key;
echo " ";
echo current($arr);//返回当前数组当前指针下的values;
echo "<br/>";
next($arr);//下移一个指针
echo key($arr);
echo " ";
echo current($arr);
echo "<br/>";
prev($arr);//前移一个指针
echo key($arr);
echo " ";
echo current($arr);
echo "<br/>";
end($arr);//移到最后一个
echo key($arr);
echo " ";
echo current($arr);
echo "<br/>";
reset($arr);//移到第一个
echo key($arr);
echo " ";
echo current($arr);
echo "<br/>";
运行结果:
0 1
1 2
0 1
4 5
0 1
组合使用,遍历数组
$arr=array("one"=>1,"two"=>2,"three"=>3,4,5);
do{
echo key($arr)."=>".current($arr)."<br/>";
}while(next($arr));
运行结果:
one=>1
two=>2
three=>3
0=>4
1=>5
预定义数组:

常用的函数:
(1)in_array(value,array[,strict=true|false]);-检查数组是不是有某值,返回true 或 false;strict=true严格类型的检查,意思就是:1和"1"是不一样的;错误返回null;
$arr=array("one"=>1,"two"=>2,"three"=>3,4,5);
var_dump(in_array("1",$arr));//bool(true)
var_dump(in_array("1", $arr,true));//bool(false)
var_dump(in_array("1", $arr,false));//bool(true)
(2)array_reverse(array);反转数组,返回一个单元相反的数组
$arr=array("one"=>1,"two"=>2,"three"=>3,4,5);
print_r($arr);
echo "<br/>";
print_r(array_reverse($arr));
结果:
Array ( [one] => 1 [two] => 2 [three] => 3 [0] => 4 [1] => 5 )
Array ( [0] => 5 [1] => 4 [three] => 3 [two] => 2 [one] => 1 )
(3)count(array);返回数组元素(键值对)的个数;
$arr=array("one"=>1,"two"=>2,"three"=>3,4,5);
echo count($arr);// 5
(4)array_unique();返回一个去重的新数组;
$arr=array("one"=>1,"two"=>2,4,"three"=>4,4);
$arr1=array_unique($arr);
print_r($arr1);//b保留最前边的那个
结果:
Array ( [one] => 1 [two] => 2 [0] => 4 )
(5)unset(array);没有返回值,只是用来修改 数组----释放给定的变量
$arr=array("one"=>1,"two"=>2,4,"three"=>4,4);
print_r($arr);
echo "<br/>";
unset($arr['one']);
print_r($arr);
unset($arr);
print_r($arr);//数组已被删除
$a=1;
echo "<br/>";
echo $a;
unset($a);
echo $a;//变量已经被删除
//unset($a,$b,$c)一次销毁多个变量
运行结果:

报没有变量的警告,说明变量已经被销毁了
(6)array_values(array);返回数组中所有的值并给其建立数字索引。
$arr=array("one"=>1,"two"=>2,4,"three"=>4,4);
print_r($arr);
echo "<br/>";
print_r(array_values($arr));
运行结果:
Array ( [one] => 1 [two] => 2 [0] => 4 [three] => 4 [1] => 4 )
Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 4 [4] => 4 )
(7)array_merge(array1,array2.....);合并多个数组,返回合并后的数组
$arr=array("one"=>1,"two"=>2,4,"three"=>4,4);
print_r(array_merge($arr,$arr));
运行结果:
Array ( [one] => 1 [two] => 2 [0] => 4 [three] => 4 [1] => 4 [2] => 4 [3] => 4 )
(8)array_push();在数组的后面加入元素,返回加入元素之后的数组的个数,改变原来的数组
$arr=array("one"=>1,"two"=>2,4,"three"=>4,4);
print_r($arr);
echo "<br>";
echo count($arr);
echo "<br>";
echo array_push($arr, 2);
echo "<br>";
print_r($arr);
运行结果:
Array ( [one] => 1 [two] => 2 [0] => 4 [three] => 4 [1] => 4 )
5
6
Array ( [one] => 1 [two] => 2 [0] => 4 [three] => 4 [1] => 4 [2] => 2 )
写在最后:
一个好的程序是通过敲出来的!
PHP学习(二)----数组的更多相关文章
- [jQuery学习系列二 ]2-JQuery学习二-数组操作
前言 上一篇内容 已经对于Jquery 有了一些认识, 包括Jquery的选择器和DOM对象, 那么这一篇继续来看下Jquery中很实用的Jquery对于数组的操作. Jquery中对数组的操作大致有 ...
- Java基础学习(二)—数组
一.数组的概念 定义: 数组是存储同一种数据类型的多个元素的集合. 数组既可以存储基本数据类型,也可以存储引用数据类型. 格式: 格式1: 数据类型[] 数组名; 格式2: 数据类型 数组名[]; 这 ...
- javasscript学习笔记 之 数组学习二 数组的所有方法
1.push() 和 pop() 栈的方法 后进先出 push() 该方法是向数组末尾添加一个或者多个元素,并返回新的长度. push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返 ...
- java学习之数组(二)
在上一节中我们讲到了数组的概念,定义,以及在内存当中的表现形式.那么这里我们来说一下,数组的另一种定义方式. 在上一篇当中我们规定是这个样子定义数组的, class ArrDemo { public ...
- emberjs学习二(ember-data和localstorage_adapter)
emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- day 82 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- [ 转载 ] Java基础12--基础学习总结——数组
java基础学习总结——数组 一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的 ...
- 利用python 学习数据分析 (学习二)
内容学习自: Python for Data Analysis, 2nd Edition 就是这本 纯英文学的很累,对不对取决于百度翻译了 前情提要: 各种方法贴: https://w ...
随机推荐
- hdu 3183 贪心
题意:给一个数字,删掉其中的若干位,使得最后的数字最小 就是每次删除数的时候都是删掉第一个比右边数大的数 利用双向链表模拟 #include<cstdio> #include<ios ...
- SURF算法与源码分析、下
上一篇文章 SURF算法与源码分析.上 中主要分析的是SURF特征点定位的算法原理与相关OpenCV中的源码分析,这篇文章接着上篇文章对已经定位到的SURF特征点进行特征描述.这一步至关重要,这是SU ...
- codeforces Round #263(div2) D. Appleman and Tree 树形dp
题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...
- JAVA中操作符的优先级
一元数学比较有逻辑 三元赋值就可以! 一元操作符 数学操作符 比较操作符 逻辑操作符 三元操作符 赋值操作符
- Jquery操作
一.文档操作 1.内部插入:append(),appendTo(),prepend(): 2.外部插入:after(),before(): 3.删除操作:remove(),empty(): 4.克隆操 ...
- ZOJ2587 Unique Attack(判定最小割唯一性)
看了题解,自己大概想了下. 最小割唯一的充分必要条件是残量网络中所有点要嘛能从源点floodfill到要嘛能floodfill到汇点. 必要性,这是当然的,因为假设从源点floodfill或者从汇点反 ...
- Machine Schedule
Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- ! cocos2d 预编译重复
由于预编译文件重复,导致下面的类没有被编译,所以,在写代码的时候也没有提示还报错,说LoadingScene没有定义. #ifndef __HELLOWORLD_SCENE_H__ #define _ ...
- 20130617 hbase regionserver 老挂掉
hbase regionserver 老挂掉: 添加如下: <property><name>hbase.regionserver.restart.on.zk.expire< ...
- JAVA获取两个List<String>中不同的数据
效率非常不错 测试结果: 1.list1中有97277条数据,list2中有37894条数据,两个list进行对比找出不同的数据共60000条左右,用时:0.051秒 2.list1中有97277条数 ...