PHP中的数组

一、数组的基础

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); 
时间: 2024-10-10 01:24:26

PHP中的数组的相关文章

C++中字符数组和字符串string

字符数组 C++中字符数组用char str[]可以用来表示一个字符串. (1)   数组的大小和字符串的长度. 数组的大小一定要大于字符串的长度,因为系统会自动补上一个'\0'作为字符串的结束标志.当然对于未初始化的也补'\0'. #include <iostream> #include <string> using namespace std; int main() { char str[11] = "I am happy"; // 系统会自动补上'\0'空

js中的数组对象排序

一.普通数组排序 js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var arr = ["a", "b", "A", "B"]; arr.sort(); console.log(arr);//["A", "B", "a", "b"

[转]:Delphi XE中泛型数组的使用范例

Delphi XE中泛型数组的使用范例,下面的范例简单的使用了泛型字符串数组,如用 TArray 代替 array of Word, 还可以使用 TArray 类提供的算法(就是少了点). uses Generics.Collections, Generics.Defaults; {测试 TArray 的 Sort 方法} procedure TForm1.Button1Click(Sender: TObject); var arr: TArray<string>; //同 array of

在for、foreach循环体中添加数组元素

在开发工作中遇到这样一种情形,需要在循环体中动态向遍历中的数组添加元素并在当前循环遍历中使用数组的全部元素. 首先使用foreach循环来遍历数组,将代码简化抽象如下: $arr = array(1, 2, 3, 4, 5, 6, 7, 8); foreach($arr as $v) { if($v % 2 == 0) $arr[] = 11; echo $v . ' '; } 结果只打印出数组原来已有元素,在循环体中动态添加的元素并没有打印出来. 后来改用for循环,coding如下: $ar

C++中的数组问题

C++中的数组问题 1. 数组赋值与初始化 (1)直接初始化: int arr[3]={1,2,3}: (2)遍历访问初始化: for(i = 0;i< 3;i++) //直接读入,或者用别的数组,以及别的(i+1)等. (3)内存操作函数: memset(arr,3,abs);//abs为另一个已知的数组. (4)字符串赋值函数,仅限于char型数组. strcpy(arr,abs) ;abs为一字符串或者char型数组. 2. 数组操作的函数 (1)memset: 作用:Fill block

Sliverlight linq中的数组筛选数据库中的数据

首先 什么是linq呢 ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. 它是.NET框架的扩展,它允许我们以数据库查询的方式查询数据集合. 借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据. 接下来讲讲我工作中用到的 linq中的数组筛选数据库中的数据 public List GetList1(string cardPhone,string

慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组

来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法:  或者  其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简单地说,就是指定数组中最多可存储多少个元素 语法:  其中,数组长度就是数组中能存放元素的个数,如: 话说,我们也可以将上面的两个步骤合并,在声明数组的同时为它分配空间,如: 3. 赋值 分配空间后就可以向数组中放数据了,数组中元素都是通过下标来访问的,例如向 scores 数组中存放学生成绩 4.

C语言中对数组名取地址

在C/C++中,数组名相当于一个指针,指向数组的首地址.这里"相当于"不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一个操作. 如果声明有如下数组: int arr[5]; 那么,&arr这个操作得到了什么值呢? 如果简单的认为arr就是一个指向数组首地址的指针的话,那么很自然会想到&arr得到的是一个指向存放arr这个指针的指针,也就是一个二级指针,然而事实却并不是这样. 观察以下代码:

把数组中的数据提取出来,包括数组中的数组

/*** 用闭包 实现数组中及数组内部数组 的数据提取出来*/ var myarr = [1,2,8,[3],[4,[5,[6],['a','b']],[9]]]; function tqFun(qcArr1){ var tempArr = []; function bbFun (qcArr){ for(var i=0; i<qcArr.length; i++){ if(qcArr[i] instanceof Array){ bbFun(qcArr[i]); }else{ tempArr.pus

在Java中判断数组中包含某个元素的几种方式的比较

闲来无事,将java中判断数组中包含某个元素的几种方式的速度进行对比,直接上代码 talk is cheap, show you the code package test.contain.lishaojie; import java.util.Arrays;import java.util.HashSet;import java.util.Set; public class TestContain { /** * @param args */ public static void main(S