PHP foreach

时间:2018-11-15 13:17:34  来源:igfitidea点击:

在本教程中,我们将学习如何使用PHP foreach循环语句来循环数组元素或对象的公共属性。

PHP提供了foreach循环语句来遍历数组的元素或对象的公共属性。

foreach循环语句只对数组和对象有效。如果将foreach循环语句与其他数据类型一起使用,则会报错。

PHP foreach - 循环遍历索引数组的元素

要遍历索引数组的元素,可以使用以下语法:

<?php
foreach ($array as $element) {
 // 在这里处理元素$element
}

PHP在每次迭代中将索引数组的每个元素赋给$element变量。

请看下面的例子:

<?php
 
$nums = [95,73,87];
foreach ($nums as $num) {
 echo $num;
}

在本例中,我们将$nums数组的每个元素分配给$num变量,并在每次迭代中显示元素$num的值。

要循环更改数组元素的值,必须使用foreach循环返回的引用。

要使foreach循环返回对数组元素的引用,需要在循环变量前面添加一个&符号,如下所示:

<?php 
foreach ($array as &$value) {
}

下面的例子演示了如何更改一个索引数组的元素的值:

<?php
 
$nums = [1,2,3];
foreach ($nums as &$num) {
 $num *= $num;
}
 
print_r($nums); // [1, 4, 9]

在例子中,我们遍历$nums数组的元素,并将每个元素的值改成其平方。

注意,对foreach循环中使用引用可能会有问题。请看以下示例:

<?php
 
$nums = ['a','b',3];
 
// 第一个循环
foreach ($nums as &$num) {
}
// 第二个循环
foreach ($nums as $num) {
}
print_r($nums);

在第二个循环之后,$nums数组是:

['a','b','b']

原因是在第一个循环之后,$num变量总是引用$nums数组的第三个元素。

在第二个循环中:
在第一次迭代中,我们将$nums数组的第一个元素分配给$num,因为$num地址指向$nums数组的第三个元素,因此,第一次迭代相当于:

$scores[2] = $scores[0];

因此,在第一次迭代之后,$scores数组的内容是:

['a','b','a']

在第二次迭代中,我们将$scores数组的第二个元素分配给$score,并记住$score仍然指向$scores数组的第三个元素,因此,第二次迭代是:

$scores[2] = $scores[1];

所以在第二次迭代之后,$scores数组是:

['a','b','b']

在第三次(最后一次)迭代中,我们将$scores的第三个元素分配给自己:

$scores[2] = $scores[2];

因此,$scores数组的内容是:

['a', 'b' ,'b']

希望这个解释能帮助您理解foreach循环中变量引用可能会导致的问题。

要解决此问题,应始终在循环后使用unset()函数来释放引用变量,如下所示:

foreach ($scores as &$score) {
}
unset($score);

PHP foreach – 迭代关联数组的元素

要遍历关联数组的元素,可以使用以下语法:

<?php
foreach ($array as $key => $value) {
   // 在这里处理元素的$key 和 $value 
}

对于数组中的每个元素,元素的键被分配给$key变量,元素的值被分配给$value变量。

让我们看下面的例子:

<?php
 
$name = [
    'one'  => 'tom',
    'two'   => 'Hyman',
    'three' => 'ben'
];
 
foreach ($name as $key => $value) {
    echo $key . ':' . $value . '<br>';
}

PHP foreach - 遍历对象的公共属性

使用foreach循环遍历对象的公共属性的语法与遍历关联数组的元素相同。

请看下面的例子:

<?php
 
class Person
{
    public $firstName;
    public $lastName;
    public $middleName;
 
    public function __construct($firstName, $lastName, $middleName)
    {
        $this->firstName  = $firstName;
        $this->lastName   = $lastName;
        $this->middleName = $middleName;
    }
}
 
$john = new Person('tom', 'Hyman', 'benny');
 
foreach ($john as $propName => $propValue) {
    echo $propName . ': ' . $propValue . '<br>';
}

首先,我们定义了Person类,它有三个公共属性:firstName、lastName和middleName。
其次,我们创建了Person类的新对象$john。
最后,我们使用foreach语句遍历$john对象的公共属性并显示它们的值。