<?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. Get familiar with key Frameworks of ios

    Frameworks make your life easier as an iOS Developer. They allow you to reuse code written by other ...

  2. Using OpenCV with gcc and CMake

    Using OpenCV with gcc and CMake Note We assume that you have successfully installed OpenCV in your w ...

  3. Gradle DSL method found: ‘android()’错误

    Gradle DSL method found: ‘android()’错误 和上个错误一样这个也是因为在新版本的Gradle中android()方法已经废弃,但是要注意android()只是在整个项 ...

  4. Linux中的文件压缩,打包和备份命令

    压缩解压命令 gzip  文件   -c : 将压缩数据输出到屏幕,可用来重定向 -v   显示压缩比等信息 -d   解压参数 -t    用来检验一个压缩文件的一致性看看档案有没错 -数字 : 压 ...

  5. 如何在google test中指定只运行一部分测试

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在google test中指定只运行一部分测试.

  6. CodeIgniter开发实际案例-新闻网站【转】

    CodeIgniter开发实际案例-新闻网站 转:http://blog.csdn.net/ict2014/article/details/22104711?utm_source=tuicool&am ...

  7. spring 最全MAVEN 依赖引入配置

    <properties> <spring.version>4.1.6.RELEASE</spring.version> </properties> &l ...

  8. centos防火墙操作

    centos防火墙基本操作 #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT#/sbin/iptables -I INPUT -p tcp -- ...

  9. C#目录文件复制、创建操作

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  10. PAT---1001. A+B Format (20)

    #include<stdio.h> int main(){ //定义要读入的两个整数 int a,b; //定义好放拆项用的数组 ]; //读入两个整数 scanf("%d%d& ...