好长时间没发博客了, 大概有一个多月了, 上一次发还是在国庆. 最近有很多事情, 所以一直没有更新

另外想说明一下, 根据发布预告, 本来这一课应该是正则表达式的, 但是想想正则表达式有很多语言都可以用到, 不只是 PHP. 所以决定之后另外发一个课程, 专门讲正则表达式的

去掉了正则表达式这一课, 就代表 PHP 课程不再是 10 课了. 为了保证课程仍然是 10 个课时, 所以最后一课我将改成 PHP 进阶的一点稍简单的内容, 即命名空间. 就是讲 PHP 命名空间提前到 PHP 课程中来

讲完了这一课, 就可以面向过程使用 PHP 进行编程了, 也就是实战. 之前 Swift 课程因为没有进阶, 所以也就没有了实战这一部分

学了 C、C++、Swift 和 PHP, 目前来看, PHP 的数组是非常强大的, 可以让你写少很多函数

1. 索引数组

使用 array() 声明数组, PHP 中的数组和 C 一样都是默认从 0 开始计数

$arr = array("0" => value1, "1" => value2, ...);

这种数组的声明其实和 $arr = array(value1, value2, ...);$arr = [value1, value2, ...] 是一样的

通过 arr[i] 读取到的值同样都是 value.i

当然也可以分别赋值

$arr[0] = value1;

$arr[1] = value2;

2. 关联数组

除去普通的数组之外, PHP 也有关联数组. 其实 PHP 中的关联数组和 Swift 中的字典十分类似

关联数组可以不从 0 开始计数, 而是直接通过 "key.i" 值索引直接得到对应的索引值

<?php

    $arr = array("key1" => value1, "key2" => value2);

    echo $arr['key1'];    #结果 : value1

?>

3. 多维数组

不管是普通的数组还是关联数组, 都是支持相互嵌套的, 也就是俗称的多维数组

<?php

    $arr = array(array(value1, value2), array("key1" => value3, "key2" => value4));

    echo $arr[0][0];    #结果 : value1

    echo $arr[1]['key1'];    #结果 : value3

?>

4. 常量数组

在 PHP 5.6 的时候, PHP 仅支持使用 const 关键字定义常量数组, 方式和数组的宣告方式相同

const arr = array();

在 PHP 7 之后, PHP 还支持使用 define() 定义常量数组, 当然也支持常量多维数组和常量关联数组

<?php

    define('学生', ['学生1', '学生2']);

    echo 学生[0];    #结果 : 学生1

?>

5. 数组遍历

n 维数组的遍历使用 n 个循环语句

不过, PHP 还提供了 foreach 语句对数组进行便利, 在之前《PHP 第四课 : 循环控制》当中已经讲过了, 这里就不再累赘

7. 数组的基本操作

  • 数组排序

PHP 提供了多种数组的排序方式, 关联数组还可以通过自定义排序函数的方式进行排序

假设我们把数组定义为 $arr = array("key" => "value")

sort() : 默认排序, 升序

asort() : 根据 "value" 值排序, 升序

ksort() : 根据 "key" 值排序, 升序

rsort() : 默认排序, 降序

arsort() : 根据 "value" 值排序, 降序

krsort() : 根据 "key" 值排序, 降序

usort() : 自定义排序

这里需要特别讲明 usort(). usort() 需要你自己定义排序方法, 然后会根据你定义的排序方式对数组进行排序, 这个在多维关联数组中特别有用

<?php

    $arr = array(array("name" => "stu1", "class" => 1), array("name" => "stu2", "class" => 8), array("name" => "stu3", "class" => 5));

    function compare($x, $y) {

        if($x["class"] == $y["class"]) {

            return 0;

        }else if($x["class"] < $y["class"]) {

            return 1;

        }else {

            return -1;

        }

    }

    usort($arr, 'compare');

    for($i = 0; $i < count($arr); $i++) {

        echo $arr[$i]["name"];

        echo "<br />";

    }

?<

    /*结果 :

        stu2

        stu3

        stu1

    */
  • 将字符串转换为数组

有时候, 我们需要把一串有规律的字符串转换为数组的形式, 方便后续的操作. 这个时候, 可以用到 PHP 提供的 explode() 函数

explode(标志符, 数组)

<?php

    $str = "1.2.3";

    $arr = explode('.', $str);

    print_r($arr);

?>

    /*结果 :

        Array

            (

                [0] => 1

                [1] => 2

                [2] => 3

            )

    */
  • 将数组转换为字符串

可以从字符串转换为数组, 当然可以从数组转换为字符串. 这要通过 implode() 函数实现 implode(添加符, 数组)

<?php

    $arr = array(1, 2, 3);

    $str = implode("个人\n", $arr);

    echo $str;

?>

    /*结果 :

        1个人

        2个人

        3

    */

你可以发现, 数组的最后一个元素不会被转换. 这就需要我们手动去转换

如果是关联数组 $arr = array("key" => "value"), 那么 implode() 函数是转换 "value"
  • 向数组中添加元素

PHP 提供了两个函数来向数组中添加元素

array_push(数组, 元素1, 元素2, ...)

array_unshift(数组, 元素1, 元素2, ...)

这两个函数的添加涉及到在原数组最前面添加还是最后面开始添加

array_push() : 从原数组最后一个元素开始向后添加新元素

array_unshift() : 从原数组第一个元素开始添加新元素

  • 从数组中删除元素

和添加元素一样, PHP 提供了两个函数来删除数组中的默认元素. 不过和 Swift 不同的是, PHP 并没有提供直接删除数组某一个元素的函数. 不过值得庆幸的是, PHP 有提供间接删除某一个元素的函数

array_pop(数组)

array_shift(数组)

array_splice(待删除元素数组, 删除元素起始位置, 删除元素个数)

unset(数组第 i 个元素)

实际上, unset() 函数也可以删除, 只不过它会直接释放内存, 让数组这个索引指向空地址, 即 null

从下面的例子中, 我们就可以得到证明

<?php

    $arr = [1, 2, 3];

    unset($arr[1]);

    if($arr[1] == null) {

        echo "1";

    }

?>

    /*结果 :

        1

    */

我们讲回 PHP 提供的删除数组元素的函数

array_pop() : 删除数组最后一个元素

array_shift() : 删除数组第一个元素

array_splice() : 从数组指定元素开始删除指定个数

  • 查询数组

PHP 提供了三个函数分别用于查询数组中的不同项目

in_array(查询字符串, 数组)

array_key_exists(查询字符串, 数组)

array_search(查询字符串, 数组)

他们的返回值都是 bool 值, 作用分别是 :

假设有数组 $arr = ("key" => "value")

in_array() : 查询常规数组的值

array_key_exists() : 查询关联数组的 "key"

array_search() : 查询关联数组的 "value"

值得注意的是, 当这些函数适用于多维数组的时候, 就不是太合适. 这些函数只会去处理最外围的函数, 而无法获得嵌套在内的数组的具体元素

  • 获得数组元素

现在假设有数组 $arr = ("key" => "value"), PHP 提供了两个函数分别用于获得数组的 "key""value"

array_keys(数组)

array_values(数组)

这些函数的返回值都是一个数组

array_keys() : 获得一个数组中全部的 "key"

array_values() : 获得一个数组中全部的 "value"

和查询函数一样, 这些函数同样不适用于多维数组, 否则只会处理最外围的函数, 而不会获得内部元素的相关元素值

  • 数组元素统计

PHP 提供了 count() 函数来统计数组元素的个数

当需要统计数组中 "value" 值出现的次数时, 可以使用 array_count_value() 函数来计算. 不过这个函数返回的是一个数组, 索引为原数组的元素索引值, 索引值为原数组该索引对应的元素索引值出现的次数

不过同样, array_count_value() 不适用于多维数组

  • 删除重复元素

PHP 提供了 array_unique() 函数来删除数组中重复出现的元素

  • 调换关联数组的 key 与 value

PHP 提供了 array_flip() 函数, 用于调换关联数组的 key 与 value

  • 数组的序列化与反序列化

PHP 提供了 serialize() 函数来对数组进行序列化为字符串, 同样提供了 unserialize() 函数对字符串进行反序列化为数组

这里对于这两个函数不多介绍, 暂时只讲运用在数组上

<?php

    $arr = ["a", "dsfdsafsfs", "dfas", "cdscwwe"];

    echo serialize($arr)."\n";

    print_r(unserialize(serialize($arr)));

?>

    /*结果 :

        a:4:{i:0;s:1:"a";i:1;s:10:"dsfdsafsfs";i:2;s:4:"dfas";i:3;s:7:"cdscwwe";}

        Array

            (

                [0] => a

                [1] => dsfdsafsfs

                [2] => dfas

                [3] => cdscwwe

            )

    */

特别提及一下 $str

第一个冒号后面的数组为数组的元素个数

i 为该元素的索引

s 为该元素的字符个数统计

再后面的为元素本身