<?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递归数组中的应用的更多相关文章

  1. 从数组中取出N个元素的所有组合——递归实现

    https://www.cnblogs.com/null00/archive/2012/04/27/2473788.html 今天在做POJ 1753时,需要枚举一个数组中所有组合.之前也遇到过类似的 ...

  2. js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值

    这是学习过程中记录的一些关于数组操作的常用属性或方法,记录一下方便以后使用. // 数组去重 var arr1 = [1,1,2,3,4,5,6,3,2,4,5,'a','b','c','a',6,7 ...

  3. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

  4. 快速查找无序数组中的第K大数?

    1.题目分析: 查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN).在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高 ...

  5. 剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计算法找其中的一个数

    题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 2 4 9 12 4 7 10 13 6 8 11 ...

  6. PHP array_count_values() 函数用于统计数组中所有值出现的次数。

    定义和用法 array_count_values() 函数用于统计数组中所有值出现的次数. 本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数. 语法 array_count ...

  7. 求出数组前面k个元素或数组中元素大于一半的元素(快速排序与堆排序的灵活运用)

    写这个的目的在于,说明快速排序的灵活运用.我们来看下关于快速排序中的一部分关键代码: 快速排序代码: int a[101],n;//定义全局变量,这两个变量需要在子函数中使用 void quickso ...

  8. 求一个数组中最小的K个数

    方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...

  9. lintcode:寻找旋转排序数组中的最小值 II

    寻找旋转排序数组中的最小值 II 假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 数组中可能存在重复的元 ...

随机推荐

  1. 【OpenCV】基于kmeans的细胞检测方法

    问题是这样的,有一幅经过二值化处理之后的图像,我们希望统计其中细胞的个数,和不同粘连情况的细胞个数,比如,下图中有1个细胞组成连通区域的,也有2个细胞组成连通区域的,也有更多个细胞组成连通区域的,我们 ...

  2. JDBC——Sql Server

    sun公司设计一套java语言操作不同的数据库提供的是接口,二具体的实现类是由各大数据库厂商实现的. private static final String driver= "com.mic ...

  3. Javascript从入门到精通(一)

    第一篇   基础知识 一.JavaScript的主要特点:1.解释性:不同于一些编译性的程序语言(如C.C++等),它是一种解释性的程序语言,它的源代码不需要经过编译,而是直接在浏览器中运行时被解释. ...

  4. Java GC 概念摘要

    很长时间,我想Java的GC做一个小小的总结,他有没有时间.根据最近看了java paper向上java gc文章,我觉得好,读读.顺便说一下,总结下. java paper的GC文章地址,里面有非常 ...

  5. BZOJ 2754([SCOI2012]喵喵叫的星球-统计序列的后缀阵列中子序列出现次数)

    2754: [SCOI2012]喵喵叫的星球 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 805  Solved: 380 [id=2754&qu ...

  6. 保持Service不被Kill掉的方法--双Service守护 && Android实现双进程守护

    本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ↳Android.content.Context  ↳an ...

  7. Chapter 3 - How to Move a sprite

    http://www.eoeandroid.com/forum.php?mod=viewthread&tid=250529 http://www.cocos2d-x.org/boards/6/ ...

  8. Android(java)学习笔记176:BroadcastReceiver之 短信发送的广播接收者

    有时候,我们需要开发出来一个短信监听器,监听用户发送的短信记录,下面就是一个案例,这里同样需要使用广播机制. 下面同样是代码示例,MainActivity.java 和  activity_main. ...

  9. PHP一个最简单的CMS内容管理系统

    博客是一般程序员的入手戏,写得好写不好,有没有兴趣,逻辑性够不够都从这个里面入手 我现在摒弃前台.重点讲解下如何开发一个简单的CMS系统所需要的步骤: 1.清楚流程 1--------登录后台 2-- ...

  10. 译文:如何使用SocketAsyncEventArgs类(How to use the SocketAsyncEventArgs class)

      转载自: http://blog.csdn.net/hulihui/article/details/3244520 原文:How to use the SocketAsyncEventArgs c ...