详解PHP中foreach的用法和实例


Posted in PHP onOctober 25, 2016

在PHP中经常会用到foreach的使用,而要用到foreach,就必须用到数组。因此,在这篇文章中,我们一边讲数组,一边讲foreach。

foreach有两种语法:

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

foreach (array_expression as $value)

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

foreach (array_expression as $key => $value)

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

一、一维普通数组 与 foreach

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

$a = array('Tom','Mary','Peter','Jack');

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

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

最后得到的结果是:

Tom
Mary
Peter
Jack

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

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

最后得到的结果是:

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

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

二、一维关联数组 与 foreach

一维关联数组如下:

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

也有人爱这么写,如下:

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

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

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

最后得到的结果是:

Tom
Mary
Peter
Jack

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

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

最后得到的结果是:

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

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

三、二维普通数组 与 foreach

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

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

$c = array(
  array('1','Tom'),
  array('2','Mary'),
  array('3','Peter'),
  array('4','Jack')
);

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

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

得到这样的结果:

Array ( [0] => 11 [1] => Tom )
Array ( [0] => 22 [1] => Mary )
Array ( [0] => 33 [1] => Peter )
Array ( [0] => 44 [1] => Jack )

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

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

得到如下的结果:

$key=0
Array ( [0] => 11 [1] => Tom )
$key=1
Array ( [0] => 22 [1] => Mary )
$key=2
Array ( [0] => 33 [1] => Peter )
$key=3
Array ( [0] => 44 [1] => Jack )

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

四、关联二维数组 与 foreach

说明,关联二维数组在实际项目中,用到的可多了。为什么?一般数据库提取出来的数据都是关联二维数组,学会了关联二维数组,就在PHP的实战中,已经掌握了很大一部分了!

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

$d = array(
  array('id'=>'11','name'=>'Tom'),
  array('id'=>'22','name'=>'Mary'),
  array('id'=>'33','name'=>'Peter'),
  array('id'=>'44','name'=>'Jack')
);

1、用第一种方法代码:

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

得到的结果如下:

Array ( [id] => 11 [name] => Tom )
Array ( [id] => 22 [name] => Mary )
Array ( [id] => 33 [name] => Peter )
Array ( [id] => 44 [name] => Jack )

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

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

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

得到的结果如下:

$key=0
Array ( [id] => 11 [name] => Tom )
$key=1
Array ( [id] => 22 [name] => Mary )
$key=2
Array ( [id] => 33 [name] => Peter )
$key=3
Array ( [id] => 44 [name] => Jack )

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

五、项目中实战应用

说明:在项目中,数组的变化好多,当然foreach功不可没!当然也可以用while、each等等方法,但是foreach最为方便了!下边简要说一下几个常见的项目实战!

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

还是第四列出关联二维数组,如下:

$d = array(
  array('id'=>'11','name'=>'Tom'),
  array('id'=>'22','name'=>'Mary'),
  array('id'=>'33','name'=>'Peter'),
  array('id'=>'44','name'=>'Jack')
);

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

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

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

//获取name列作为一维数组
$nameArr = array(); //name列
foreach ($d as $key => $value) {
  $nameArr[] = $value['name'];
}
print_r($nameArr);

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

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

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

$d = array('Tom','Mary','Peter','Jack');

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

实战2 :二级分类以及无限级分类

很明显,我们从数据库中取出来的数据就是一个二维数组,而且是二维关联数组。那么,我们怎么取出父分类?怎么取出对应父分类的子分类呢?

首先要说明的是:几乎所有的分类都是一个数据库模式,因此我们十分有必要了解它的结构,还有怎么取出对应的数据!

对于二级分类,为了说明方便,我从网上找一个比较好说明的例子,那就是“新闻分类“!

好了,废话不多说,开始正题!我们先写一个数组。

//从数据库中取出的分类数据
$original_array = array(
  array('id' => 1,'pid' => 0,'name' => '新闻分类'),
  array('id' => 2,'pid' => 0,'name' => '最新公告'),
  array('id' => 3,'pid' => 1,'name' => '国内新闻'),
  array('id' => 4,'pid' => 1,'name' => '国际新闻'),
  array('id' => 5,'pid' => 0,'name' => '图片分类'),
  array('id' => 6,'pid' => 5,'name' => '新闻图片'),
  array('id' => 7,'pid' => 5,'name' => '其它图片')
);

同时,数据库是这个样子的。

详解PHP中foreach的用法和实例

说明:数据库的分类就是这个样子的!取出来的数组也是这个样子的!一般这样子的!

//从数据库中取出的分类数据
$original_array = array(
  array(
    'id' => 1,
    'pid' => 0,
    'name' => '新闻分类'
  ),
  array(
    'id' => 2,
    'pid' => 0,
    'name' => '最新公告'
  ),
  array(
    'id' => 3,
    'pid' => 1,
    'name' => '国内新闻'
  ),
  array(
    'id' => 4,
    'pid' => 1,
    'name' => '国际新闻'
  ),
  array(
    'id' => 5,
    'pid' => 0,
    'name' => '图片分类'
  ),
  array(
    'id' => 6,
    'pid' => 5,
    'name' => '新闻图片'
  ),
  array(
    'id' => 7,
    'pid' => 5,
    'name' => '其它图片'
  )
);

那么首先我们得知道我们想要的结果是什么样子呢?这一点:我们必要知道!(以前我对这方面了解比较不深,又常用开源程序,因此导致我不怎么会写这方面了)

我们最终想要的结果是这样子的!(不怕大家笑话,这一点我请一个朋友帮的忙才解决的!)

//整理后的分类数据
$output_array = array(
  array(
    'id' => 1,
    'pid' => 0,
    'name' => '新闻分类',
    'children' => array(
      array(
        'id' => 3,
        'pid' => 1,
        'name' => '国内新闻'
      ),
      array(
        'id' => 4,
        'pid' => 1,
        'name' => '国际新闻'
      ),
    ),
  ),
  array(
    'id' => 2,
    'pid' => 0,
    'name' => '最新公告',
  ),
  array(
    'id' => 5,
    'pid' => 0,
    'name' => '图片分类',
    'children' => array(
      array(
        'id' => 6,
        'pid' => 5,
        'name' => '新闻图片'
      ),
      array(
        'id' => 7,
        'pid' => 5,
        'name' => '其它图片'
      ),
    ),
  ),
);

很明显,这里数组多了一个字段,就是 children!

那么,怎么 从 $original_array 变为 $output_array呢?这里有我一个朋友做的函数,当然也用到 foreach!

函数如下:

//整理函数
/**
 * 生成无限级树算法
 * @author Baiyu 2014-04-01
 * @param array $arr        输入数组
 * @param number $pid        根级的pid
 * @param string $column_name    列名,id|pid父id的名字|children子数组的键名
 * @return array $ret
 */
function make_tree($arr, $pid = 0, $column_name = 'id|pid|children') {
  list($idname, $pidname, $cldname) = explode('|', $column_name);
  $ret = array();
  foreach ($arr as $k => $v) {
    if ($v [$pidname] == $pid) {
      $tmp = $arr [$k];
      unset($arr [$k]);
      $tmp [$cldname] = make_tree($arr, $v [$idname], $column_name);
      $ret [] = $tmp;
    }
  }
  return $ret;
}

那们怎么使用呢?

//整理函数的使用
$output_array = make_tree($original_array);

完整使用方法如下:

$output_array =make_tree($arr, 0, 'id|pid|children')

函数之后,我们这样调用就得到了一级分类与二级分类!

foreach ($output_array as $key => $value) {
  echo '<h2>'.$value['name'].'</h2>';
  foreach ($value['children'] as $key => $value) {
    echo $value['name'].',';
}

结果如下:

详解PHP中foreach的用法和实例

附:$output_array 这个数组,我们使用print_r,就可以得到如下的结果!

Array
(
  [0] => Array
    (
      [id] => 1
      [pid] => 0
      [name] => 新闻分类
      [children] => Array
        (
          [0] => Array
            (
              [id] => 3
              [pid] => 1
              [name] => 国内新闻
              [children] => Array
                (
                )

            )

          [1] => Array
            (
              [id] => 4
              [pid] => 1
              [name] => 国际新闻
              [children] => Array
                (
                )

            )

        )

    )

  [1] => Array
    (
      [id] => 2
      [pid] => 0
      [name] => 最新公告
      [children] => Array
        (
        )

    )

  [2] => Array
    (
      [id] => 5
      [pid] => 0
      [name] => 图片分类
      [children] => Array
        (
          [0] => Array
            (
              [id] => 6
              [pid] => 5
              [name] => 新闻图片
              [children] => Array
                (
                )

            )

          [1] => Array
            (
              [id] => 7
              [pid] => 5
              [name] => 其它图片
              [children] => Array
                (
                )

            )

        )

    )

)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
虚拟主机中对PHP的特殊设置
Oct 09 PHP
PHP学习之PHP变量
Oct 09 PHP
PHP批量上传图片的具体实现方法介绍.
Feb 26 PHP
PHP登录环节防止sql注入的方法浅析
Jun 30 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
PHP二维数组排序简单实现方法
Feb 14 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
Dec 08 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP与以太坊交互详解
Aug 24 PHP
php进行md5加密简单实例方法
Sep 19 PHP
tp5.1框架数据库子查询操作实例分析
May 26 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 PHP
php array_keys 返回数组的键名
Oct 25 #PHP
php array_key_exists() 与 isset() 的区别
Oct 24 #PHP
PHP实现简易blog的制作
Oct 24 #PHP
php基于websocket搭建简易聊天室实践
Oct 24 #PHP
详解php中 === 的使用
Oct 24 #PHP
使用PHP免费发送定时短信的实例
Oct 24 #PHP
浅谈php和js中json的编码和解码
Oct 24 #PHP
You might like
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
Popup弹出框添加数据实现方法
2017/10/27 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
react build 后打包发布总结
2018/08/24 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
python删除过期文件的方法
2015/05/29 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
Zabbix实现微信报警功能
2016/10/09 Python
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
竟聘演讲稿范文
2013/12/31 职场文书
迎新晚会主持词
2014/03/24 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
Golang获取List列表元素的四种方式
2022/04/20 Golang