php递归数组中的应用
<?php
$arr = array(array(1,2), array(3, 4), array(array(5, 6), array(7, 8)));
function t($a)
{
if(is_array($a))
{
foreach($a as $k=>$v)
{
$a[$k] = t($v);
}
}else{
$a = $a*10;
}
return $a;
}
$ab = t($arr);
// 此时数组的每个元素都乘了 10 了
print_r($ab);
// 结果为
Array
(
[0] => Array
(
[0] => 10
[1] => 20
) [1] => Array
(
[0] => 30
[1] => 40
) [2] => Array
(
[0] => Array
(
[0] => 50
[1] => 60
) [1] => Array
(
[0] => 70
[1] => 80
) ) )
=======================
如下示例:
function test($n) {
echo $n . " ";
if($n > 0)
{
test($n - 1);
}else
{
echo " <--> ";
}
echo " || ";
echo $n . " ";
}
test(6);
结果如下:6 5 4 3 2 1 0 <--> || 0 || 1 || 2 || 3 || 4 || 5 || 6
无限分类
数据库:(fid就是父类,默认为0,即总类为 0)

$conn = mysql_connect('localhost', 'root', '123456') or die("Error: " . mysql_error());
mysql_select_db("test", $conn);
mysql_query("set names utf8", $conn);
function get_array($id = 0) {
global $conn;
$sql = "select * from e_cate where fid = '{$id}'";
$res = mysql_query($sql, $conn);
$arr = array();
if($res)
{
while($rows = mysql_fetch_assoc($res))
{
$rows['child'] = get_array($rows['id']);
$arr[] = $rows;
}
return $arr;
}
}
$rr = get_array(0);
print_r($rr);
形式如下所示:
Array
(
[0] => Array
(
[id] => 1
[fid] => 0
[name] => 电子
[child] => Array
(
[0] => Array
(
[id] => 2
[fid] => 1
[name] => 数码
[child] => Array
(
[0] => Array
(
[id] => 3
[fid] => 2
[name] => 相机
[child] => Array
(
) ) [1] => Array
(
[id] => 11
[fid] => 2
[name] => 手机
[child] => Array
(
) ) ) ) [1] => Array
(
[id] => 4
[fid] => 1
[name] => 3c
[child] => Array
(
[0] => Array
(
[id] => 5
[fid] => 4
[name] => 笔记本
[child] => Array
(
) ) [1] => Array
(
[id] => 12
[fid] => 4
[name] => 平板
[child] => Array
(
) ) ) ) ) ) [1] => Array
(
[id] => 6
[fid] => 0
[name] => 服装
[child] => Array
(
[0] => Array
(
[id] => 7
[fid] => 6
[name] => 女装
[child] => Array
(
[0] => Array
(
[id] => 8
[fid] => 7
[name] => 谱子
[child] => Array
(
) ) [1] => Array
(
[id] => 13
[fid] => 7
[name] => 裙子
[child] => Array
(
) ) ) ) [1] => Array
(
[id] => 9
[fid] => 6
[name] => 男装
[child] => Array
(
[0] => Array
(
[id] => 10
[fid] => 9
[name] => 西装
[child] => Array
(
) ) [1] => Array
(
[id] => 14
[fid] => 9
[name] => 皮鞋
[child] => Array
(
) ) ) ) ) ) )
================
如果要把上面的无限分类格式化,如图所示不:

格式化函数:
function procHtml($tree)
{
$html = '';
foreach($tree as $t)
{
if($t['child'] == '')
{
$html .= "<li>{$t['name']}</li>";
}else
{
$html .= "<li>" . $t['name'];
$html .= procHtml($t['child']);
$html = $html . "</li>";
}
}
return $html ? "<ul>" . $html . "</ul>" : $html;
}
echo procHtml($rr);
如果再加上样式,即可变成自己的样式了
===============
其实可以直接用以下方法即可,减少了与数据库的交互
/* 大概步骤如下: 首先到数据库取数据,放到一个数组, 然后把数据转化为一个树型状的数组, 最后把这个树型状的数组转为html代码。
*/
$conn = mysql_connect('localhost', 'root', '123456') or die("Error: " . mysql_error());
mysql_select_db("test", $conn);
mysql_query("set names utf8", $conn);
$sql = "select * from e_cate";
$arr = array();
$res = mysql_query($sql, $conn);
if($res)
{
while($rows = mysql_fetch_assoc($res))
{
$arr[] = $rows;
}
}
// 把上面数组转换成树形,保存在数组中,不用再去查询数库存了
function getTree($data, $fid)
{
$tree = '';
foreach($data as $k => $v)
{
if($v['fid'] == $fid)
{
//父亲找到儿子
$v['child'] = getTree($data, $v['id']);
$tree[] = $v;
}
}
return $tree;
}
$tree = getTree($arr, 0);
//把树型状数组转为html
function procHtml($tree)
{
$html = '';
foreach($tree as $t)
{
if($t['child'] == '')
{
$html .= "<li>{$t['name']}</li>";
}else
{
$html .= "<li>" . $t['name'];
$html .= procHtml($t['child']);
$html = $html . "</li>";
}
}
return $html ? "<ul>" . $html . "</ul>" : $html;
}
echo procHtml($tree);
//最终效果与上面的一样
=================
如果感觉上面的递归难理解,可用下面的例子:
$conn = mysql_connect('localhost', 'root', '123456') or die("Error: " . mysql_error());
mysql_select_db("test", $conn);
mysql_query("set names utf8", $conn);
$sql = "select * from e_cate";
$array = array();
$res = mysql_query($sql, $conn);
if($res)
{
while($rows = mysql_fetch_assoc($res))
{
$array[] = $rows;
}
}
$arrs = array();
function display_tree($tag,$id)
{
global $array, $arrs;
//查询出来的数组,这里申明成常量,为了可以调用外界的$array
$result = findChild($array,$id);
//取得当前节点下的所有同级子节点
foreach ($result as $k => $v){
// 缩进显示节点名称
$arrs[] = $tag.$v['name'];
//再次调用这个函数显示子节点下的同级子节点
display_tree($tag."|_____|",$v['id']);
}
}
//取得当前节点下的所有同级子节点
function findChild($arr,$id){
$childs=array();
foreach ($arr as $k => $v){
if($v['fid']== $id){
$childs[]=$v;
}
}
return $childs;
}
display_tree("",0);
//初次显示树中的根节点
foreach($arrs as $k => $v) {
print_r($v); echo "<br />";
}
php递归数组中的应用的更多相关文章
- 从数组中取出N个元素的所有组合——递归实现
https://www.cnblogs.com/null00/archive/2012/04/27/2473788.html 今天在做POJ 1753时,需要枚举一个数组中所有组合.之前也遇到过类似的 ...
- js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值
这是学习过程中记录的一些关于数组操作的常用属性或方法,记录一下方便以后使用. // 数组去重 var arr1 = [1,1,2,3,4,5,6,3,2,4,5,'a','b','c','a',6,7 ...
- 寻找数组中的第K大的元素,多种解法以及分析
遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...
- 快速查找无序数组中的第K大数?
1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...
- 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数
题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...
- PHP array_count_values() 函数用于统计数组中所有值出现的次数。
定义和用法 array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数. 语法 array_count ...
- 求出数组前面k个元素或数组中元素大于一半的元素(快速排序与堆排序的灵活运用)
写这个的目的在于,说明快速排序的灵活运用.我们来看下关于快速排序中的一部分关键代码: 快速排序代码: int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 void quickso ...
- 求一个数组中最小的K个数
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...
- lintcode:寻找旋转排序数组中的最小值 II
寻找旋转排序数组中的最小值 II 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 数组中可能存在重复的元 ...
随机推荐
- 使用python爬取P站图片
刚开学时有一段时间周末没事,于是经常在P站的特辑里收图,但是P站加载图片的速度比较感人,觉得自己身为计算机专业,怎么可以做一张张图慢慢下这么low的事,而且这样效率的确也太低了,于是就想写个程序来帮我 ...
- Centos6.4 openNebula
OpenNebula 是一套开源的云计算基础管理工具,用来方便管理员在数据中心统一部署.创建.分配和管理大量的虚拟机,企业数据中心可以利用这套工具搭建自己的私有云,为 自己内部提供 IaaS 服务,类 ...
- 3 weekend110的shuffle机制 + mr程序的组件全貌
前面,讲到了hadoop的序列化机制,mr程序开发,自定义排序,自定义分组. 有多少个reduce的并发任务数可以控制,但有多少个map的并发任务数还没 缓存,分组,排序,转发,这些都是mr的shuf ...
- __attribute__机制介绍 (转)
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制. __attribute__可以设置函数属性(Function Attribute).变量 ...
- [学习笔记]设计模式之Singleton
写在前面 为方便读者,本文已添加至索引: 设计模式 魔法手札索引 在前几篇笔记中,我们有了解了部分对象创建型模式,包括Builder(建造者).Abstract Factory(抽象工厂)和Facto ...
- xutils Error:(37, 39) 错误: 无法访问HttpRequestBase 找不到org.apache.http.client.methods.HttpRequestBase的类文件
Android 6.0(api 23)SDK已经强制移除httpclient 解决方案: 1降低api 2build.gradle中添加一句话 android { useLibrary'org.apa ...
- DevExpress GridControl 后台设置列
/// <summary> /// 初始化GridView /// </summary> /// <param name="gv">GridVi ...
- WPF passwordbox 圆角制作
将以下节点复制到app.xaml的<Application.Resources>节点下 <Style TargetType="PasswordBox"> ...
- Android自动关机代码
http://www.open-open.com/lib/view/open1409209890713.html 要实现自动关机的功能需要手机有root权限,如果手机有root权限,运行该程序时,会提 ...
- Java基础知识强化之IO流笔记30:字节流4种方式复制mp4并测试效率
1. 需求:把e:\\哥有老婆.mp4 复制到当前项目目录下的copy.mp4中 字节流四种方式复制文件: • 基本字节流一次读写一个字节 • 基本字节流一次读写一个字节数组 • 高效字节流一次读写一 ...