数组

Posted xiukang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组相关的知识,希望对你有一定的参考价值。

什么是数组

 传统上把数组(array)定义为一组某种共同特性的元素,这里的共同特性包括相似性和类型等,每个元素由特殊的标识符来区分,这称为键(key)

php的数组的元素可以不为同一种类型

创建数组

PHP提供了正式和非正式的数组声明方法

  • 非正式的数组声明方法
<?php
    //创建数组
    $xiu[0] = "xiu";
    $xiu[1] = "kang";
    $xiu[2] = "ai";
    //...
    $xiu[99] = "wo";
    //显示数组$xiu第二个元素
    echo $xiu[1];//输出 "kang"
?>

如果索引值是数值,而且还是递增的,就可以在创建时省略索引值

<?php
    //创建数组
    $xiu[] = "xiu";
    $xiu[] = "kang";
    $xiu[] = "ai";
    $xiu[] = "wo";
    //显示数组$xiu第二个元素
    echo $xiu[1];//输出 "kang"
?>

创建关联数组

<?php
    //创建关联数组
    $xiu["sichuan"] = "deyang";
    $xiu["sichuan"] = "chengdu";
    $xiu["shanghai"] = "jinshan";
    $xiu["shanghai"] = "baoshan";
?>
  • 用array()创建数组(正式)

 array()函数接受0个或多个元素作为输入,返回一个包含这些输入元素的数组

<?php
    $xiu = array("xiu","kang","ai","wo");
?>

使用array()创建关联数组

<?php
    $xiu = array(
    "sichuan"=>"deyang",
    "sichuan"=>"chengdu",
    "shanghai"=>"jinshan",
    "shanghai"=>"baoshan"
    );
?>
  • 用list()提取数组

 list()与 array()类似,只是它可以在一次操作中从数组提取多个值,同时为多个变量赋值

<?php
    /*
    打开text.txt文件
    文件每一行包括用户名,密码和喜欢的颜色,每一项用竖线分隔
    其中一行为 xiu|123|red
    */
    $users = fopen("text.txt","r");
    //若未达到EOF,则获取下一行(EOF=资料源无更多的资料可读取)
    while($line = fgets($users,4096)){
        //用explode()分离数据判断
        list($user,$pass,$color) = explode("|",$line);
        //格式化数据并输出
        printf("user: %s ",$user);
        printf("pass:%s ",$pass);
        printf("color:%s <br/>",$color);
    }
    //关闭流
    fclose($users);
?>

注:list()依靠函数explode()(它返回一个数组)将每一行分解为三个元素这里explode()用竖线作为元素的分隔符,然后这些元素分别赋给$user,$pass,$color

  • 用预定义的值范围填充数组
<?php
    $xiu = range(0,20,3);//创建0-20的数组,间隔为3
    //$xiu = array(0,3,6,9,12,15,18);
?>

也可以创建字母数组

<?php
    $xiu = range("A","E");//创建A到E的数组
    //$xiu = array("A","B","C","D","E");
?>
  • 测试数组

 is_array()判断某个变量是否为数组

<?php
    $xiu = array();
    echo is_array($xiu);输出结果为1 (true)
?>

输出数组

用foreach()输出数组

<?php
    $xiu = array("xiu","kang","sear");
    foreach($xiu as $kang){
        echo "$kang<br/>";
    }
    // 输出结果为xiu kang sear
?>

打印数组用以测试

<?php
    $xiu = array("xiu","kang","sear");
    print_r($xiu); //输出结果为:Array ( [0] => xiu [1] => kang [2] => sear ) 
?>

 

输出多维数组(数组的数组)

(。。。)

添加或删除数组元素

  • 在数组头添加元素

 array_unshift()函数在数组头添加元素,所有的数值键都会修改,关联键不受影响

<?php
    $xiu = array("xiu","kang");
    array_unshift($xiu,"wo","ai");
    //xiu = array("wo","ai","xiu","kang");
?>
  • 在数组尾添加元素

 array_push()函数在数组尾添加元素,添加新值后返回数组的元素的总数

<?php
    $xiu = array("xiu","kang");
    array_push($xiu,"ai","wo");
    //xiu = array("xiu","kang","ai","wo");
?>
  • 在数组头删除元素

 array_shift()函数删除并返回数组中的第一个元素,如果使用的数值键,则所有相对应的键都会下移,关联键不受影响

<?php
    $xiu = array("xiu","kang");
    array_shift($xiu);
    //$xiu = array("kang");
?>
  • 在数组尾删除元素

 array_pop()函数删除并返回数组中最后一个元素

<?php
    $xiu = array("xiu","kang");
    array_pop($xiu);
    //$xiu = array("xiu");
?>

定位数组元素

  • 搜索数组

 in_array()函数在数组中搜索特定的值,如果有这个值则返回true,否则返回false

<?php
    $xiu = array("xiu","kang");
    //判断$xiu数组中是否有"kang"这个元素
    echo in_array("kang",$xiu,"string");//返回1 第三个参数为可选,强制in_array()在搜索时考虑类型
?>

索关联数组键

array_key_exists()函数搜索关联数组中指定的键,如果有这个键则返回true,否则返回false

<?php
    $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中");
    array_key_exists("kang",$xiu);
?>

索关联数组值

array_search()函数搜索关联数组中指定的值,如果有这个值则返回相对应的键,否则返回false

<?php
    $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中");
    echo array_search("抗",$xiu);
?>
  • 获取数组键
<?php
    $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中");
    array_keys($xiu);//获取$xiu数组中所有的键
    array_keys($xiu,"抗");//获取$xiu数组中值为"抗"的键
?>
  • 获取数组值
<?php
    $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中");
    array_values($xiu);//获取$xiu数组中所有的值,并自动获取对应的键
?>

遍历数组

  • 获取当前数组键

key()函数返回当前指针所在位置的键 

<?php
    $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中");
    while($key = key($xiu)){
        echo "$key<br/>";
        next($xiu);//将指针移到下一个元素
    }
?>
  • 获取当前数组值

 current()函数返回数组中当前指针所在位置的数组值

<?php
    $xiu = array("xiu"=>"修","kang"=>"抗","zhong"=>"中");
    while($key = current($xiu)){
        echo "$key<br/>";
        next($xiu);//将指针移到下一个元素
    }
?>
  • 移动数组指针

 next()函数返回当前指针下一个位置的数组值(数组默认指针为第一个元素)

<?php
     $xiu = array("xiu","kang","sear");
     echo next($xiu);//返回"kang"
     echo next($xiu);//返回"sear"
?>

prev()函数返回当前指针前一个位置的数组值,如果指针为第一个,则返回false

<?php
     $xiu = array("xiu","kang","sear");
     echo next($xiu);//返回"kang"
     echo prev($xiu);//返回"xiu"
?>

reset()函数将指针移到第一个数组位置

<?php
     $xiu = array("xiu","kang","sear");
     reset($xiu);
?>

end()函数将指针移到最后一个数组位置

<?php
     $xiu = array("xiu","kang","sear");
     end($xiu);
?>
  • 向函数传递数组值

 用户自定义函数必须有两个参数,一个表示数组值,一个表示数组键

<?php
    function xiu($val,$key){
        echo "$key**$val<br>";
    }
    $kang = array("1"=>"2","3"=>"4","5"=>"6");
    array_walk($kang,"xiu");
    /*
    1**2
    3**4
    5**6
     */
?>

确定数组的大小和唯一性

  • 确定数组的大小

 count()函数返回数组中值的总数

<?php
    $xiu = array("xiu","kang","sear");
    echo count($xiu);//因为有三个值,所以返回3
?>

sizeof()函数是count()的别名,他们的功能是一样的

  • 统计数组元素出现的频次

 array_count_values()函数返回一个关联数组,键表示值,值表示这个数组的值出现的次数

<?php
    $xiu = array("xiu","kang","kang");
    $kang = array_count_values($xiu);
    print_r($kang);//Array ( [xiu] => 1 [kang] => 2 ) 
?>
  • 确定唯一的数组元素

 array_unique()函数会删除数组中所有重复的值,并返回一个由唯一值组成的数组

<?php
    $xiu = array("xiu","kang","kang");
    $kang = array_unique($xiu);
    foreach($kang as $sear){
        echo "$sear<br/>"; //返回"xiu","kang"
    }
?>

数组排序

  • 逆置数组元素的顺序

 array_reverse()函数将数组中的元素的顺序倒叙

<?php
    $xiu = array("xiu","kang","sear");
    $kang = array_reverse($xiu,true);//将数组倒叙,true表示将键也倒叙,关联数组不受影响
?>
  • 置换数组的键和值

 array_flip()函数将数组中的键和值交换位置

<?php
    $xiu = array("xiu","kang","sear");
    $kang = array_flip($xiu);
    print_r($kang);//Array ( [xiu] => 0 [kang] => 1 [sear] => 2 ) 
?>
  • 数组排序

 sort()函数将数组的元素值进行升序(由低到高),键将会重新从0开始

rsort()函数将数组的元素值进行降序(从高到底),键将会重新从0开始

<?php
    $xiu = array("5","3","9");
    sort($xiu);//将数组由低到高排序
    print_r($xiu);//Array ( [0] => 3 [1] => 5 [2] => 9 ) 
?>

asort()函数与sort()函数相同,只是保存键值对关系

arsort()函数和rsort()函数相同,只是保存键值对关系

<?php
    $xiu = array("a"=>"5","b"=>"3","c"=>"9");
    asort($xiu);//将数组由低到高排序
    print_r($xiu);//Array ( [b] => 3 [a] => 5 [c] => 9 ) 
?>

natsort()函数提供了一种平常使用的排序机制,升序

natcasesort()函数与natsort()函数相同,只是不区分大小写

<?php
    $xiu = array("xiu3a","xiu1a","xiu2a");
    natsort($xiu);//将数组由低到高排序
    print_r($xiu);//Array ( [1] => xiu1a [2] => xiu2a [0] => xiu3a ) 
?>

ksort()函数按键的大小排序,升序

krsort()函数按键的大小排序,降序

<?php
    $xiu = array("b"=>"5","a"=>"3","c"=>"9");
    ksort($xiu);//将数组由低到高排序
    print_r($xiu);//Array Array ( [a] => 3 [b] => 5 [c] => 9 )  
?>

shuffle()函数将对数组随机排序

<?php
    $xiu = array("a","b","c");
    shuffle($xiu);//随机排序
    print_r($xiu);//Array ( [0] => c [1] => a [2] => b ) 每次结果不一样
?>

usort()函数自定义数组排序

(。。。)

合并,拆分,接合和分解数组

  • 合并数组

 array_merge()函数将两个或以上的数组进行合并,会忽略数组的键

<?php
    $xiu = array("a","b","c");
    $kang = array("7","8","9");
    $sear = array_merge($xiu,$kang);//合并数组
    print_r($sear);//Array ( [0] => a [1] => b [2] => c [3] => 7 [4] => 8 [5] => 9 ) 
?>
  • 递归追加数组

 array_merge_recursive()函数与array_merge()函数差不多

如果数组元素的键为数字则会忽略,会被重新赋值,而其他类型不会

<?php
    $xiu = array("a"=>"b","4"=>"d");
    $kang = array("e"=>"f","7"=>"h");
    $sear = array_merge_recursive($xiu,$kang);//合并数组
    print_r($sear);//Array ( [a] => b [0] => d [e] => f [1] => h ) 
?>
  • 合并两个数组

 array_combine()函数会生成一个新的数组

输入的两个数组大小必须相同,不能为空

第一个数组为键,第二个数组为值

<?php
    $xiu = array("a","b");
    $kang = array("c","d");
    $sear = array_combine($xiu,$kang);
    print_r($sear);//Array ( [a] => c [b] => d ) 
?>
  • 拆分数组

 array_slice()将返回数组中的一部分

<?php
    $xiu = array("a","b","c","d","e","f");
    $kang = array_slice($xiu,3);//拆分第三个元素之后的元素,如果是 -3 则拆分最后三个元素
    print_r($kang);//Array ( [0] => d [1] => e [2] => f ) 
?>

拆分第二个元素之后和最后两个元素之前的元素

<?php
    $xiu = array("a","b","c","d","e","f");
    $kang = array_slice($xiu,2,-2,true);//拆分第二个元素之后和最后两个元素之前的元素,true表示保持数组对应的键
    print_r($kang);//Array ( [0] => c [1] => d ) 
?>
  • 接合数组

 array_splice()函数删除选择的元素

<?php
    $xiu = array("a","b","c","d","e","f");
    $kang = array_splice($xiu,3);//删除数组中第三个元素之后的元素
    print_r($kang);//Array ( [0] => d [1] => e [2] => f ) 
?>

替换数组元素

<?php
    $xiu = array("a","b","c","d");
    $kang = array_splice($xiu,2,-1,array("x","y"));//删除数组第二个元素之后和最后一个元素之前的元素,并替换为"x","y"
    print_r($kang);//Array ( [0] => c ) 
    print_r($xiu);//Array ( [0] => a [1] => b [2] => x [3] => y [4] => d ) 
?>
  • 求数组的交集

 array_intersect()返回第一个数组中且其他数组中有的值(忽略键)

array_intersect_assoc()回第一个数组中且其他数组中有的键值对(键值必须一样)

<?php
    $xiu1 = array("a","b","c","d");
    $xiu2 = array("e","a","c","f");
    $xiu3 = array("c","g","h","a");
    $diff = array_intersect($xiu1,$xiu2,$xiu3);
    print_r($diff);//Array ( [1] => a [3] => c ) 
?>
  • 求数组的差集

 array_diff()返回第一个数组中且其他数组中没有的值(忽略键)

array_diff_assoc()回第一个数组中且其他数组中没有的键值对(键值必须一样)

<?php
    $xiu1 = array("a","b","c","d");
    $xiu2 = array("e","a","c","f");
    $xiu3 = array("c","g","h","a");
    $diff = array_diff($xiu1,$xiu2,$xiu3);
    print_r($diff);//Array ( [1] => b [3] => d ) 
?>

其他有用的数组函数

  • 返回一组随机的键

 array_ranf()函数返回一组随机的键

<?php
    $xiu = array("a"=>"b","c"=>"d","e"=>"f");
    $kang = array_rand($xiu,2);//返回2个随机的键
    print_r($kang);
?>
  • 对数组的的值进行求和

array_sum()函数返回数组值的合,会忽略字符串

<?php
    $xiu = array(3,"holle",4);
    echo array_sum($xiu);//返回7
?>
  •  划分数组

 array_chunk()函数将数组划分成多维数组

<?php
    $xiu = array("a","b","c","d","e","f");
    $kang = array_chunk($xiu,3);//每3个元素划分为一个多维数组里面的一个元素
    print_r($kang);//Array ( [0] => Array ( [0] => a [1] => b [2] => c ) [1] => Array ( [0] => d [1] => e [2] => f ) ) 
?>

以上是关于数组的主要内容,如果未能解决你的问题,请参考以下文章

web代码片段

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

javascript常用代码片段

为什么我不能在此片段中生成唯一对象数组?

js简洁代码片段

为啥此代码片段返回意外结果?