一、数组的基础

php数组的分类

按照下标的不同,php分为关联数组与索引数组:
  索引数组:下标从零依次增长(以前那种)
  关联数组:下标为字符串格式,每个下标字符串与数组的值一一关联对应(有点儿像对象的键值对)

[关于关联数组和索引数组]
1、数组中可同时存在索引数组和关联数组;

   array(1,"one"=>2,3,5=>4,5,6,"9"=>7,8,"haha"=>9);

2、数组中所有的索引数组,如果不加指定,会去掉关联项默认增长(即关联数组不占索引位)
   array(1,2,"one"=>3,4,5); //1,2,4,5的索引-->0/1/2/3
3、如果,关联数组的key是纯 十进制整数字符串,会将此数字转为索引数组的索引值;("10.0"/"08"等格式,仍然是关联数组,不转为索引)
   array(1,2,"one"=>3,"9"=>4,"010"=>5); 1,2,4的索引-->0/1/9
4、如果手动指定关联数组的key、索引数组的下标,如果与前面已有的key或下标重复,则后指定得值会覆盖之前的值
   array(1,"one"=>2,0=>5,"one"=>6); -->打印数组: 0=>5,"one"=>6
5、如果手动指定索引数组下标,则后续自增长下标,会按照下标最大值,依次增长;
   array(1,2,7=>3,4) //1,2,3,4的下标 0/1/7/8

数组的声明方式
1、直接赋值声明
$arr[]=1;
$arr[]=1;
$arr[8]=1;
$arr[]=1;
$arr[]=1;
var_dump($arr);
2、字面量声明

$arr=[1,2,3,4,"one"=>54,6];
var_dump($arr);

3、字面量声明
$arr=array(1,2,3,4,5);
var_dump($arr);

多维数组
使用多维数组一定要注意,数组中分隔用逗号
原则上,一般不超过3层使用

二、数组的遍历

使用for循环遍历数组
count($arr);用于统计数组元素个数
for循环,只能用于遍历纯索引数组,如果存在关联数组,
count统计时会统计两种数组的个数,使用for循环
遍历混合数组,导致数组越界!

$arr=array(1,2,3,"one"=>4,5,6,7);
$num=count($arr);
//count最好放到函数外面,可以让函数值执行一次
for($i=0;$i<$num;$i++){
echo "{$i}==>{$arr[$i]}<br>";

foreach循环遍历数组

foreach可以遍历任何类型的数组!!!
写法如下↓↓↓

$arr=array(1,2,"one"=> 6,4,5);
foreach($arr as $item){
echo "{$item}<br>";
}
foreach($arr as $key=> $item){
echo "{$key}==>{$item}<br>";
}

使用list(),each(),while(),遍历函数
list():用于将数组的每个值,赋值给list函数的每一个参数,(list函数的参数,必须小于等于数组的元素个数);
  list($a,$b,$c)=[1,2,3];-->$a=1,$b=2,$c=3
注意:① list()在解析数组时,只解析索引数组;
   ② list可以通过空参数,选择性的解析数组的值
  list($a,,$b)=[1,2,3];-->$a=1;$b=3;
each():用于返回数组当前指针所在位的键值对!并将指针后移一位;
  返回值:如果指针有下一位,返回一个数组。包含一个索引数组(0-键,1-值),和一个关联数组("key"-键,"value"-值);
          如果指针没有下一位,返回false
 [使用list()/each()/while()配合遍历数组]

while(list($key,$value) = each($arr)){
echo "{$key}-->{$value}<br>";
}
reset($arr);

!!!数组使用each()遍历完一遍后,指针使用处于最后一位的下一位;即再用each(),始终返回false。

如果还需使用,需用reset($arr)函数,重置数组指针;

使用数组指针遍历数组
① next:将数组指针,向后移一位,并返回后一位的值,若后一位没有,返回false
② prev:将数组指针,向前移一位,并返回前一位的值,若前一位没有,返回false
③ end:将数组指针,移至最后一位,并返回最后一位的值,空数组返回false
④ reset:将数组指针,恢复到第一位,并返回第一位的值,空数组返回false
⑤ key:返回当前指针所在位的键
⑥ current:返回当前指针所在位的值

while(true){
  echo key($arr);
  echo "--";
  echo current($arr);
  echo "<br>";
  if(!next($arr)){
    break;
  }
}
do{
  echo key($arr);
  echo "--";
  echo current($arr);
  echo "<br>";
}while(next($arr));

三、数组的函数
返回数组所有的值,返回数组

 $arr=array(1,1,3,4,5,6,"a"=>7,"b"=>8,"c"=>9,10);
var_dump(array_values($arr));

返回数组所有的键,返回数组

var_dump(array_keys($arr));

检测数组中是否包含某个值,返回真假 (需要查询的值,数组,true(===)/false(==)) 默认false

var_dump(in_array(8, $arr,true)); //true 区分类型,false不区分

交换数组中的键和值,返回新数组

var_dump(array_flip($arr));

反转数组,返回新数组
 参数:(需要反转的数组,true 保留原有索引数组的下标与值的匹配/false 只反转值,键不反转)
 无论true/false,都不会影响关联数组,关联数组键值永远是一对
 默认false

 var_dump(array_reverse($arr,true));

统计数组中的值出现的个数,返回一个新数组
 键-->原数组的值(去重后的值)
 值-->原数组对应的值出现的次数

 var_dump(array_count_values($arr));

移除重复的值

var_dump(array_unique($arr));

过滤数组中的值
① 不传回调函数:过滤掉所有空值 ([],0,"",null,"0",false)
② 传回调函数:需要给回调函数传递一个参数,判断参数是否符合要求,若符合,return true,反之亦反
默认值为false的,显示不出来

$arr1=array(1,1,3,4,5,6,0,"", null,"a"=>7,"b"=>8,"c"=>9,10);
var_dump(array_filter($arr1,function($num){
if($num>4){
return true;
}else{
return false;
}
}));

通过回调函数,对数组的每一个值进行处理操作

执行时,会给回调函数传递两个参数,分别是数组的value,key,然后可以在回调函数中,对值和键进行处理
但是,牵扯到修改值的时候,必须要传递地址&!!!!

$fruits=array("d"=>"apple","a"=>"orange","b"=>"banana","c"=>"lemon");
var_dump(array_walk($fruits,function(&$item,$key,$num){
echo "{$key}-->{$item}<br>";
$item.=$key;
$item.=$num;
},"10"));
var_dump($fruits);

将数组的每个值,交由回调函数进行映射处理
array_map():参数一:回调函数;参数二:>=1个数组
有几个数组,可以给回调函数传几个参数,表示每个数组的一个value
可以对value进行处理,处理完后通过return返回,那么新数组的对应的值就是你return回去的值
【array_map与array_walk的异同】
 相同点:都能遍历数组,通过回调函数,重新处理数组的每一个值
 不同点:① walk只能传一个数组,回调函数接受这个数组的值和键, map能传多个数组,回调函数接受每个数组的值
     ② walk直接修改原数组,而map不修改原数组,将新数组返回
     ③ walk可以给回调函数传递一个其余参数,map只能传递数组的值
     ④ 处理方式上,walk如果需要改掉原数组的值,需在回调函数中传递地址,直接改变变量的值
 而map,是通过将新的值,用return返回,即可修改新数组的值

排序

sort -- 对数组排序(升序):可以传入两个参数,(数组,1 作为数字 按照数字排序/2 作为字符串 按照ASC码排序)
rsort -- 对数组逆向排序(降序)
usort -- 使用用户自定义的比较函数对数组中的值进行排序

usort($arr1,function($a,$b){
return $a-$b;
});
var_dump($arr1);

下述三个常用于关联数组排序,用法同上

asort -- 对数组进行排序并保持索引关系(关联数组排序)
arsort -- 对数组进行逆向排序并保持索引关系
uasort -- 用户自定义的比较函数对数组进行排序并保持索引关联
 
ksort -- 对数组按照键名排序
krsort -- 对数组按照键名逆向排序
uksort -- 使用用户自定义的比较函数对数组中的键名进行排序

自然排序:数组0-9;字母a-z,下面两个函数,都是按照自然排序,且会保留键值关联
natsort -- 用“自然排序”算法对数组排序
natcasesort -- 用“自然排序”算法对数组不区分大小写字母排序


array_multisort -- 对多个数组或多维数组进行排序
 参数一:第一个数组(必选)
     之后都是可选参数:SORT_DESC/SORT_ASC(升降序)、SORT_STRING/SORT_NUMBERIC(按照数字还是字符串排序)
     再之后,是多个可选数组

排序规则:先排第一个数组,之后的数组,按照与第一个数组对应的关系,逐列移动
      如果对多个数组排序,需保持长度一致,否则会警告

$arr1=array(1,2,3,50,7,10,13,20);
sort($arr1);
var_dump($arr1);
$arr1=array(1,2,7,4,8,9,"haha");
$arr2=array(6,9,"hehe",4,7,3,8);
array_multisort($arr1,SORT_DESC,SORT_STRING,$arr2);
var_dump($arr1);
var_dump($arr2);

array array_slice ( array $array ,int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )

① 数组,必须

② 从第几位开始截取,必选,负数表示,从右边数第几位(按照数组的顺序,而不是按照下标)
③ 截取的长度,可选,默认截到最后
④ Boolean类是否保持键值关联,可选。默认,索引重新排序,传true保持索引关联

 array array_splice ( array &$input ,  int $offset [, int $length = 0 [, mixed $replacement ]] )
返回值:被删掉的数组
参数:
  ① 数组的地址,会修改原地址
  ② 从第几位开始删、替换;
  ③ 删除或替换的长度
  ④ 为空,表示删除操作;传入内容,表示替换操作的新值

 $arr=array(1,2,3,"one"=>4,"two"=>5,"three"=>6,7,8,9);
$arr1=array_splice($arr,4,3);
var_dump($arr1);
var_dump($arr);

array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 

 两个数组必须保持一致,否则报警告,返回false

 $arr1=array(1,2,3,4,5);
$arr2=array(6,7,8,9,0);
$arr3=array_combine($arr1, $arr2);
var_dump($arr3);

array_merge — 合并一个或多个数组

 合并多个数组,如果数组中出现相同的关联键值,后面的会被覆盖

$arr1=array(1,2,3,"a"=>4,5);
$arr2=array(6,7,8,"a"=>9,0);
$arr3=array_merge($arr1, $arr2);
var_dump($arr3);

 array_intersect — 计算数组的交集

array array_intersect ( array $array1 , array $array2 [, array $ ... ] )
数组取交集,结果会保留第一个数组的键值关联匹配

 $arr1=array(1,2,9,"a"=>4,5);
$arr2=array(6,7,8,"a"=>9,5);
$arr3=array_intersect($arr1, $arr2);
var_dump($arr3);

array_diff — 计算数组的差集

array array_diff ( array $array1 , array $array2 [, array $... ] )
取出多个数组中,在一个数组中包含,而其他数组中不包含的值,保留键值关联

 $arr1=array(1,2,9,"a"=>4,5);
$arr2=array(6,7,8,"a"=>9,5);
$arr3=array_diff($arr1, $arr2);
var_dump($arr3);

array_pop() 弹出并返回 array 数组的最后一个单元(值),并将数组 array 的长度减一。

如果 array 为空(或者不是数组)将返回 NULL。 此外如果被调用不是一个数则会产生一个 Warning。
array_push() 数组的最后,放入1-多个值,返回处理之后的元素个数
array_shift() 删除第一个值,并返回这个值
array_unshift() 数组的开头,放入1-多个值,返回处理之后的元素个数

 $arr1=array(1,2,9,"a"=>4,5);
$arr3=array_unshift($arr1,8);
var_dump($arr3);

PHP中的数组的更多相关文章

  1. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  2. JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

  3. java 在循环中删除数组元素

    在写代码中经常会遇到需要在数组循环中删除数组元素的情况,但删除会导致数组长度变化. package com.fortunedr.thirdReport; import java.util.ArrayL ...

  4. Objective-C中把数组中字典中的数据转换成URL

    可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对.而在OC我们要用字典(Dictionary)来存储,当然了Java用的是M ...

  5. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  6. C++中的数组

    数组名作为参数时,传递的是数组的首地址, 主调函数中实参数组元素个数不应该少于形参数组的元素个数 把数组名作为参数时,一般不指定数组第一维的大小 即使指定,编译时也会被忽略的.

  7. javascript中关于数组的一些鄙视题

    一.判断一个数组中是否有相同的元素 /* * 判断数组中是否有相同的元素的代码 */ // 方案一 function isRepeat1(arrs) { if(arrs.length > 0) ...

  8. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

  9. Javascript中判断数组的正确姿势

    在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...

  10. C#中的数组,多维数组和交错数组

    想研究一些面向对象的东西,也许是代码写得还不够多.感觉还不好,看那些教程,不是嫌太水就是太难看不懂.心情很是落寞 不过再怎样也要坚持每天发一篇博客. 这篇来说一下C#中的数组,多维数组,交错数组的一些 ...

随机推荐

  1. Java 环境下载设置

    本篇文章出处: http://www.cnblogs.com/xiaofeixiang/p/4085159.html 和 https://www.cnblogs.com/renqiqiang/p/68 ...

  2. Fix: Unable to terminate process ‘Access is denied’ 杀进程,关服务

    https://appuals.com/fix-unable-to-terminate-process-access-is-denied/ 我 Process Hacker (方法3),成功杀掉: 阿 ...

  3. Flink监控:Monitoring Apache Flink Applications

    This post originally appeared on the Apache Flink blog. It was reproduced here under the Apache Lice ...

  4. MacOS 的预览 Preview 打开pdf 容易卡死 解决方案

    MacOs 10.13.6 打开pdf之后容易卡死. 移动一下窗口之后就卡死了. 有时候等一会还能缓过来,有时候就缓不过来了. 只要执行下这个命令就可以了. sudo rm -rf ~/Library ...

  5. css display和vertical-align 属性

    display 定义和用法 display 属性规定元素应该生成的框的类型. 实例 <html> <head> <style type="text/css&qu ...

  6. 基于jQuery实现简单的js模块化

    在多人合作完成网页,经常遇到大家的js代码相互影响的问题.现在有许多模块化的前端框架,应该是可以解决这个问题.但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解 ...

  7. 08 Django REST Framework 解决前后端分离项目中的跨域问题

    01-安装模块 pip install django-cors-headers 02-添加到INSTALL_APPS中 INSTALLED_APPS = ( ... 'corsheaders', .. ...

  8. 01-Django介绍和安装

    01-Django介绍和安装 1.Django介绍 1.1介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M(Model),视图V(View)和控 ...

  9. Python----简单线性回归

    简单线性回归 1.研究一个自变量(X)和一个因变量(y)的关系   简单线性回归模型定义:y=β0+β1x+ε 简单线性回归方程:E(y)=β0+β1x 其中: β0为回归线的截距 β1为回归线的斜率 ...

  10. Java 关于cannot resolve symbol 'log'报错问题

    我用的是IDEA,报错的内容是:cannot resolve symbol 'log' 如图所示: 解决方法: 1.安装插件:Settings→Plugins,输入lom回车: 2.然后选择Insta ...