PHP教程学习06:PHP中的数组及其使用技巧

学习教程来源于:
PHP中文网教程
PHP官网PHP手册(简体中文)链接

数组的定义与分类

数组:键值对的集合
键名:
整数、字符串(不是则会自动转换为这俩种类型)
值:
①标量(整数型、浮点型、字符串、布尔型)
②复合(数组:多维数组、对象)


按键名类型分类: 1.索引数组: 键名默认是从零开始顺序递增的整数 可自定义键名,若重复,后面会覆盖前面 2.关联数组: 键名是字符串,用引号包装 如果重复,后面覆盖前面
<?php
// 创建一个索引数组
// 执行的是下舍入,指定了索引的值,其后的值的键名会递增
$arr = ['html', 3.8=>'css', 'javascript'];
echo '<pre>';
print_r($arr);	//输出数组
echo '</pre>';

echo '<hr/>';

// 创建一个关联数组
$arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
echo '<pre>';
print_r($arr1);	//输出关联数组
echo '</pre>';
数组的创建与访问:

创建:
①初始化创建
②直接给元素赋值来创建
③先声明空数组再添加
访问:
①整体访问:print_r( a r r ) / v a r d u m p ( arr)/var_dump( arr)/vardump(arr)
②逐个访问:echo a r r a y [ array[ array[key]/var_daump( a r r a y [ array[ array[key],可同时访问多个)


<?php
// 初始化创建一个数组
$arr = [12, 44, 'abc'];	//默认索引数组
// 键名默认从0开始递增
// 与下面等效
$arr = [0=>12, 1=>44, 2=>'abc'];
// 值可以是任何类型
$arr = ['html', 'css', 'javascript'];
echo '<pre>';
print_r($arr);
echo '<pre/>';
// 等价于
$arr = [0=>'html', 1=>'css', 2=>'javascript'];

// 初始化创建一个关联数组
$arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
echo '<pre>';
print_r($arr1);
echo '</pre>';

// 直接给元素赋值创建数组
// 第一行语句,赋值的同时,创建数组
$arr['name'] = 'php';
// 从第二行语句起,想语句中添加元素
$arr['domain'] = 'www.php.cn';
// 继续向数组中添加
$arr['pageTitle'] = 'php中文网';
// 初始化创建一个关联数组
// $arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];


// 创建一个空数组
$arr = [];
// 向数组中添加元素
$arr[] = 10;
$arr[1] = 20;
$arr['age'] = 30;
// 不指定键名,默认是递增的整数

echo '<pre>';
print_r($arr);
echo '</pre>'; 

// 访问某一个数组元素
echo $arr[1].'<br/>';
echo $arr['age'];

数组指针

  1. current():获取指针当前位置的元素的值
  2. key():获取指针当前元素的键名(索引)
  3. next():指针移动到下一个元素
  4. prev():指针移动到上一个元素
  5. end():指针移动到最后一个元素
  6. reset():指针复位到第一个元素
数组的遍历:
for循环

索引数组遍历
关联数组遍历

<?php
// 用for语句进行索引数组的遍历
$arr = range(1,10);	//生成一个1-10的整数数组
// echo '<pre>';
// print_r($arr);
// echo '</pre>';
// echo '$arr数组的元素个数:'.count($arr);
for($i=0; $i<count($arr); $i++) {
	echo $i.'=>'.$arr[$i].'<br/>';
	echo '第'.($i+1).'个元素的值是:'.$arr[$i].'<br/>';
}

// 用for语句进行关联数组的遍历
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
for($i=0; $i<count($arr); $i++){
	echo key($arr),'=>',current($arr),'<br/>';
	next($arr);
}
while循环

索引数组遍历
关联数组遍历

<?php
$arr = range(1,10,2);	//生成一到十之间的整数,并且他们之间的步长是2
echo '<pre>';
print_r($arr);
echo '</pre>';
$i=0;
while($i<count($arr)) {
	echo '第'.($i+1).'个元素是:'.$arr[$i].'<br/>';
	$i++;
}

$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
$i=0;
while ($i<count($arr)) {
	echo '第'.key($arr).'个元素是:'.current($arr).'<br/>';
	next($arr);
	$i++;
}
foreach循环(PHP专门为数组设计的语句)

索引数组遍历
关联数组遍历

<?php
$arr = range(1,10,2);
foreach ($arr as $key=>$value) {
	echo '第'.$key.'个数组元素的值是:'.$value.'<br/>';
}

$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
foreach ($arr as $key=>$value) {
	echo '我的'.$key.'是:'.$value.'<br/>';
}
list与each

list语言结构
与echo一样,list是语言结构,并非函数,所以可以放在等号左边
list语句的主要功能是:将数组元素转为变量
1.数组的键名必须是默认从0开始递增的索引数组,不能是关联数组
2.list的参数,不一定要和数组的元素一一对应,不对应的变量就自动忽略

<?php
$arr = range(1, 5);
echo '<pre>';
print_r($arr);
echo '</pre>';

list($a, $b, $c, , $e)=$arr;
echo $a,'==',$b,'==',$c,'==',$e;

each函数
可以遍历任何数组,将当前元素以特殊键值对方式返回,并自动下移数组指针
0,1是当前元素的键的俩种表示方法,0和1键名对应的是元素索引表示方法,这个特征适合list处理。key和value对应的是元素的关联表示方法。

<?php
$arr = ['合肥', '芜湖', '安庆'];	//默认的索引数组
reset($arr);	//复位数组内部指针,强制指向第一个元素
echo '<pre>';
print_r(each($arr)); //each()将当前元素以数组的方式返回
print_r(each($arr));
print_r(each($arr));
echo '</pre>';


// 数组说明
// 返回的四个元素的数组
//  0,1是当前元素的键的俩种表示方法,0和1键名对应的是元素索引表示方法,这个特征适合list处理。key和value对应的是元素的关联表示方法。

list-each配合遍历

<?php
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
$temp = each($arr); //执行完成,数组指针自动下移
echo '<pre>';
print_r($temp); //索引键名[0]对应的Peter元素的键名,[1]对应peter值
echo '</pre>';
reset($arr); //复位指针,将指针指向第一个数组元素
while(list($key, $value)=each($arr)) {
	//$key = 'name',$value = 'peter'
	echo '我的'.$key.'是:'.$value.'<br/>';
	//$key = 'age',$value = 28
}

遍历方式的选择
默认索引数组用:for
自定义关联数组用:foreach

数组的键值操作函数:

array_values($arr):返回数组中的所有元素的值

<?php
/*
array_values():将当前数组元素的值全部取出后重新打包到一个默认索引数组中
默认索引数组:下标从0开始递增的索引数组,其实就是省略掉键名的数组
用在只需要对数组元素的值感兴趣的场合,例如大量数据的搜索等
*/
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>true];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '<hr/>';
$arr1 = array_values($arr);
echo '<pre>';
print_r($arr1);
echo '</pre>';

array_keys($arr):返回数组的键名数组

<?php
/*
array_keys($arr)将当前数组的键取出来,以默认索引数组方式返回
数组的值就是当前数组的键名,非常适合处理关联数数组
*/
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
$keyArr = array_keys($arr);
echo '<pre>';
print_r($keyArr);
echo '</pre>';
echo '<hr/>';
for($i=0; $i<count($keyArr); $i++) {
	echo '我的'.$keyArr[$i].'是'.$arr[$keyArr[$i]].'<br/>';
}

array_key_exists($key,$array):检测键名是否在数组中

<?php
/*
array_key_exists($key,$array)
array_key_exists(键名,数组)
返回值为布尔值,为true则存在,为false则不存在
*/
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
$key = 'marr';	//定义要查询的键名
//适合于在一个关联数组中查看指定键名是否存在
$res = array_key_exists($key, $arr);
// var_dump($res);
// echo '<hr/>';
if (true == $res) {
	echo '键名'.$key.'存在~~~';
} else {
	echo '不好意思,该键名'.$key.'不存在,请重新输入~~~';
}

in_array($value,$array):判断某值是否在数组中

<?php
/*
in_array($value,$array,true):判断数组中是否存在某个值
该函数有三个参数,第一个是要查询的值,第二个是目标数组,第三个参数true,是否开启严格模式,如果开启,则值与类型必须完全匹配
字符类型区分大小写
*/
$arr = ['name'=>'peter', 'age'=>28, 'sex'=>'male'];
$value = 'peter'; //区分大小写
// $value = 'Peter';
// $value = '28';	//类型为字符串
// $res = in_array($value, $arr);
$res = in_array($value, $arr, true);  //true开启严格模式,值与类型完全匹配
var_dump($res);
echo '<hr/>';
if (true == $res) {
	echo '值'.$value.'存在~~';
} else {
	echo '不好意思,该值'.$value.'不存在,请检查~~';
}
echo '<hr/>';

// 值的类型支持数组
$valueArr = [5,9,12,33];
// $arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male', [5,9,12,33]];
$arr1 = ['name'=>'peter', 'age'=>28, 'sex'=>'male', [5,12,33]];
if (in_array($valueArr, $arr1)) {
	echo '$valueArr数组存在于数组中~~';
} else {
	echo 'sorry,没有找到$valueArr数组~~';
}
echo '<hr/>';

// array_search($value, $array):在数组中搜索给定的值,如果成功则返回首个符合该值的数据相应的键名,支持true参数(严格模式)
$a = ['html','css','php',true];
echo array_search(1, $a);

echo array_search(1, $a, true);  //严格模式下找不到,因为严格模式下值与类型需要完全匹配,1是整型,true时布尔类型
数组统计操作:

count($array):返回数组元素数量

<?php
// count($array):获取数组元素数量
$arr = [1,2,3,4,['a','b',[5,6,7]]];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '$arr数组元素个数是:'.count($arr,0);
echo '<hr/>';

//count($arr,[模式0|1]),0:不检测多维数组,1:检测多维数组;
echo '$arr数组元素个数是(包括多维数组):'.count($arr,1);

array_count_values($arr):返回数组中每个值出现的次数

<?php
/*
统计元素值出现的次数,返回关联数组,键是原数组的值,值是该值出现的次数
要统计的数组元素的值必须是整数或者字符串,否则会抛出警告,因为这些值要被转为新数组的键,而键名必须是整数或字符串
*/
$arr = ['name'=>'peter', 'age'=>28, 'isMarried'=>1, 'num'=>28];
// 要统计的值必须是整数或者字符串
// $arr = ['name'=>'peter', 'age'=>28.2, 'isMarried'=>1, 'num'=>28];

$countArr = array_count_values($arr);
echo '<pre>';
print_r($countArr);
echo '</pre>';

array_unique(#array):删除数组中重复的值

<?php
// array_unique($array):删除数组中重复的值
$arr = ['a'=>'html', 'b'=>'css', 'c'=>'css', 'd'=>'php', 'e'=>'javascript', 'f'=>'php'];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '$arr数组元素个数是:'.count($arr);
echo '<hr/>';
// 删除重复的元素值,并返回一个新的数组,保留第一个重复元素的键名
$arrNew = array_unique($arr);
echo '<pre>';
print_r($arrNew);
echo '</pre>';
echo '$arrNew数组元素个数是:'.count($arrNew);
用回调函数对数组操作:

array_filter($array, callback):将数组元素一次传入到回调函数这处理

<?php
// array_filter($array. callback):数组过滤器
//将数组中的值,依次逐个传入都回调函数中处理,只有处理结果为true的元素才允许出现在结果数组中
$arr = [1,2,3,4,5,6,7,8,9];
function odd($n) {
	return $n & 1;	// 按位'与'运算,任何整数与1进行按位与运算之后,只有奇数才会返回1,否则返回0
}

function even($n){
	return !($n & 1);	//数组中处理奇数,剩下的就是偶数了
}

$arr1 = array_filter($arr, 'odd');
echo '<pre>';
print_r($arr1);
echo '</pre>';
echo '<hr/>';

$arr2 = array_filter($arr, 'even');
echo '<pre>';
print_r($arr2);
echo '</pre>';
echo '<hr/>';

array_walk($array, callback):将数组中的值一次传入callback中处理

<?php
// array_walk(array, funcname)
// 功能:1:遍历数组 2:更新元素

$arr = ['name'=>'peter','age'=>28,'sex'=>'male'];
function printArr($value,$key) {
	echo "我的{$key}是{$value}<br/>";
}
array_walk($arr, 'printArr');
// 采用引用传参,可以对数组中的值进行修改
function alterArr(&$value,$key,$suffix){
	$value .= $suffix;	//给袁术值添加后缀
}
array_walk($arr, 'alterArr', '_php');
echo '<hr/>添加后缀后:<br/>';
array_walk($arr, 'printArr');

// 主要用于影响原数组中的值

array_map(callback,$array...):将回调函数作用在一个或多个数组元素值上

<?php
// array_map(callback,$arr1,$arr2)
// 将回调函数作用到每个数组上,并返回一个新数组:默认索引数组// 回调函数的参数数量,必须与要处理的数组数量一致
//1.将回调函数作用到一个数组上
$arr1 = [1,2,3,4,5];
//在创建一个回调函数
$func1 = function ($value) {
	return $value * 2;
};
$newArr1 = array_map($func1, $arr1);
echo '<pre>';
print_r($newArr1);
echo '</pre>';
//2.回调函数作用到多个数组上,以俩个数组为例
$arr2 = ['合肥', '南京', '武汉', '杭州', '上海'];
//创建回调函数,参数数量必须与数组数量一致
$func2 = function ($value1, $value2) {
	return "第{$value1}个城市是{$value2}<br/>";
};
$newArr2 = array_map($func2, $arr1, $arr2);
echo '<pre>';
print_r($newArr2);
echo '</pre>';
数组的排序操作:

sort($array)和rsort($array):忽略原键名,按元素值从小到大排序

<?php
// sort($array):元素按值大小从小到大重新排序,根据排序后的顺序,键名重新生成
//rsort($array):元素按值大小从大到小重新排序,根据排序后的顺序,键名重新生成
$arr1 = [23, 53, 32, 2, 56];
$arr2 = ['html', 'css', 'js', 'php', 'mysql'];
echo '排序前<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
// 先对这俩个数组进行正向排序
// sort($arr1);
// sort($arr2);
rsort($arr1);
rsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';

ksort($array)和krsort($array):按键名正向或反向排序

<?php
// ksort($array):元素按键名大小从小到大重新排序
//rsort($array):元素按键名大小从大到小重新排序
$arr1 = [12=>23, 33=>53, 34=>32, 43=>2,1=> 56];
$arr2 = ['d'=>'html', 'o'=>'ss', 'f'=>'js', 'a'=>'php', 'j'=>'mysql'];
echo '排序前<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
// 先对这俩个数组进行正向排序
sort($arr1);
sort($arr2);
// krsort($arr1);
// krsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';

asort($array)和arsort($array):保留原键名正向或反向排序

<?php 
// asort($array):保留原数组的键值对应关系,元素按键名大小从小到大重新排序
//asort($array):保留原数组的键值对应关系,元素按键名大小从大到小重新排序
$arr1 = [12=>23, 33=>53, 34=>32, 43=>2,1=> 56];
$arr2 = ['d'=>'html', 'o'=>'css', 'f'=>'js', 'a'=>'php', 'j'=>'mysql'];
echo '排序前<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
// 先对这俩个数组进行正向排序

asort($arr1);
arsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';

sort($arr1);
rsort($arr2);
// krsort($arr1);
// krsort($arr2);
echo '排序后<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';




array_multisort($arr1,$arr2,$arr3...):同时对多个数组或多维数组进行排序

<?php
/*array_multisort($arr1,$arr2,$arr3...):同时对多个数组或多维数组进行排序,属于破坏性排序
排序标志:SORT_ASC升序,SORT_DESC降序
1.先创建俩个索引数组,同时对他们进行排序*/
$arr1 = [1,2,3,4,5];
$arr2 = [5,4,3,2,1];
echo '排序之前:<br/>';
echo '<pre/>';
print_r($arr1);
print_r($arr2);
echo '</pre>';
array_multisort($arr1,SORT_DESC, $arr2,SORT_ASC);
echo '排序之后:<br/>';
echo '<pre>';
print_r($arr1);
print_r($arr2);
echo '</pre>';

// 对多维数组进行排序
$arr = [
  0=>['name'=>'peter', 'age'=>28],
  1=>['name'=>'jack','age'=>23],
  2=>['name'=>'tom', 'age'=>30],
  3=>['name'=>'mike', 'age'=>49]
];
// echo '排序之前的二维数组:<br/>';
// echo '<pre>';
// print_r($arr);
// echo '</pre>';
// 按数组中的每个键值,生成一个新的数组,现在每个子数组中有俩个键值对,所以需要生成俩个数组
foreach ($arr as $key => $value) {
	$name[$key] = $value['name'];//生成新数组$name
	$age[$key] = $value['age'];//生成新数组$age
}
// echo '查看新生成的数组:<br/>';
// echo '<pre>';
// print_r($name);
// print_r($age);
// echo '</pre>';
array_multisort($name,SORT_ASC,$age,SORT_DESC,$arr);
echo '排序完成以后的数组:<br/>';
echo '<pre>';
print_r($arr);
echo '</pre>';
用数组实现数据结构中的堆栈与队列操作:

array_push和array_pop()实现堆栈操作(先进后出)

<?php
// array_push():入栈,返回值是数组的当前长度
// array_pop():出栈,返回当前弹出的元素值
$arr = ['name'=>'peter', 'age'=>28];
echo '1.当前数组的长度是:'.array_push($arr,'合肥');
echo '<pre>';
print_r($arr);//入栈的元素,总是数字索引
echo '<pre>';
echo  '2.当前数组的长度是:'.array_push($arr,[100, 200]);
echo '<pre>';
print_r($arr);//入栈的元素,总是数字索引
echo '<pre>';
echo  '2.当前数组的长度是:'.array_push($arr,'php.cn','php中文网');
echo '<pre>';
print_r($arr);//入栈的元素,总是数字索引
echo '<pre>';

echo '当前出栈的元素是:'.array_pop($arr).'<br/>';
echo '当前出栈的元素是:'.array_pop($arr).'<br/>';
echo '当前出栈的元素是:'.'<br/>';
print_r(array_pop($arr));

array_shift()和array_unshift()实现队列操作(后进后出)

<?php
//队列:后进先出,最后添加的数据,最先出队
//入队:数组头部:array_unshift(),数对:array_shift()
$arr = ['name'=>'peter','age'=>28,'sex'=>'male'];
echo '出队元素是:'.array_shift($arr).'<br/>';
echo '出队元素是:'.array_shift($arr).'<br/>';
echo '出队元素是:'.array_shift($arr).'<br/>';
echo '当前数组长度:'.count($arr);

// 从尾部入队:添加元素array_push()
array_push($arr,'php','mysql');
echo '<pre>';
print_r($arr);
echo '</pre>';
//从头部的入队操作
array_unshift($arr,'html','css');
echo '<pre>';
print_r($arr);
echo '</pre>';
其他数组处理函数:

array_rand($array,$n):从数组中取出一个或者多个元素的键名返回

shuffle($array):将数组乱序输出,原有键名全部删除,按默认索引重新排序

array_sum($arr):计算数组元素的值的总和

range($start,$end,$step):按步长生成指定范围数组

<?php  
// array_rand():从数组中随机取出一个或多个元素的键名

$arr = ['合肥','南京','武汉','杭州','上海'];
// echo array_rand($arr);//随机取出一个元素的键名
$keyArr = array_rand($arr, 2);
echo '<hr/>';

//根据随机取到的键名,阿里随机取出数组
if(count($keyArr)>0){
	foreach ($keyArr as $key=>$value){
		echo '第'.($key+1).'次随机取出的元素是:'.($key+1).'=>'.$arr[$value].'<br>';
	}
}


//shuffle()将数组乱序输出,原有键名全部删除,按默认索引重新排序
返回布尔值,1:表示成功;0:表示失败
$arr = ['hf'=>'合肥','js'=>'南京','wh'=>'武汉','上海','杭州'];
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '<pre>';
if (shuffle($arr)) {
	echo '数组打乱后,新数组如下:<br/>';
	print_r($arr);
} else {
	echo '数组打乱失败';
}
echo '</pre>';


//array_sum(array):求数组元素的和
echo array_sum([13,22,80]);
echo array_sum(['18',22,80]);
120
echo array_sum(['php','22php',80]);
102




echo '<pre>';
print_r(range(1,10));
print_r(range(1,10,2));
echo '</pre>';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值