04-数组

作者: 董泽平 | 来源:发表于2019-10-15 15:24 被阅读0次

数组

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

相关文章

网友评论

      本文标题:04-数组

      本文链接:https://www.haomeiwen.com/subject/dmesmctx.html