PHP -- 数组

作者: 潘肚饿兵哥哥 | 来源:发表于2019-07-07 16:44 被阅读0次

    数组:

    声明:
    array(元素1,元素2,...); 5.4版本之前的写法
    [元素1,元素2,...];5.4版本之后(包括版本5.4)的写法,5.4版本之后也可以写array();
    元素的组成:键值对,键就是这个列表的序号
    键(下标) => 值

    key => value
    值可以存储:标量(boolean、integer(整型)、float、string)、数组、资源,不能存对象,资源一般不用数组存
    下标:可以整数或字符串(JS就是从0开始的,但PHP不是)
    下标也可以省略不写,如 $class = ['张三','李四','王五'];省略不写的话,会自动加下标,从0开始

    key 可以是 integer 或者 string。value 可以是任意类型。

     key 会有如下的强制转换: 
    ◦ 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。  
    ◦ 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。  
    ◦ 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。  
    ◦ Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。  
    ◦ 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。 
    

    $class1 = ['张三','李四','王五','赵六'];
    print_r($class1);
    var_dump($class1);

    echo 和 print只能输出标量
    var_dump();可以输出所有的类型,输出数组包括数组的数据类型、长度等
    print_r也能输出所有的类型,但是只能输出值

    print_r()输出结果:
    Array ( [0] => 张三 [1] => 李四 [2] => 王五 [3] => 赵六 ) array(4)

    var_dump($class1)输出结果:
    { [0]=> string(6) "张三" [1]=> string(6) "李四" [2]=> string(6) "王五" [3]=> string(6) "赵六" }

    如果指定某一个值的下标的话,那么后面的值的下标会从他开始计数
    $class1 = ['张三', 3=>'李四', '王五', '赵六'];
    print_r($class1);
    返回值:
    Array ( [0] => 张三 [3] => 李四 [4] => 王五 [5] => 赵六 )


    缺省下标的取值:
    下标重复不会报错,但是不能这么写。
    小数下标会被取整之后再存

    \color{rgba(254, 67, 101, .8)}{数字下标:}
    1.没有指定下标时,默认从0开始计数
    2.有部分值有下标时:
    数字下标: 如果前面没有指定下标,还是从0开始,如果中间指定了数字下标,那后面的就以这个指定的数字为准开始计数
    如:

    $class1 = ['张三', 3=>'李四', '王五', '赵六'];
    print_r($class1);
    

    前面没有指定下标,则从0开始
    第二个值指定了数字下标3,后面的下标则从3开始


    image.png

    如果数字排列顺序没有按大小排,那右边的会按最大的值为起点开始继续排:
    指定了第一个是3、第二个是2,不是正常的顺序,那么第三个值的下标会是以前面下标最大的那一个为准,否则,如果王五的值是以李四的2为准的话,那么下标3就会重复了。

    $class1 = [3=>'张三', 2=>'李四', '王五', '赵六'];
    print_r($class1);
    
    image.png

    \color{rgba(254, 67, 101, .8)}{字符串下标:}如果不是所有的值都是字符串下标,而是只有部分值有字符串下标的情况下;默认依然从0开始,遇到字符串下标的值则跳过,没有下标的值自成一个排列

    $class1 = ['张三', 'str2'=>'李四', '王五', '赵六'];
    print_r($class1);
    

    第二个值取了字符串下标,其他的值没有下标,则其他的值自成一个默认的排列,这个字符串下标自成一个排列,不干扰数字下标


    image.png

    字符串下标如果是字符串是数字则会被转为数字,如果字符串下标被取整型之后如果和数字下标相同,那么这个字符串下标会被舍弃:

    $class1 = [3=>'张三', '2'=>'李四', 2=>'王五', '赵六'];
    print_r($class1);
    

    这里李四是字符串下标,被转成数字之后是2,王五的下标是数字2,那么字符串下标的李四就会被舍弃,因为重复了


    image.png

    但是如果这个字符串的下标如果不是2,而是2.2的话,会被保留:

    $class1 = [3=>'张三', '2.2'=>'李四', 2=>'王五', '赵六'];
    print_r($class1);
    
    image.png

    \color{rgba(254, 67, 101, .8)}{数组的使用:增删改查}


    \color{rgba(254, 67, 101, .8)}{增加:}
    \color{rgba(254, 67, 101, .8)}{在JS里加元素必须要有下标,在php中不需要}
    \color{rgba(254, 67, 101, .8)}{第一种方法添加元素:数组[ ] = 值}

    $class1 = [3=>'张三', '2.2'=>'李四', 2=>'王五', '赵六'];
    $class1[] = '李雷';//增加
    print_r($class1);
    
    image.png

    \color{rgba(254, 67, 101, .8)}{第二种方法添加元素:array\_push( array, var);}

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_push($class1, '李雷');//用函数添加一个元素
    print_r($class1);
    
    image.png

    相当于引用传递,array_push();里的值改变了数组的值

    中括号里的值表示可以装无限个值
    array_push ( array &$array , mixed $value1 [, mixed $... ] ) : int
    array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。


    在数组前面添加元素:

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_unshift($class1,  '李雷', '韩梅梅');//用函数在数组前面添加一个元素
    print_r($class1);
    

    image.png

    在前面添加元素也有顺序,同时添加和分开添加顺序不同,后添加的排在前面:

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_unshift($class1, '李雷');//用函数在数组前面添加一个元素
    array_unshift($class1, '韩梅梅');
    print_r($class1);
    
    image.png

    在数组中间添加元素:

    array_splice( array &input, intoffset[, int length = count(input)[, mixed $replacement = array()]] ) : array

    把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用其中的单元取代。

    这个函数既可以添加,也可以删除,而且可以删除任意个数的值,删除值的个数和添加的值的个数互不干涉,可以删除任意个值,且只添加一个值,不会有问题

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_splice($class1, 1,0,'李雷');//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
    
    print_r($class1);
    
    image.png

    上面李雷前面是0,所以是添加,如果是1的话,就是替换了。下面这里是1.所以李四被李雷替换了

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_splice($class1, 1,1,'李雷');//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
    print_r($class1);
    
    image.png

    下面李雷前面2.所以李四和王五被李雷替换了

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_splice($class1, 1,2,'李雷');//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
    print_r($class1);
    
    image.png

    如果只写索引,不写值的话:
    相当于把 从 索引为1开始的值删掉了一个

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_splice($class1, 1,1);//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
    print_r($class1);
    
    image.png

    删除元素
    \color{rgba(254, 67, 101, .8)}{删除数组后面的元素}
    array_pop(arr);每次只能删除数组后面的 一个 元素

    $class1 = ['张三', '李四', '王五', '赵六'];
    array_pop($class1);//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
    print_r($class1);
    
    image.png

    array_pop();可以接收到被删除的返回值:
    输出返回值 Output Return

    $class1 = ['张三', '李四', '王五', '赵六'];
    $stu = array_pop($class1);//数组索引为1的位置添加一个元素,0是添加,1就是替换了,
    // print_r($class1);
    print_r($stu);
    
    image.png

    删除列表的第一个值:
    array_shift(arr);

    $class1 = ['张三', '李四', '王五', '赵六'];
    $stu = array_shift($class1);
    print_r($stu);
    print_r($class1);
    

    print_r($stu); 返回值:

    张三

    print_r($class1);返回值:
    列表第一项 张三 已被删除

    Array ( [0] => 李四 [1] => 王五 [2] => 赵六 )


    unset($variable); //删除变量(不能删除对象和资源)
    unset() 销毁指定的变量或数组的一个值。

    unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

    如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

    如果想在函数中 unset() 一个全局变量,可使用 $GLOBALS 数组来实现

    \color{rgba(254, 67, 101, .8)}{unset();销毁指定的变量或数组的一个值。 }
    \color{rgba(254, 67, 101, .8)}{第一种}
    数组后面跟索引的删除法:
    这样只会删除第0个索引的值

    $class1 = ['张三','李四','王五','赵六'];
    
    unset($class1[0]);//销毁数组的第一个值,但是这个值的索引还是在,剩下的索引不会按顺序重排
    print_r($class1);
    
    image.png

    这个列表用其他的办法操作的话,索引会按顺序重排,但是用unset();的话,索引不会重排。

    \color{rgba(254, 67, 101, .8)}{第二种}
    直接写数组的删除法:
    这样会删除整个列表

    $class1 = ['张三','李四','王五','赵六'];
    
    unset($class1);//销毁数组的第一个值,但是这个值的索引还是在,剩下的索引不会按顺序重排
    print_r($class1);
    
    image.png

    \color{rgba(254, 67, 101, .8)}{取列表最后一个值:}
    这样取最后一个值不会删掉他,而array_pop()函数会删掉最后一个元素,并返回这个被删掉的值

    $class1 = ['张三', '李四', '王五', '赵六'];
    $stu = $class1[count($class1)-1];
    //取这个列表最后一个值的下标,count是取这个列表的长度,长度是从1开始算的.
    //索引,也就是下标是从0开始算的,所以长度-1就正好和最后一个值的索引值相等.
    //把它放在中括号里,就等于取class1的最后一个元素的索引了.
    
    print_r($stu);
    

    返回值:
    返回值是列表的值,不是索引

    赵六

    获取列表最后一个值的函数:
    \color{rgba(254, 67, 101, .8)}{用end();方法和用array\_pop(arr);方法都可以获取到数组的最后一个元素}
    \color{rgba(254, 67, 101, .8)}{不同的是用end();方法只是单纯的获取最后一个元素。而array\_pop(arr);方法会删除最后一个元素}
    end();
    $stu = end($class1);

    $class1 = ['张三', '李四', '王五', '赵六'];
    $stu = end($class1);
    print_r($stu);
    

    返回值:

    赵六


    查:

    $stu1 = ['张三','北京',20];
    $stu2 = ['李四','上海',30];
    $stu3 = ['王五','广州',18];
    $stu4 = ['赵六','深圳',22];
    $class1 = [$stu1,$stu2,$stu3,$stu4];
    
    echo '<pre>';//<pre>格式化输出
    print_r($class1);
    echo '</pre>';
    

    返回值:


    image.png

    在上面这个列表中取出上海的写法:

    $stu1 = ['张三','北京',20];
    $stu2 = ['李四','上海',30];
    $stu3 = ['王五','广州',18];
    $stu4 = ['赵六','深圳',22];
    $class1 = [$stu1,$stu2,$stu3,$stu4];
    
    echo '<pre>';//<pre>格式化输出
    print_r($class1[1][1]);
    //这里的索引第一个[1]是大列表的索引,第二个[1]是小列表的索引
    //需要取的值外面套了几层列表,就要写几个中括号,中括号里写对应的索引值
    echo '</pre>';
    
    image.png

    数组层数太多的情况下,用索引值取值也很麻烦,就可以给数组取一个名:

    $class1 = [['张三','北京',20],['李四','上海',30],['王五','广州',['天河区'],18],['赵六','深圳',22]];
    
    echo '<pre>';//<pre>格式化输出
    print_r($class1[2][2][0]);
    echo '</pre>';
    
    
    $class1 = [['张三','北京',20],['李四','上海',30],'address'=>['王五','广州',['天河区'],18],['赵六','深圳',22]];
    
    echo '<pre>';//<pre>格式化输出
    print_r($class1['address'][2][0]);
    echo '</pre>';
    

    两种写法都是正确的,返回值都是天河区:


    image.png

    像上面这样的数组,如果数组中的值顺序错了,那么取出来的值也是错的,必须先排好值的顺序,按以下方法写就可以不用排序,顺序错了都能取出来:

    
    $class1 = [
                ['name'=>'张三','address'=>'北京','age'=>20],
                ['name'=>'李四','address'=>'上海','age'=>30],
                ['name'=>'王五','address'=>'广州','age'=>18],
                ['name'=>'赵六','address'=>'深圳','age'=>22]
            ];
        
    echo '<pre>';//<pre>格式化输出
    print_r($class1[2]['age']);
    echo '</pre>';
    
    image.png

    像上面这样,下标全是字符串的数组叫做关联数组

    数组的分类:
    根据中括号的层数分:
    一层:一维数组
    两层:二维数组
    多层:多维数组
    实际开发中,二维数组是用的最多的

    根据下标来分:
    索引数组:纯数字下标
    关联数组:字符串下标
    \color{rgba(254, 67, 101, .8)}{在一个数组中,最好不要索引数组和关联数组混用}


    查询数组中有没有某一个下标,如果有就输出这个下标,没有就添加
    如果有这个索引,输出这个下标对应值:

    $class1 = ['name'=>'张三','address'=>'北京','age'=>20];
        
    //查询数组中有没有下标,有就输出下标名字,没有就加一个下标
    //array_key_exists(key, search);  key是下标名称,search是数组名
    if(array_key_exists('name', $class1)){
        //如果有名称就输出
        echo $class1['name'];
    }else{//如果没有名称就加一个名称
        $class1['name'] = '李雷';
        print_r($class1);
    }
    
    image.png

    如果没有这个索引,添加这个值后输出数组:

    $class1 = ['name111111111'=>'张三','address'=>'北京','age'=>20];
        
    //查询数组中有没有下标,有就输出下标名字,没有就加一个下标
    //array_key_exists(key, search);  key是下标名称,search是数组名
    if(array_key_exists('name', $class1)){
        //如果有名称就输出
        echo $class1['name'];
    }else{//如果没有名称就加一个名称
        $class1['name'] = '李雷';
        print_r($class1);
    }
    
    image.png

    查询数组中有没有某一个值(上面是查索引,这里是查值)

    $class1 = ['name'=>'张三','address'=>'北京','age'=>20];
        
    //查询数组中有没有下标,有就输出值,没有就加一个值
    //in_array(needle, haystack);  needle针,haystack大海,大海捞针
    //返回值:如果找到 needle 则返回 TRUE,否则返回 FALSE。 
    
    var_dump(in_array('王五', $class1));
    

    返回值:


    image.png

    查询数组中有没有某一个值,如果有就修改他的名字

    array_search 在数组中搜索给定的值,如果成功则返回首个相应的键名

    首先先返回:

    $class1 = ['name'=>'张三','address'=>'北京','age'=>20];
        
    //查询数组中有没有王五,有就修改他的名字
    //in_array(needle, haystack);  needle针,haystack大海,大海捞针
    //返回值:如果找到 needle 则返回 TRUE,否则返回 FALSE。 
    
    $name = '王五';
    if(in_array($name, $class1)){
        $key = array_search($name, $class1);//查询$name在数组$class1中的下标
        $class1[$key] = '老王';
        print_r($class1);
    }else{
        echo '没有王五';
    }
    
    image.png

    相关文章

      网友评论

        本文标题:PHP -- 数组

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