PHP中经常使用foreach,而要使用foreach就必须使用链表。
foreach 有两种句型:
第一种:遍历给定字段语句array_expression字段。
在每次循环中,当前单元格的值被赋给$value,但链表内的指针向前移动一步(因此下一次循环将获得下一个单元格)。
foreach(数组表达式作为$值)
第二种:同上,每次循环中也会将当前单元的键值赋给变量$key。
foreach(数组表达式为$key=>$value)
1.一维普通链表和foreach
我们首先写一个一维字段,如下:
$a=array('汤姆','玛丽','彼得','杰克');
1.我们使用第一个foreach方法来输出。
foreach($aas$值){
回声$值。”
”;
最终结果是:
汤姆
玛丽
彼得
杰克
2、我们使用第二个foreach方法来输出。
foreach($aas $key=>$value){
echo$key.','.$value."
”;
最终结果是:
0、汤姆
1、玛丽
2、彼得
3、杰克
总结:多了一个$key,这个$key的值为序号1、2、3、4等。
二维、一维关联字段和foreach
一维关联字段如下:
$b=array('a'=>'汤姆','b'=>'玛丽','c'=>'彼得','d'=>'杰克');
有些人喜欢这样写,如下:
$b=数组(
'a'=>'汤姆',
'b'=>'玛丽',
'c'=>'彼得',
'd'=>'杰克'
);
1.我们使用第一个foreach方法,输出与上面相同。
foreach($bas$值){
回声$值。”
”;
最终结果是:
汤姆
玛丽
彼得
杰克
2、我们使用第二个foreach方法来输出。
foreach($bas$key=>$value){
echo$key.','.$value."
”;
最终结果是:
原子
b、玛丽
c、彼得
d、杰克
总结:在一维关联字段下,$key是关联的序号,即对应的a、b、c、d。
3.二维普通链表和foreach
遍历二维字段会麻烦一点,因为遍历的值是一个字段,而既然是链表,就可以对链表进行各种操作。
我们先看一个基本的二维场,如下:
$c=数组(
数组('1','汤姆'),
数组('2','玛丽'),
数组('3','彼得'),
数组('4','杰克')
);
1.我们使用第一个foreach方法来输出。
foreach($cas$值){
print_r($值);
回声”
”;
得到这个结果:
数组([0]=>1[1]=>汤姆)
数组([0]=>2[1]=>玛丽)
数组([0]=>3[1]=>彼得)
数组([0]=>4[1]=>杰克)
2、我们使用第二个foreach方法来输出。
foreach($cas$key=>$value){
回显'$key='.$key。"
”;
print_r($值);
回声”
”;
得到以下结果:
$键=0
数组([0]=>1[1]=>汤姆)
$键=1
数组([0]=>2[1]=>玛丽)
$键=2
数组([0]=>3[1]=>彼得)
$键=3
数组([0]=>4[1]=>杰克)
总结:从上面可以看出php定义二维数组,对于基本的二维字段来说,$key就是序号,比如0123等等。
4.用foreach关联二维字段
说明:关联二维链表在实际项目中使用较多,因为通常从数据库中提取的数据都是与二维字段相关联的。 学会关联二维字段后,在PHP的实战中,已经掌握了很大一部分了。
所以首先列出关联的二维字段,如下:
$d=数组(
array('id'=>'1','name'=>'汤姆'),
array('id'=>'2','name'=>'玛丽'),
array('id'=>'3','name'=>'Peter'),
array('id'=>'4','name'=>'Jack')
);
1.使用第一种方法代码:
foreach($das$值){
print_r($值);
回声”
”;
得到的结果如下:
数组([id]=>1[name]=>汤姆)
数组([id]=>2[name]=>玛丽)
数组([id]=>3[name]=>Peter)
数组([id]=>4[name]=>Jack)
显然,关联和非关联的区别在于:非关联后面是0/1等,而关联则显示具体名称id/name等。
2、使用第二种方法的代码:
foreach($das$key=>$value){
回显'$key='.$key.'
”;
print_r($值);
回声”
”;
得到的结果如下:
$键=0
数组([id]=>1[name]=>汤姆)
$键=1
数组([id]=>2[name]=>玛丽)
$键=2
数组([id]=>3[name]=>Peter)
$键=3
数组([id]=>4[name]=>Jack)
摘要:这里$key仍然是0/1/2/3。
5. 实际应用
说明:项目中php定义二维数组,链表有很多变化。 下面简单说一下一些常见的项目实战吧!
实战1:将二维关联字段改为一维普通链表。
或者关联二维字段的第四个枚举,如下:
$d=数组(
array('id'=>'1','name'=>'汤姆'),
array('id'=>'2','name'=>'玛丽'),
array('id'=>'3','name'=>'Peter'),
array('id'=>'4','name'=>'Jack')
);
我们只需要name的内容,我们可以通过以下方式实现:
foreach($das$key=>$value){
回声($值['名称']);
回声”
”;
有时我们需要将其组织成一维字段,我们可以使用以下方法:
//获取名称列作为一维字段
//名称列
$nameArr=数组();
foreach($das$key=>$value){
$nameArr[]=$value['name'];
print_r($nameArr);
首先通过构造一个空链表,然后将foreach后面的结果参数赋予到空链表中,得到一个新的字段。
上述代码的结果如下:
大批
[0]=>汤姆
[1]=>玛丽
[2]=>彼得
[3]=>杰克
这个字段显然是一个一维的普通链表,如下:
$d=array('汤姆','玛丽','彼得','杰克');
这就是将二维关联字段变成一维普通链表的过程。
如果我们从数据库中删除一个二维相关字段,那么如何删除父类别呢?
如何获取父类目对应的子类目?
对于二级分类,一个更容易解释的反例是“新闻分类”。
我们先写一个链表。
//从数据库中取出的分类数据
$original_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=数组(
大批(
'id'=>1,
'pid'=>0,
'名称'=>'新闻类别'
),
大批(
'id'=>2,
'pid'=>0,
'名称' => '最新公告'
),
大批(
'id'=>3,
'pid'=>1,
'名字' => '外国新闻'
),
大批(
'id'=>4,
'pid'=>1,
'名称' => '国际新闻'
),
大批(
'id'=>5,
'pid'=>0,
'名称' => '图片分类'
),
大批(
'id'=>6,
'pid'=>5,
'姓名' => '新闻图片'
),
大批(
'id'=>7,
'pid'=>5,
'名称' => '其他图片'
);
我们想要的最终结果:
//排序后的数据
$输出数组=数组(
大批(
'id'=>1,
'pid'=>0,
'name'=>'新闻类别',
'孩子'=>数组(
大批(
'id'=>3,
'pid'=>1,
'名字' => '外国新闻'
),
大批(
'id'=>4,
'pid'=>1,
'名称' => '国际新闻'
),
),
),
大批(
'id'=>2,
'pid'=>0,
'name'=>'最新公告',
),
大批(
'id'=>5,
'pid'=>0,
'name'=>'图片分类',
'孩子'=>数组(
大批(
'id'=>6,
'pid'=>5,
'姓名' => '新闻图片'
),
大批(
'id'=>7,
'pid'=>5,
'名称'=>'其他图片'
),
),
),
);
可以看到,链表中多了一个数组,就是children。
如何从 $original_array 更改为 $output_array?
函数如下:
//组织函数
/**
* 生成无限层次树算法
*@paramarray$arr 输入字段
* @paramnumber$pid 根级别的pid
*@paramstring$column_name列名,id|parent的pid名称 id child|children的key值 子链表
*@returnarray$ret
*/
functionmake_tree($arr,$pid=0,$column_name='id|pid|children'){
列表($idname,$pidname,$cldname)=explode('|',$column_name);
$ret=数组();
foreach($arras$k=>$v){
if($v[$pidname]==$pid){
$tmp=$arr[$k];
取消设置($arr[$k]);
$tmp[$cldname]=make_tree($arr,$v[$idname],$column_name);
$ret[]=$tmp;
返回$ret;
如何使用它?
//整理函数的使用
$output_array=make_tree($original_array);
完整的用法如下:
$output_array=make_tree($arr,0,'id|pid|children')
函数之后我们这样调用就可以得到一级分类和二级分类。
foreach($output_arrayas $key=>$value){
echo ''.$value['name'].'';
foreach($value['children']as $key=>$value){
echo$value['名称'].',';
结果如下:
对于 $output_array 字段,我们使用 print_r 得到以下结果。
大批
[0]=>数组
[id]=>1
[pid]=>0
[名称]=>新闻分类
[孩子]=>数组
[0]=>数组
[id]=>3
[pid]=>1
[name]=>国外新闻
[孩子]=>数组
[1]=>数组
[id]=>4
[pid]=>1
[名称] => 国际新闻
[孩子]=>数组
[1]=>数组
[id]=>2
[pid]=>0
[名称]=>最新公告
[孩子]=>数组
[2]=>数组
[id]=>5
[pid]=>0
[名称]=>图片分类
[孩子]=>数组
[0]=>数组
[id]=>6
[pid]=>5
[名称]=>新闻图片
[孩子]=>数组
[1]=>数组
[id]=>7
[pid]=>5
[名称]=>其他图片
[孩子]=>数组
就是这样。