PHP 您现在的位置是:首页 > 开发笔记 > PHP

PHP遍历数组的几种方式

来源:惠达浪原创 发布时间:2019-09-01 最后更新:2020-06-18 2293已围观

摘要我们经常需要遍历PHP数组,或者类似数组的对象,实际编写时有好多方法和技巧,在此说明。

在最近一段时间的开发过程中,对遍历数组有了一些新的认识,特别是几种不同的方法,分别对应哪种情况。

我们假设有这样一个需要遍历的数组:

$arr = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry', 'd' => 'durian'];


1、foreach

这是最常见的方式,无需过多解释,据说效率一般,比某些函数慢,比另一些函数快,我自己没有做过测试。推荐在大多数情况下使用,因为逻辑简单,代码直观。缺点是简单应用时,代码比较繁琐。例如:

foreach ($fruits as $key => $fruit) {
    echo $key . '-' . $fruit . '</br>';
}

输出结果:

a-apple
b-banana
c-cherry
d-durian


2、for

有人说这个速度最快,我没证实,但我猜应该是这样的。不过这种写法,最麻烦的倒是没错,写起来太烦人。最关键的是,对上边这种键值对的数组,不能用哇!所以来一个普通数组吧。

$fruits = ['apple', 'banana', 'cherry', 'durian'];
for ($i = 0; $i < count($fruits); $i++) {
    echo $fruits[i];
}

输出结果:

apple, banana, cherry, durian

3、array_map

需要对数组进行处理,生成一个新数组时使用。该函数不破坏原数组,返回一个经过处理的新数组。更多细节参考PHP手册。

$newArray = array_map('ucfirst', $fruits); //调用函数
var_dump($fruits);
var_dump($newArray);

输出结果:

array (size=4)
  'a' => string 'apple' (length=5)
  'b' => string 'banana' (length=6)
  'c' => string 'cherry' (length=6)
  'd' => string 'durian' (length=6)

array (size=4)
  'a' => string 'Apple' (length=5)
  'b' => string 'Banana' (length=6)
  'c' => string 'Cherry' (length=6)
  'd' => string 'Durian' (length=6)

也可以使用闭包方式

$newArray = array_map(function ($value) {
    return ucfirst($value);
}, $fruits);
var_dump($fruits);
var_dump($newArray);

输出结果是一样的,首字母都成功大写了。

4、array_walk

需要对数组本身进行处理时使用。该函数只能修改数组本身,因此经常用来加工处理数组。另外也是替代foreach的最佳选择。

$newArray = array_walk($fruits, function (&$value) {
    $value = ucfirst($value);
});
var_dump($fruits);
var_dump($newArray);

该函数的数组,是引用调用的,因此其数组值也可以选择引用(需要修改)或者普通调用。 输出结果:

array (size=4)
  'a' => string 'Apple' (length=5)
  'b' => string 'Banana' (length=6)
  'c' => string 'Cherry' (length=6)
  'd' => string 'Durian' (length=6)

true

注意,该函数返回结果为 true ,而且官方说明上好像只返回true。

5、array_filter


需要对数组内容进行过滤时使用。该函数通过回调函数来确认哪些数据需要留下,结果返回一个新数组。

$newArray = array_filter($fruits, function ($value) {
    return strlen($value) === 6;
});
var_dump($fruits);
var_dump($newArray);

输出结果:

array (size=4)
  'a' => string 'apple' (length=5)
  'b' => string 'banana' (length=6)
  'c' => string 'cherry' (length=6)
  'd' => string 'durian' (length=6)

array (size=3)
  'b' => string 'banana' (length=6)
  'c' => string 'cherry' (length=6)
  'd' => string 'durian' (length=6)


6、array_reduce


将数组内所有的值经过处理,变成一个字符串返回。这个通常用于SQL语句拼写,数组内字符串拼接,数组求和等。

$newArray = array_reduce($fruits, function ($result, $value) {
    return $result . $value . ';';
});
var_dump($newArray);

其中,回调函数接收两个参数,第一个是上次运算的结果,第二个是数组当前值。当第一次进入回调时,$result值为null。

输出结果:

string 'apple;banana;cherry;durian;' (length=27)

注意:array_map里的函数,可以是系统函数,也可以是自定义函数。array_walk里的函数,只能是自定义函数,因为默认它会向函数传递2个参数,就是值和键。

个人感受,如果仅仅是替代foreach循环,array_walk是最佳选择, 理由是:不需要返回结果、可以处理数组本身,还可以传递更多参数,方便至极啊!来个完整的示例:


$fruits   = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry', 'd' => 'durian'];
$userData = ['prefix' => 'The first letter of the "', 'suffix' => '" word is '];

array_walk($fruits, function ($value, $key, $param) {
    $str = $param['prefix'] . $value . $param['suffix'] . $key . '.';
    echo $str;
}, $userData);

示例中,$userData是用户的额外参数。回调函数接收的参数其实有3个,第1个是当前数组值,第2个是数组的键,而第3个,则是array_walk的第3个参数,原封不动地传过来。

当然,使用额外参数,如果是闭包,呵呵,可以使用use啊!!

$fruits   = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry', 'd' => 'durian'];
$userData = ['prefix' => 'The first letter of the "', 'suffix' => '" word is '];
$suffix   = '.';
array_walk($fruits, function ($value, $key, $param) use ($suffix) {
    $str = $param['prefix'] . $value . $param['suffix'] . $key . $suffix;
    echo $str;
}, $userData);

最终结果都是一样的。

The first letter of the "apple" word is a.
The first letter of the "banana" word is b.
The first letter of the "cherry" word is c.
The first letter of the "durian" word is d.

很赞哦! (505)


站点信息

  • 网站平台ThinkCMF 5.1.5
  • PHP版本:7.3.31
  • QQ交流群: 惠达浪技术交流