二、数组和循环

在上一章中,我们介绍了变量和数据类型以及不同的运算符。我们还介绍了如何使用条件控制程序流。在本章中,我们将重点介绍如何使用数组存储多个值,以及如何使用循环控制流。数组的基本思想是它是一种变量类型,允许在一个container中存储多个项目。

例如,如果您想在同一个变量下存储在一家公司工作的所有员工的姓名,则可以使用数组来帮助您做到这一点。当我们想要多次运行同一代码块时,就会使用循环。这通过重用预定义的代码块为开发人员节省了大量工作。这两个概念是当今几乎所有基于 PHP 的 web 应用和 web 站点的核心。

在本章结束时,您将能够:

  • 实现一维和多维数组
  • 识别索引数组和关联数组之间的差异
  • 在阵列上执行不同的操作
  • 实现各种类型的循环

阵列

在本节中,我们将讨论各种类型的阵列,然后介绍它们的一些常见操作。

索引数组

索引数组是您将看到的最常见的数组类型,它们可以定义为预填充数组或空数组。

空数组可以定义如下:

<?php

    $the_array = array();

?>

注意,$the_array是一个变量。您可以使用您喜欢的任何其他变量。

使用快捷方式语法的另一种方法:

<?php
    $the_array = [];
?>

如果您想启动一个带有值的数组,可以按如下操作:

<?php

    $students = array("Jill", "Michael", "John", "Sally");

?>

当您使用预先填充的值初始化数组时,每个元素都会从 0 开始获得一个数字索引。因此,在前面的示例中,吉尔的索引为 0,迈克尔的索引为 1,约翰的索引为 2,莎莉的索引为 3。

为了打印出students数组的第一个索引,您可以使用以下代码:

<?php

    echo $students[0];    

?>

通常,当您使用数组时,您希望在整个程序过程中添加到该数组中。此可通过以下两种方式之一完成:

append快捷方式:

<?php

    $students[] = "Tom";

?>

array``push功能:

<?php

    array_push($students, "Tom", "Joey");

?>

通常,开发人员使用快捷方式方法;如果要一次将多条记录推送到一个数组中,可以使用array_push功能。

有时,数组中有一个元素需要删除。要从数组中删除元素,请使用unset函数。在以下示例中,我们从数组中删除“Tom”:

<?php

    unset($students[4]);

?>

在继续之前,我们将讨论的最后一部分是更新元素。为此,请执行以下操作:

<?php

    $students[0] = "Jessie";

?>

关联数组

接下来是关联数组,通常称为键值对。使用关联数组,可以使用基于文本的键来存储值,这在特定情况下可能会有所帮助。例如,如果我们从前面的示例中选取一个学生(在本例中为 Michael),我们可以存储他的agegenderfavorite color, ,如下所示:

<?php
    $michael = array(
    "age" => 20,
    "gender" => "male",
    "favorite_color" => "blue"
);
?>

如果需要访问数组中的特定值,可以使用key。例如,如果要打印 Michael 的年龄,可以执行以下操作:

<?php

    echo $michael['age'];
?>

将数据添加到associative数组与将数据添加到索引数组一样简单。您可以简单地使用该键并指定一个值。假设我们想在 Michael 的数组中添加一个职业:

<?php
    $michael["occupation"] = "sales associate";
?>

要从关联数组中删除元素,请执行与indexed数组相同的步骤,但这次使用键。

让我们删除在最后一步中添加的职业:

<?php
    unset($michael['occupation']);
?>

使用阵列

在本节中,我们将包括nameagelocationeducation level。遵循以下步骤:

  1. 打开代码编辑器并创建一个新文件arrays.php.
  2. 在新文件中,创建打开和关闭php标记:

    php <?php ?>

  3. 现在,我们将创建一个名为$myinfo,的新变量,并使用一个新数组对其进行初始化:

    ```php <?php $myinfo = array(); ?>

    ```

  4. 然后,我们将用我们的nameagelocationeducation level填充新阵列。

  5. 接下来,我们将打印数据:

    ```php <?php $myinfo = array("John", 25, "USA", "College"); echo "My name is " . $myinfo[0] . "\n"; echo "I am ". $myinfo[1] . " years old. \n"; echo "I live in " . $myinfo[2] . "\n"; echo "My latest education level is " . $myinfo[3]; ?>

    ```

  6. 在终端中打开您的工作目录,键入以下命令:

    php php arrays.php

您将获得以下输出中显示的结果:

My name is John.
I am 25 years old.
I live in USA.
My latest education level is College.

将字符串转换为数组

有时,在构建基于 PHP 的应用时,您不会使用预定义的数据集实例化数组,例如,在构建实用程序脚本时就是这样。假设您有一个文件名为字符串版本的变量,并且希望获得不带扩展名的文件名。使用explode功能可以轻松完成此任务。explode函数接受两个参数:分隔符和要转换为数组的字符串。Explode函数有两个参数:

<?php
    $filename = "myexamplefile.txt";
    $filename_parts = explode(".", $filename);

    echo "Your filename is " . $filename_parts[0];
?>

在前面的示例中,我们定义了一个 filename 变量,然后使用 explode 函数,使用句点分隔符将字符串拆分为多个部分。$filename_parts变量包含两个元素的数组,第一个是字符串myexamplefile,第二个包含字符串txt

知道了这一点,我们可以通过访问字符串部分数组的 0 索引来打印文件名。

将数组合并为字符串

除了explode函数外,PHP 还为我们提供了一个函数,允许我们执行完全相反的操作:implode函数。当您想要获取现有数组并将其转换为字符串时,可以使用内爆函数定义分隔符并将其传递给数组;结果将得到一个字符串。

让我们回到explode示例。假设我们有一个文件名,并希望在将其保存回字符串之前在其末尾附加一些其他字符串:

<?php
    $filename = "myexamplefile.txt";
    $filename_parts = explode(".", $filename);
    $filename_parts[0] .= "_v1";

    $filename = implode(".", $filename_parts);
    echo "Your new filename is " . $filename;    

?>

在前面的代码示例中,我们首先使用 explode 函数将原始文件名分解为几个部分。然后我们访问文件名部分并将字符串 _v1 附加到它的末尾。使用内爆函数,我们使用文件名的各个部分重新组合文件名,最后将其打印回屏幕供用户查看。

切片阵列

另一个array_slice功能;默认情况下,该函数只需要两个参数,但可以使用四个。两个必需的参数是数组本身和新数组的起点。两个可选参数是新数组的长度(或要包含在其中的元素数)和 preserve 选项。“保留”选项允许您决定当前数组元素是保持不变,还是在拆分后重新排序。下面是一个基本用法示例:

<?php
    $fruit = array("apples","grapes", "oranges", "lemons","limes");
    $smallerFruitArray = array_slice($fruit, 2);
?>

在前面的示例中,当我们通过array_slice,运行水果数组时,我们将得到一个包含橙子、柠檬和酸橙的数组。

对数组进行排序

排序是构建特定类型程序的另一个重要工具。在 PHP 中经常看到的排序函数之一是ksort函数。ksort允许您将数组作为参数传入,然后按升序排序。

如何使用它的示例如下:

<?php

    $people = array("Jessica" => "35", "April" => "37", "John" => "43", "Tom" => 25);
ksort($people);

?>

在前面的示例中,我们有一组人员。一旦您通过ksort函数设置了人物数组,您应该可以看到按字母顺序排列的姓名。

多维数组

下一种类型是multidimensional数组。多维数组只是数组中的数组。在前面的数组示例中,我们存储了一个学生的名字。当我们想要为一个特定的学生存储多个细节时会发生什么?这就是多维数组的用武之地。让我们看看如何定义一个学生数组,该数组还存储学生的genderfavorite``color

对于完整的代码片段,请打开代码文件中的Lesson 2.php

<?php

    $students = array(
    "Jill" => array(
    "age" => 20,
    "gender" => "female",
....
"Amy" => array(
   "age" => 25,
   "gender" => "female",
   "favorite_color" => "green"
),

);
?>

如果我们想访问学生的信息,我们可以使用以下键:

    <?php 

        echo $students['Jill']['age'];

?>

上面的例子将打印出吉尔的年龄。对于多维数组,我们更新元素值的方式与使用一维数组时几乎相同。

例如,如果我们想将 Jill 的年龄更改为21,,我们可以执行以下操作:

<?php

        $students['Jill']['age'] = 21;
    ?>

包括我们现有项目中的一系列爱好

在本节中,我们将对上一个示例进行扩展,以包括一系列爱好:

  1. 打开代码编辑器并创建一个新文件multidimensional.php
  2. 在新文件中,创建打开和关闭php标记。
  3. 创建一个名为$user,的新变量,并使用一个新数组对其进行初始化:

    php <?php ?> <?php $user = array(); ?>

  4. Populate the new array with two main sections: info and hobbies. In the info array, store the name, age, location, and education level, and in the hobbies array, we will store three hobbies.

    有关完整的代码片段,请参阅代码文件文件夹中的Lesson 2.php文件。

    php <?php $user = array( "info" => array( "name" => "john", "age" => 27, ... ) ); ?>

  5. Next we'll print our data:

    有关完整的代码片段,请参阅代码文件文件夹中的Lesson 2.php文件。

    ```php <?php$user = array( "info" => array( "name" => "john", "age" => 27, "location" => "USA", ..... echo "I live in " . $user["info"]['location'] . ".\n"; echo "My latest education level is " .
    $user['info']['education_level']. ".\n";

    echo "I enjoy " . $user["hobbies"][0] . ", " . $user["hobbies"]

    [1] . ", " . $user["hobbies"][2].".\n";

    ?> ```

  6. 在终端中打开您的工作目录,输入以下命令:

    php php multidimensional.php

您将根据我们在前面的数组中提供的输入得到一个结果。

回路

循环是任何编程语言中的强大工具。它们允许您编写可以根据给定条件执行特定次数的代码。在本节中,您将了解各种可用的循环,例如 for 循环、foreach 循环、while循环和do-while循环。

用于循环

我们将从for循环开始探索循环。它是已知的最复杂的循环结构,当您知道需要一个代码块运行多少次时,就会使用它。for 循环的结构如下所示:

<?php

    for(initialized counter; test if true; increment counters){

}

?>

创建for循环的步骤如下:

  1. 初始化起始计数变量-通常从0开始。
  2. 提供解析为truefalse的评估条件。如果条件为true,循环将继续,当条件为false时,循环将退出(或中断)。
  3. 按特定的数字递增该值。通常,它会增加1

下面是一个完整的例子:

<?php
        for($i = 0; $i < 5; $i++) {
            echo "Current Count: " . $i; 
}
?>

组合回路和阵列

在本节中,我们将探讨如何组合循环和数组。以下是执行此操作的步骤:

  1. 打开代码编辑器并创建一个新文件forloop.php.
  2. 在新文件中,创建打开和关闭php标记:

    php <?php ?>

  3. 现在,我们创建一个名为$food,的新变量,并用一个新数组

    php <?php $food = array(); ?>

    初始化它 4. 然后,我们用食物名称填充新数组:

    php <?php $food = array("turkey", "milk", "apples"); ?>

  4. Next, we loop through our array and print our data:

    ```php <?php $food = array("turkey", "milk", "apples");

           for($i = 0; $i < count($food); $i++){
        echo $food[$i] . "\n";
    

    } ?> ```

    计数函数返回数组中的元素数。

    在终端中打开工作目录,然后键入以下命令:

    php php forloops.php

while 循环

我们将探索的下一个循环是 while 循环。while 循环用于循环代码块直到满足特定条件。而循环的定义如下:

<?php

    while(condition) {
}

?>

虽然循环非常简单,因为它们只需要一个条件就可以运行。循环将继续,直到条件为 false:

while Loops

这里有一个简单的例子:

<?php
    $count = 1;
    while($count < 25){
        echo "Count: " . $count . "\n";

        $count += 1;
}

?>

我们将前面的count变量赋值为 1。while条件检查count变量是否小于 25,一旦counter变量等于 25,则会中断。在 while 函数中,我们echo输出当前计数,然后将count变量增加 1。

使用 while 功能

在本节中,我们将构建一个while函数,该函数将在counter小于 30 时进行迭代。按照以下步骤操作:

  1. 打开代码编辑器并创建一个新文件while.php.
  2. 在新文件中,创建打开和关闭php标记:

    php <?php ?>

  3. 接下来,我们定义一个counter函数并用数字 1 对其进行初始化:

    php <?php $count = 1; ?>

  4. 然后,我们可以创建一个while循环,该循环将回显当前计数,然后将counter增加 1:

    ```php <?php

        $count = 1;
    
        while($count <= 30){
            echo "Count " . $count . "\n";
            $count++;
        }
    

    ?> ```

  5. 在终端中打开您的工作目录,键入以下命令:

    php php while.php

边做边做

Do while 循环与 while 循环类似,但它们不是在循环开始时运行条件,而是在内部代码块运行后进行检查。其思想是,如果需要代码块至少运行一次,则使用此循环而不是 while 循环。

Do while 循环也称为出口控制循环。

Do while 循环表示如下:

<?php

    do{

}while(condition);

?>

我们将根据前面的内容修改 while 循环:

<?php
    $count = 1;
    do{
        echo "Count: " . $count . "\n";

}while($count <= 25);
?>

while 循环到 do while 循环的转换

在本节中,我们将复制前面的示例,但是将 while 循环转换为 do-while 循环,这样您就可以看到它们在工作方式上的差异。遵循以下步骤:

  1. 创建一个新文件并将其命名为dowhile.php.
  2. 接下来,打开while.php文件,将内容复制到dowhile.php文件中。
  3. 我们现在将修改while函数,使其类似于以下代码:

    ```php <?php

        $count = 1;
    
        do{
            echo "Count " . $count . "\n";
            $count++;
        }while($count <= 30);
    

    ?> ```

  4. 在终端中打开您的工作目录,输入以下命令:

    php php dowhile.php

foreach 循环

foreach 循环是我们列表中的下一个循环。foreach 循环旨在为程序员提供一种简单的方法来迭代数组。此循环仅适用于数组和对象,您将在本书后面部分了解这些内容。此循环有两个语法:

<?php

    foreach($array as $value){

    }

?>

第一种语法采用给定的数组并遍历数组中的每个元素,将其分配给辅助变量。例如:

<?php
        $students = array("Jill", "John", "Tom", "Amy");

        foreach($students as $student){
            echo $student . "\n";
}
?>

在前面的示例中,我们定义了一个填充有学生姓名的数组。然后,我们使用 foreach 循环迭代我们的students数组并echo输出每个名称。

第二种语法编写如下:

<?php
    foreach($array as $key => $value){

}
?>

在这个版本的for each函数中,给定的数组被迭代,但它没有给出单个元素,而是同时给出keyelement本身。下面是我们将如何使用它的示例:

有关完整的代码片段,请参阅代码文件文件夹中的Lesson 2.php文件。

<?php

    $students = array(
    "Jill" => array(
    "age" => 20,
    "favorite_color" => "blue"
),
.....
);

   foreach($students as $name => $info){
    echo $name . "'s is " . $info['age'] . " years old\n";
}
?>

在本例中,我们定义了一个多维数组,该数组存储每个学生的年龄和喜爱的颜色,并使用学生的姓名编制索引。然后我们使用foreach函数迭代students数组,并将每个元素的键分配给name变量,将学生信息分配给info变量。在循环中,我们echo列出了学生的姓名以及他们的年龄。

活动:使用 foreach 循环

让我们将对 for each 循环的理解付诸实践。

您的经理要求您创建一个 PHP 脚本,根据给定的工资计算每个员工每月的收入。

这就是你要做的:

  1. 创建一个新目录并将其命名为monthly_payment
  2. 在新目录中,创建一个index.php文件。
  3. 首先,您将定义多维数组,该数组将存储员工的姓名、职务和薪水:

    ```php <?php

    $employees = array( array( "name" => "John Doe", "title" => "Programmer", "salary" => 60000 .... "title" => "Manager", "salary" => 132000 ) ); ?> ```

  4. 接下来,定义将遍历employee数组的foreach循环:

    php foreach($employees as $employee){ }

  5. 最后,添加一个echo报表,该报表将打印姓名、职务和计算的月薪:

    php foreach($employees as $employee){ echo $employee['name'] . "(" . $employee['title'] . ") annual salary is $" . $employee['salary'] . " and earns $" . ($employee['salary'] / 12) . "/mo. \n"; }

计算器脚本现在完成了。如果需要添加其他员工,只需添加一个包含员工信息的附加关联数组即可。

总结

我们已经到了第二章的结尾。在本章中,我们了解了如何声明和定义数组,并介绍了不同类型的数组。我们看到了可以在阵列上执行的各种操作。我们还介绍了控制流语句,如 for 循环、while 循环和 do while 循环。

在下一章中,我们将学习使用函数和类的代码可重用性,使您更接近于构建自己的自定义应用。