04-数组

数组

php的数组十分特殊,确切的说,它是由键值对构成的数组,就类似于C++的map,但是仍然可以用不带键的序列去表示正常的数组。

创建数组

  • $arr1 = array(key1=>value1,key2=>value2);
  • $arr2 = array(value1,value2,value3);
  • $arr3 = [key1=>value1,key2=>value2];
  • $arr4 = [value1,value2,value3];

注意点:

  • 其中数组的key可以写,也可以不写。
  • 数组的key存在时,只能时integet或者string类型,如果是其它类型,会自动强制转换成integer类型或者string类型,但是value可以是任何类型。当数组没有key时,会默认从下标0开始设置key
  • 数组中相同的key的项,后面的会覆盖前面的。
  • 数组可以同时存在带key的项,和不带key的项。不带key的项,自动为key设置为int类型,且这个key的数字是根据自己左边第一个key是int来决定的。假设这个数字是1,那么自己的key就默认是2,假设左边没有一个key是int的,自己的key就是0(从当前位置向左找,不是直接从开头找)

    $arr1 = array(1,2,3,4);//不带key的
    print_r($arr1);//0=>1  1=>2  2=>3  3=>4
    $arr2 = array(1=>"d",2=>"z",3=>"p");//全是带key的
    print_r($arr2);//1=>d 2=>z 3=>p
    $arr3 = array("f1"=>1,"f2"=>2,2=>4,3,10=>"4");//混合存在key和不存在key的
    print_r($arr3);//f1=>1 f2=>2 2=>4 3=>3 10=>4
    /*----------key不是int/string类型的数组,key自动转换为int/string-----------*/
    $arr4 = array(1.99=>1,1.1=>2,3,false=>"4");
    print_r($arr4);//1.99被转换为1,1.1也被转换为1,所以后面的覆盖前面的1=>2 false被转换为0,所以0=>"4";
    

数组添加元素

添加元素的格式

  • 数组变量[key] = value

添加元素的注意点

  • 当数组中存在对应的key时,那么它的value会被新插入的覆盖。

    $arr = array(1=>"d",2=>"z");
    print_r($arr)//1=>d 2=>z;
    $arr[1] = "z";
    print_r($arr);//1=>z 2=>z;

数组删除元素

删除元素的格式

  • unset(数组变量[key]);

删除元素的注意点

  • 当数值删除对应的元素时,数组不会立马重新排序,原来的int类型的key还是保持原样。
  • 如果需要让数组删除元素后,重新排序,需要用array_values(数组名)去将值拷贝到新数组里

newarr = array_values(数组变量);


    $arr = array(1,2,3);
    print_r($arr);
    unset($arr[0]);
    print_r($arr);//1=>2 2=>3
    $newarr = array_values($arr);
    print_r($newarr);//0=>2 1=>3

数组修改和查找元素

修改元素的格式

  • 数组变量[key] = value

数组元素的修改就是利用覆盖之前对应key的值去修改。

查找数组的元素

  • echo 数组变量[key];

    $arr = array(1=>"d",2=>"z");
    print_r($arr)//1=>d 2=>z;
    $arr[1] = "z";
    print_r($arr);//1=>z 2=>z;
    echo($arr[1])//z;

数组的遍历

数组的遍历我们通常采用for循环遍历和php自带的foreach进行遍历。

php也是有数组指针的,用来指向当前数组的元素的位置,下面列出几个数组指针的函数

key(数组):获取当前数组指针指向的key
current(数组):获取当前数组指针指向的key
reset(数组):将当前数组指针指向第一位
next(数组):将当前数组指针下移一位
count(数组):返回数组元素个数

有了数组指针我们才可以用for遍历关联数组,下面分别是for和foreach遍历索引数组和关联数组,其中foreach数组的本质就是逐个取出数组的每一个键值对

$arr1 = array(1,2,3,4);//索引数组
$arr2 = array("aaa"=>"123","bbb"=>"ddd");

//for循环遍历索引数组
for($i=0;$i<count($arr1);$i++)
{
    echo $arr1[$i];
}
//for循环遍历关联数组
reset($arr2);
for($i=0;$i<count($arr1);$i++)
{
    echo key[$arr2]." ".current[$arr2];
    next($arr2);
}
//foreach循环遍历索引数组
foreach($arr1 as $key=>$value)
{
    echo $key." ".$value;
}
//foreach循环遍历索引数组
foreach($arr2 as $key=>$value)
{
    echo $key." ".$value;
}

对比后,我们可以发现for遍历索引数组方便,遍历关联数组还需要数组指针,因为索引不是从0开始的,而且它遍历索引数组,还得要去索引数组是从0开始连续的。而foreach进行数组遍历,不管索引数组还是关联数组都是一套代码完成的。因此我们更推荐使用foreach进行数组遍历

数组的其它操作

list()将数组的值赋给多个变量

格式:

$arr = array(1,2,3,4,5);
list[$a,$b,$c] = $arr;//a = 1,b = 2,c = 3

注意点:

数组必须是索引从0开始的所以数组

array-values()

array-values(数组)将数组的所有值重新保存在一个新数组里,返回值是一个保存数据的数组。

注意点:只会保存原来数组的值,新数组是一个索引从0开始的递增数组。

$arr1 = array(2,3,4);
$newarr = array-values($arr1);
print_r($newarr);//0=>2 1=>3,2=>4;

array-keys()

array-keys(数组)将数组的所有键值key重新保存在一个新数组里,返回值是一个保存所有key的数组。

注意点:只会保存原来数组的key,新数组是一个索引从0开始的递增数组。

$arr1 = array("ddd"=>2,0=>3,"fff"=>4);
$newarr = array-keys($arr1);
print_r($newarr);//0=>ddd 1=>0,2=>fff;

array_key_exist()

array_key_exist(key,数组),用来判断数组是否有这个key(键值),返回值是bool

$arr1 = array(2,3,4);
echo array_key_exist(1);//true

in_array()

in_array(value,数组),用来判断数组是否有某个value值,返回值是bool

$arr1 = array(2,3,4);
echo array_key_exist(3);//true

array_search();

array_search(value,数组),用来判断数组是否有某个value值,返回值是这个值的key

$arr1 = array(2,3,4);
echo array_search(3);//1

array_count_values();

array_count_values(数组),用来统计数组每个值出现的次数,返回的是一个新数组,保存原数组每个值出现的次数,因为新数组的键值就是原数组的value,所以待统计数组的value,必须是int/string类型的

$arr = array("aaa",1,"aaa","1","bbb");

$newarr = array_count_values($arr);

print_r($newarr);//arr=>2 1=>2 bbb=>1

array_unique()

array_unique(数组),用于删除数组里重复出现值的项,后面重复出现的项会被删除掉

$arr = array("aaa",1,"aaa","1","bbb");
$newarr = array_unique($arr);
print_r($newarr);//0=>arr,1=>1 2=>bbb;

range(起始,结束,步长)

$arr = range(0,9);//创建一个起始从0到9的数组
print_r($arr);//0,1,2,3,4,5,6,7,8,9

array_sum(数组)

array_sum()//返回数组所有元素值的和
echo array_sum(array(1,2,3));//6    

数组结合回调函数

通过回调函数把数组结合起来,可以十分灵活的处理数组的数据,既可以改变数组的数据,又可以间接访问数组的数据。

array_filter(数组,回调函数);
array_walk(数组,回调函数);

array_filter()用于过滤数组的元素,其内部的回调函数是返回值应该是bool,返回值是一个数组,保存筛选后的元素
array_walk()是对数组每个元素进行不同的操作,比较灵活。
//寻找偶数
function even($num)
{
    if($num%2==0)
    {
        return true;
    }else{
        return false;
    }
}
//加法,参数是饮用传递
function add1(&$num)
{
    $num += 1;
}
$arr = array(1,2,3,4);
array_filter($arr,"even");//2,4
array_walk($arr,"add1");
print_r($arr);//2,3,4,5;

数组的排序

下面数组的排序都是直接操作原数组的

sort(数组);//按照值从小到大排序,原数组的键值被破坏。键值成为从0递增
rsort(数组);//按照值从大到小排序,原数组的键值被破坏。键值成为从0递增
$arr = array("bbb"=>10,"cc"=>9);
sort($arr);
print_r($arr);//0=>9 1=>10;


ksort(数组);//按照key从小到大排序
krsort(数组);//按照key从大到小排序
$arr = array("bbb"=>10,"cc"=>9);
ksort($arr);
print_r($arr);//bbb=>10 cc=>9;


asort(数组)//按照值从小到大排序,但是索引不会被破坏
arsort(数组)//按照值从大到小排序,但是索引不会被破坏
$arr = array("bbb"=>10,"cc"=>9);
asort($arr);
print_r($arr);//cc=>9 bbb=>10;


array_multisort(数组1,SORT_DESC/SORT_ASC,数组2,SORT_DESC/SORT_ASC);//对多个数组进行值的升序或者降序排序,每个数组后面的是升序或者降序
$arr1 = array(1,2,3);
$arr2 = array("bb","dd","aaa");
array_multisort($arr1,SORT_DESC,$arr2,SORT_ASC)//对arr1数组降序,arr2数组升序
print_r($arr1);//3 2 1
print_r($arr2);//aaa bb dd

数组模拟栈

array_push(数组,值):入栈,返回数组当前长度
array_pop():出栈,返回出栈元素
$arr18 = array(1,2,3);
array_push($arr18,4);
print_r($arr18);//1 2 3 4
array_pop($arr18);
print_r($arr18);//1 2 3

数组模拟队列

array_shift(数组):出队列,返回出队列的值
array_push(数组,元素):入队列
$arr19 = array(1,2,3);
array_push($arr18,4);
echo array_shift($arr18);//1
print_r($arr19);//2 3 4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 前言 每一种编程语言中,几乎都有数组这种数据类型。不过它不仅仅是一种数据类型,同时还是一种基础的、很常见的数据结构...
    程序员网址导航阅读 290评论 0 0
  • [注] 使用数组的目的,是为了方便地批量定义变量 [前言] c语言中提供了数组,可以实现批量地定义相同类型的变量,...
    忘带充电宝de皮卡丘阅读 347评论 0 2
  • 一维数组 数组名 a称之为标量,即单一的一个值 b称之为数组,因为他是一些值的集合 数组名和下标一起使用,用于标识...
    DamageDurex阅读 322评论 0 0
  • 第三章 数组 数组是一个可以存储一组或一系列数值的变量 一个包含其他数组的数组称为多维数组。 关联数组允许使用更...
    梁烨端木阅读 659评论 0 0
  • JavaScript 的Array可以包含任意数据类型,并通过索引来访问每个元素。 表示方式 获取数组的元素个数 ...
    已重置2020阅读 215评论 0 1