foreach有两种语法:

第一种:遍历给定的 数组语句 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

foreach (array_expression as $value)  

第二种:同上,同时当前单元的键名也会在每次循环中被赋给变量 $key。

foreach (array_expression as $key => $value)

下边我们一一来讲解一下!

一、一维普通数组 与 foreach

我们先写一个一维数组,如下:

$arr = array(
    'Tom',
    'Mary',
    'Peter',
    'Ray',
);

1、我们用第一种foreach方法来输出。

foreach ($arr as $value){
    echo $value."<br>";
}

最后得到的结果是:

Tom
Mary
Peter
Ray

2、我们用第二种 foreach 方法来输出。

foreach ($arr as $key => $value){
    echo $key.','.$value."<br>";
}

最后得到的结果是:

0,Tom
1,Mary
2,Peter
3,Ray

总结: 很明显,我们看到只是多了一个 $key , 而这个 $key 的值就是序号 1、2、3、4 等等!

二、一维关联数组 与 foreach

一维关联数组如下:

$arr = array(
    'a' => 'Tom',
    'b' => 'Mary',
    'c' => 'Peter',
    'd' => 'Ray',
);

1、我们用第一种foreach方法来输出和上边一样。

foreach ($arr as $value){
    echo $value."<br>";
}

最后得到的结果是:

Tom
Mary
Peter

Ray

2、我们用第二种 foreach 方法来输出。

foreach ($arr as $key => $value){
    echo $key.','.$value."<br>";
}

最后得到的结果是:

a,Tom
b,Mary
c,Peter
d,Ray

总结: 很明显,在一维关联数组下, $key就是关联的序号,即相应的a、b、c、d。

三、二维普通数组 与 foreach

遍历二维数组时,稍微麻烦一些,为什么呢?因为遍历出来的value值,是一个数组,既然是数组,那么就可以对数组进行各种操作!

我们先看一个基本的二维数组,如下:

$arr = array(
    array('1','Tom'),
    array('2','Mary'),
    array('3','Peter'),
    array('4','Ray'),
);

1、我们采用第一种 foreach方法:

foreach ($arr as $value){
    print_r($value);
    echo "<br>";
}

得到这样的结果:

Array( [0] => 1 [1] => Tom)
Array( [0] => 2 [1] => Mary)
Array( [0] => 3 [1] => Peter)
Array( [0] => 4 [1] => Ray)

2、我们采用第二种foreach方法:

foreach ($arr as $key => $value){
    echo '$key='.$key."<br>";
    print_r($value);
    echo "<br>";
}

得到这样的结果:

$key=0
Array( [0] => 1 [1] => Tom)
$key=1
Array( [0] => 2 [1] => Mary)
$key=2
Array( [0] => 3 [1] => Peter)
$key=3
Array( [0] => 4 [1] => Ray)

总结:由上可知,基本二维数组,$key就是序号 ,如 0、1、2、3 等等!

四、关联二维数组 与 foreach

关联二维数组在实际项目中,用到的可多了。为什么?一般数据库提取出来的数据都是关联二维数组

列出关联二维数组,如下:

$arr = array(
    array('id' => '11','name' => 'Tom'),
    array('id' => '12','name' => 'Mary'),
    array('id' => '13','name' => 'Peter'),
    array('id' => '14','name' => 'Ray'),
);

1、用第一种方法代码:

foreach ($arr as $value){
    print_r($value);
    echo "<br>";
}

得到的结果如下:

Array( [id] => 11 [name] => Tom)
Array( [id] => 12 [name] => Mary)
Array( [id] => 13 [name] => Peter)

Array( [id] => 14 [name] => Ray)

很明显,关联与不关联的区别就是:不关联前边是 0/1 等等,而关联显示具体名称 id/name 等等。

2、用第二种方法的代码:

foreach ($arr as $key => $value){
    echo '$key'.$key."<br>";
    print_r($value);
    echo "<br>";
}

得到的结果如下:

$key0
Array( [id] => 11 [name] => Tom)
$key1
Array( [id] => 12 [name] => Mary)
$key2
Array( [id] => 13 [name] => Peter)
$key3
Array( [id] => 14 [name] => Ray)

总结:这里$key仍然是 0、1、2、3 。


五、项目中实战应用

实战:将二维关联数组变为一维普通数组

列出关联二维数组,如下:

$arr = array(
    array('id' => '11','name' => 'Tom'),
    array('id' => '12','name' => 'Mary'),
    array('id' => '13','name' => 'Peter'),
    array('id' => '14','name' => 'Ray'),
);

现在我们只要 name 一列的内容,当然我们可以用以下的方法来实现:

foreach ($arr as $key => $value){
    echo ($value['name']);
    echo "<br>";
}

但有时候我们不得不将之列为一个一维数组,于是我们就有了以下的方法:

$nameArr = array();
foreach ($arr as $key => $value){
    $nameArr[] = $value['name'];
}
print_r($nameArr);

以上通过赋空数组值,foreach 这个空数组等于我们的值,就得到了一个新的数组!以上代码的结果如下:

Array( [0] => Tom [1] => Mary [2] => Peter [3] => Ray)

这个数组明显是:一维普通数组,如下:

$arr = array(
    'Tom',
    'Mary',
    'Peter',
    'Ray',
);

好了,将二维关联数组变为一维普通数组就写到了这里!

详解PHP中foreach的更多相关文章

  1. 【转】详解C#中的反射

    原帖链接点这里:详解C#中的反射   反射(Reflection) 2008年01月02日 星期三 11:21 两个现实中的例子: 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内 ...

  2. 详解JSTL的forEach标签

    详解JSTL的forEach标签 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍.      <c:forEach> 标签的语法 说明 : 语法:迭代一集合对象之所有 ...

  3. (转载)详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不 ...

  4. 详解javaweb中jstl如何循环List中的Map数据_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 详解javaweb中jstl如何循环List中的Map数据 第一种方式: 1:后台代码(测试) List<Map& ...

  5. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

  6. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  7. 详解Webwork中Action 调用的方法

    详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...

  8. 【转】详解JavaScript中的this

    ref:http://blog.jobbole.com/39305/ 来源:foocoder 详解JavaScript中的this JavaScript中的this总是让人迷惑,应该是js众所周知的坑 ...

  9. 深入详解SQL中的Null

    深入详解SQL中的Null NULL 在计算机和编程世界中表示的是未知,不确定.虽然中文翻译为 “空”, 但此空(null)非彼空(empty). Null表示的是一种未知状态,未来状态,比如小明兜里 ...

随机推荐

  1. 双接口(回调)promise cb

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. url 中文及特殊字符转码

    #include <ctype.h> std::string UrlEncode(const std::string& szToEncode) {    std::string s ...

  3. HttpHandler和ashx使用Session 出现未初始化异常

    原因: HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息 接口IRequiresSessionState: 指定目标 HTTP 处理程序需 ...

  4. 微信公众号_订阅号_爬虫puppeteer

    puppeteer 借助 puppeteer 库实现爬虫,puppeteer 提供了高级 api 接口来操作 chrome 来 npm install puppeteer --save-dev    ...

  5. [LeetCode] N-ary Tree Level Order Traversal N叉树层序遍历

    Given an n-ary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. ajax 传递中文字符参数 问题

    使用ajax 传递中文字符串时, 服务端会接收不到预期的 中文字符. 此时,需要对 js中的中文字符参数进行 编码,  到达服务端后, 再为其解码 即可. 前端: var url = '....'; ...

  7. gvim 技巧

    1.对齐 很多时候想对齐括号和“=”号,行数很多的时候就是体力活了.使用3条命令就可以完成对齐 :set ts=16                    ##将tab设置为16 :%s/(/\t(/ ...

  8. Dapp开发教程一 Asch Dapp Hello World

    1 基本流程 Asch有三种net,localnet,testnet,mainnet,后两种是发布到线上的,可通过公网访问. 第一种localnet是运行在本地的.只有一个节点的私链,主要是为了方便本 ...

  9. 解决 AutoMapper ProjectTo 不起作用的问题

    这两天在一个 ASP.NET Core 项目中遭遇了 AutoMapper ProjectTo 不起作用的奇怪问题,虽然在 ProjectTo 中指定了 DTO ,但 EF Core 生成的 SQL ...

  10. 聊天机器人開發好消息!!DIALOGFLOW與微信的天作之合!!

    虽然DIALOGFLOW暂未能够与微信(WECHAT)或企业微信(ENTERPRISE WECHAT)进行任何技制上的连接INTERGRATION),确实限制了我们这些聊天机器人开发者的创作空间,因为 ...