• PHP-数组相关知识总结


    PHP-数组相关知识总结

    (一)数组创建

    //创建数组(php5.4 起可以使用短数组定义语法,用 [] 替代 array())

    <?php
    $array = array(
        "foo" => "bar",
        "bar" => "foo",
    );

    // PHP 5.4 起
    $array = [
        "foo" => "bar",
        "bar" => "foo",
    ];
    ?>

    (2)数组的相关特性

     //php的数组均可以看作关联数组(PHP 实际并不区分索引数组和关联数组)

    (2.1)数组Key值的要求

    (1)强制转化

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

    (2)Key随上一个值依次增长(如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一)

    注:注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行

    <?php
    // 创建一个简单的数组
    $array = array(12345);
    print_r($array);

    // 现在删除其中的所有元素,但保持数组本身不变:
    foreach ($array as $i => $value) {
        unset($array[$i]);
    }
    print_r($array);

    // 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
    $array[] = 6;
    print_r($array);

    // 重新索引:
    $array array_values($array);
    $array[] = 7;
    print_r($array);
    ?>
     
    重建索引: array_values($array);

    (3)覆盖特性(如果指定的键名已经有了值,则该值会被覆盖。)

    实例:

    <?php
    $array = array(
        1    => "a",
        "1"  => "b",
        1.5  => "c",
        true => "d",
    );
    var_dump($array);
    ?>

    结果:

    array(1) {
      [1]=>
      string(1) "d"
    }

    (3)数组的访问与修改,删除

    3.1

    方括号和花括号可以互换使用来访问数组单元(例如 $array[42] 和 $array{42}结果相同)

    注:有引号和没引号的区别

    <?php
    $foo[bar] = 'enemy';
    echo $foo[bar];
    // etc
    ?>
    这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
    但是用不着给键名为常量变量的加上引号,否则会使 PHP 不能解析它们。

    3.2

    自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。

    自 PHP 5.5 起可以用数组间接引用一个数组原型。

    <?php
    function getArray() {
        return array(123);
    }

    // on PHP 5.4
    $secondElement getArray()[1];

    // previously
    $tmp getArray();
    $secondElement $tmp[1];

    // or
    list(, $secondElement) = getArray();
    ?>
    注:试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_NOTICE 级别错误信息,其结果为 NULL
    3.3
    $arr[key] = value;
    $arr[] = value;

    注:如果 $arr 还不存在,将会新建一个,这也是另一种新建数组的方法。不过并不鼓励这样做,因为如果 $arr 已经包含有值(例如来自请求变量的 string)则此值会保留而 [] 实际上代表着字符串访问运算符

    3.4

    删除某键值对,对其调用 unset() 函数

    <?php
    $arr = array(=> 112 => 2);

    $arr[] = 56;    // This is the same as $arr[13] = 56;
                    // at this point of the script

    $arr["x"] = 42// This adds a new element to
                    // the array with key "x"
                    
    unset($arr[5]); // This removes the element from the array

    unset($arr);    // This deletes the whole array
    ?>
     
    (4)数组遍历
    4.1 foreach(均可)
    foreach ($arr as $key => $value) {
        echo "Key: $key; Value: $value<br /> ";
    }// $value为值
    4.2 for(普通数组)

    (5)数组常用函数

    5.1 foreach

    foreach ($arr as $key => $value) {
        echo "Key: $key; Value: $value<br /> ";
    }// $value为值

    foreach ($arr as $value) {
        echo " Value: $value<br /> ";
    }// $value为值

    5.2  list

    foreach ($array as list($a$b)) {
        // $a contains the first element of the nested array,
        // and $b contains the second element.
        echo "A: $a; B: $b ";
    }
    ?>//用于嵌套数组解包

    注:list() 中的单元可以少于嵌套数组的,此时多出来的数组单元将被忽略:但是多于嵌套数组将会报错

    5.3array_diff()数组运算符

    array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。

    数组运算符:

     

     $a + $b 联合 $a$b 的联合。
    $a == $b 相等 如果 $a$b 具有相同的键/值对则为 TRUE
    $a === $b 全等 如果 $a$b 具有相同的键/值对并且顺序和类型都相同则为 TRUE
    $a != $b 不等 如果 $a 不等于 $b 则为 TRUE
    $a <> $b 不等 如果 $a 不等于 $b 则为 TRUE
    $a !== $b 不全等 如果 $a 不全等于 $b 则为 TRUE

    注:+ 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略

    5.4 count获取数组长度

    其它数组函数:http://php.net/manual/zh/ref.array.php

    (6)数组转换

    对于任意 integerfloatstringbooleanresource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValuearray($scalarValue) 完全一样。

    注:如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为:

    (7)数组排序

     有些函数基于 array 的键来排序,    而其他的基于值来排序的:$array['key'] = 'value';。   

    •     排序之后键和值之间的关联关系是否能够保持,    是指排序之后数组的键可能会被重置为数字型的(0,1,2 ...)。   
    •     排序的顺序有:字母表顺序, 由低到高(升序),    由高到低(降序),数字排序,自然排序,随机顺序或者用户自定义排序。   
    •     注意:下列的所有排序函数都是直接作用于数组本身,    而不是返回一个新的有序的数组。   
    •     以下函数对于数组中相等的元素,它们在排序后的顺序是未定义的。    (也即相等元素之间的顺序是不稳定的)。
    array_multisort() 键值关联的保持,数字类型的不保持 第一个数组或者由选项指定 array_walk()
    asort() 由低到高 arsort()
    arsort() 由高到低 asort()
    krsort() 由高到低 ksort()
    ksort() 由低到高 asort()
    natcasesort() 自然排序,大小写不敏感 natsort()
    natsort() 自然排序 natcasesort()
    rsort() 由高到低 sort()
    shuffle() 随机 array_rand()
    sort() 由高到低 rsort()
    uasort() 由用户定义 uksort()
    uksort() 由用户定义 uasort()
    usort() 由用户定义 uasort()

     7.1多维数组排序

    7.1.1单属性排序

    第一个值排序

    <?php

    $a=array(     array('a' => 25,'s' => 56),     array('a' => 75,'s' => 86),     );

    function sort1($x,$y) {    if($x['a']<$y['a'])     {         return true;     }  else  {     return false;  }  }

    usort($a, 'sort1'); //uasort保持键值关联

    print_r($a);

    ?>

    排序结果:

    Array (   

    [0] => Array        (            [a] => 75            [s] => 86        )   

    [1] => Array        (            [a] => 25            [s] => 56        ) )

    同理:

    根据第二个值排序将a换为s

    7.1.2多属性排序

    <?php

     $data = array();   

     $data[] = array('volume' => 67, 'edition' => 2);    

    $data[] = array('volume' => 86, 'edition' => 7);    

    $data[] = array('volume' => 85, 'edition' => 1);    

    $data[] = array('volume' => 98, 'edition' => 2);    

    $data[] = array('volume' => 86, 'edition' => 6);    

    $data[] = array('volume' => 67, 'edition' => 7);

        // 取得列的列表    

    foreach ($data as $key => $row)     {       

      $volume[$key]  = $row['volume'];         $edition[$key] = $row['edition'];   

      }

        array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);//第一键值排序相同,第二键值默认升序,作为单属性排序

        print_r($data);

    ?>

    排序结果:

    Array (  

    [0] => Array        (            [volume] => 98            [edition] => 2        )   

    [1] => Array        (            [volume] => 86            [edition] => 6        )   

    [2] => Array        (            [volume] => 86            [edition] => 7        )   

    [3] => Array        (            [volume] => 85            [edition] => 1        )   

    [4] => Array        (            [volume] => 67            [edition] => 2        )   

    [5] => Array        (            [volume] => 67            [edition] => 7        ) )   

    更多:http://php.net/manual/zh/function.array-multisort.php

    (8)数组引用

    <?php
    $arr1 = array(23);
    $arr2 $arr1;
    $arr2[] = 4// $arr2 is changed,
                 // $arr1 is still array(2, 3)
                 
    $arr3 = &$arr1;
    $arr3[] = 4// now $arr1 and $arr3 are the same
    ?>

  • 相关阅读:
    js利用原型对象实现继承--Es5实现的面向对象方式
    js的构造函数原型链
    回调函数
    箭头函数
    关于js的易错知识
    信息论--(1)
    计算机为什么需要反码,补码?
    windows+anaconda下载安装libelimg,学习图像处理
    spring boot + thymeleaf 3 国际化
    spring boot hello and docker
  • 原文地址:https://www.cnblogs.com/qiujun/p/6807496.html
Copyright © 2020-2023  润新知