Foreach は PHP でよく使用されますが、foreach を使用するには配列を使用する必要があります。したがって、この記事では、配列と foreach について同時に説明します。
foreach には 2 つの構文があります:
最初の構文: 指定された配列ステートメントの array_expression 配列を走査します。ループを通過するたびに、現在のセルの値が $value に割り当てられ、配列内のポインターが 1 ステップ前に移動します (そのため、次のループで次のセルが取得されます)。
foreach (array_expression as $value) statement
2 番目: 上記と同様に、同時に、現在のユニットのキー名も各ループの変数 $key に割り当てられます。
rreee以下で一つずつ説明していきましょう!
1. 1 次元の通常の配列と foreach
まず、次のように 1 次元の配列を作成します。
foreach (array_expression as $key => $value) statement
1. 最初の foreach メソッドを使用して出力します。
$a = array('Tom','Mary','Peter','Jack');
最終結果は次のようになります:
foreach ($a as $value) { echo $value."<br/>"; }
2. 2 番目の foreach メソッドを使用して出力します。
Tom Mary Peter Jack
最終結果は次のとおりです:
0、Tom
1、Mary
2、Peter
3、Jack
要約: 明らかに、 $key がもう 1 つだけあることがわかり、この $key value はシリアル番号 1、2、3、4 などです。
2. 1 次元の連想配列と foreach
1 次元の連想配列は次のとおりです。
foreach ($a as $key => $value) { echo $key.','.$value."<br/>"; }
次のように記述することを好む人もいます。
$b = array('a'=>'Tom','b'=>'Mary','c'=>'Peter','d'=>'Jack');
1. 最初の foreach メソッドを使用します。上記と同じように出力します。
$b = array( 'a'=>'Tom', 'b'=>'Mary', 'c'=>'Peter', 'd'=>'Jack' );
最終結果は次のようになります:
foreach ($b as $value) { echo $value."<br/>"; }
2. 2 番目の foreach メソッドを使用して出力します。
Tom Mary Peter Jack
最終結果は
foreach ($b as $key => $value) { echo $key.','.$value."<br/>"; }
要約: 明らかに、1 次元の連想配列では、$key は関連付けられたシリアル番号、つまり、対応する a、b、c、d です。
3. 2 次元の通常の配列と foreach
2 次元の配列を走査する場合、少し面倒になります。なぜでしょうか。走査された値は配列であるため、配列に対してさまざまな操作を実行できます。
まず、次のような基本的な 2 次元配列を見てみましょう
a,Tom b,Mary c,Peter d,Jack
1。最初の foreach メソッド:
$c = array( array('1','Tom'), array('2','Mary'), array('3','Peter'), array('4','Jack') );
を使用し、次の結果を取得します:
foreach ($c as $value) { print_r($value); echo "<br/>"; }
2。次の結果が得られます:
Array ( [0] => 11 [1] => Tom ) Array ( [0] => 22 [1] => Mary ) Array ( [0] => 33 [1] => Peter ) Array ( [0] => 44 [1] => Jack )
概要: 上記からわかるように、基本的な 2 次元配列の場合、$key は 0123 などのシリアル番号です。
4. 連想 2 次元配列と foreach
は、連想 2 次元配列が実際のプロジェクトでよく使用されることを示しています。なぜ?一般に、データベースから抽出されたデータは 2 次元配列に関連付けられます。2 次元配列の関連付けを学習すれば、実際の PHP の実践ではその大部分を習得したことになります。
次に、次のように、最初に関連する 2 次元配列をリストします:
foreach ($c as $key => $value) { echo '$key='.$key."<br/>"; print_r($value); echo "<br/>"; }
1. 最初のメソッド コードを使用します:
$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 )
結果は次のようになります:
$d = array( array('id'=>'11','name'=>'Tom'), array('id'=>'22','name'=>'Mary'), array('id'=>'33','name'=>'Peter'), array('id'=>'44','name'=>'Jack') );
明らかに、関連付けられているものと関連付けられていないものの違いは次のとおりです。関連付けられていない部分は 0/1 などですが、関連付けには特定の名前 ID/名前などが表示されます。
2. 2 番目のメソッドのコードを使用します:
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 )
概要: ここで $key は 0/1/2/3 のままです。
5. プロジェクトでの実際の適用
説明: プロジェクトでは配列に多くの変更があり、もちろん 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' => '其它图片') );
同时,数据库是这个样子的。
说明:数据库的分类就是这个样子的!取出来的数组也是这个样子的!一般这样子的!
//从数据库中取出的分类数据 $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'].','; }
结果如下:
附:$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 ( ) ) ) ) )