php中无限级分类程序代码

 更新时间:2016年11月25日 17:30  点击:1652
文章是作者原创的一篇关于在php中实现的无限级分类,有需要了解的朋友可以看看。

无限分类就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去

 

 代码如下 复制代码

--
-- 数据库: `tree`
--
CREATE DATABASE `tree` DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;
USE `tree`;


 

--
-- 表的结构 `class`
--

 

CREATE TABLE `class` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(10) NOT NULL,
  `pid` int(11) NOT NULL,
  `depth` varchar(100) default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=gb2312 AUTO_INCREMENT=30 ;
 


<?php
$link =mysql_connect('localhost','root','root');
mysql_select_db('tree');
mysql_query ( 'set names GBK' );
if($_GET['act']=='add'){
   $name=$_POST['name'];
   if($name=='') exit('name not null');
      $pid=$_POST['pid'];
          if($pid !=0){
             $sql="select * from class where id=".$pid;
             $result =mysql_query($sql);
             $row = mysql_fetch_array($result);
             $depth=$row['depth'].','.mysql_insert_id();//$getID即为最后一条记录的ID
          }else{
             $depth=0;
       }
    $sql="INSERT INTO class(name,pid,depth) VALUES('".$name."','".$pid."','".$depth."')";
    $result =mysql_query($sql);
       if(!$result){
          exit("shibai $sql");
       }else{
          exit("chenggong");
    }
}
?>
<form id="form1" name="form1" method="post" action="?act=add">
  <table width="327" border="1" cellpadding="0" cellspacing="0">
    <tr>
      <td width="97" height="27">名称</td>
      <td width="224"><label for="name"></label>
      <input type="text" name="name" id="name" /></td>
    </tr>
    <tr>
      <td height="30">栏目</td>
      <td><select name="pid" id="pid">
            <option value="0">-----顶级分类-----</option>
            <?php
             sort_s(0);
   ?>
      </select></td>
    </tr>
    <tr>
      <td height="35">&nbsp;</td>
      <td><input type="submit" name="button" id="button" value="提交" /></td>
    </tr>
  </table>
</form>
<br />
<br />
<br />
<br />

<?php
//$sql = "select * from `class` order by sort asc, id Desc";
//$sql="select * from class where pid=0";
//$result =mysql_query($sql);
 //while($row = mysql_fetch_array($result)){
  //$class_arr[] = array($row['id'],$row['name'],$row['classid'],$row['sort']);
    // echo $row['name'].$row['id'].'---'.$row['pid'].'<br>';
        sorttree(0);
 
  
 //}
 
function sorttree($id){
 //if()
 $sql="select * from class where pid=".$id;
    $result =mysql_query($sql);
 //$a=mysql_fetch_array($result);
 //$row = mysql_fetch_array($result);
 while($row = mysql_fetch_array($result)){
    $rid=explode(",",$row['depth']);
    $i=count($rid);
    $n = str_pad('',$i,'-',STR_PAD_RIGHT);
    $n = str_replace("-","&nbsp;&nbsp;&nbsp;&nbsp;",$n);
 //print_r($row).'<br>';
    if($row['pid']==0){
       echo $n.'|-----'.$row['name'].'-----|<br>';
    }else{
       echo $n.'&nbsp;&nbsp;&nbsp;&nbsp;<font color="#FF0000">|-</font>'.$row['name'].'<br>';
       }
    sorttree($row['id']);
 }
}

function sort_s($id){
 //if()
 $sql="select * from class where pid=".$id;
    $result =mysql_query($sql);
 //$a=mysql_fetch_array($result);
 //$row = mysql_fetch_array($result);
 while($row = mysql_fetch_array($result)){
    $rid=explode(",",$row['depth']);
    $i=count($rid);
    $n = str_pad('',$i,'-',STR_PAD_RIGHT);
    $n = str_replace("-","&nbsp;&nbsp;&nbsp;&nbsp;",$n);
 //print_r($row).'<br>';
    if($row['pid']==0){
        echo "<option value="".$row['id']."" style='background:#ccc' >".$n.'|------'.$row['name']."-----|</option>rn";
    }else{
        echo "<option value="".$row['id']."">".$n.'&nbsp;&nbsp;&nbsp;&nbsp;|- '.$row['name']."</option>rn";
    }
    sort_s($row['id']);
 }
}
?>

总结原理

如何把它的各个分类一一列出来呢?
首先我们假设有这样的一个三级分类,新闻→PHP新闻→PHP6.0出来了。
如果我们要查找“PHP6.0出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻

就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要

知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设

计一个父类id的字段就可以实现无限分类的功能了

本文章介绍了php四种调用外部文件函数用法和区别,有需要了解的朋友可以参考一下。

引用文件的方法有两种:require 及 include。两种方式提供不同的使用弹性。

require 的使用方法如 require("MyRequireFile.php"); 。这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

include 使用方法如 include("MyIncludeFile.php"); 。这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。


_once 后缀表示已加载的不加载

1.报错

include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码
require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码

注:在 PHP 4.3.5 之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。

2.条件引用


include()与require()的功能相同,用法上却有一些不同,include()是有条件包含函数,而require()则是无条件包含函数,
例如下面例子,如果变量$somg为真,则将包含文件somefile.php:

 

 代码如下 复制代码
if($some){ include 'somefile.php'; }

但无论$some取何值,下面的代码将把文件somefile.php包含进文件里:

 代码如下 复制代码
if($something){   require 'somefile.php'; }

下面的例子充分说明了这两个函数之间的不同

 代码如下 复制代码
$i = 1;
while ($i < 3) {   require "somefile.$i.php";   $i++; }

可以从以上这段代码中看出,每一次循环的时候,程序都将把同一个文件包含进去,很显然这不我们想要的,可以看出这段代码希望在每次循环时,
将不同的文件包含进来,如果要完成这个功能,只能使用函数include()

 代码如下 复制代码
$i = 1;
while ($i < 3) {  
include "somefile.$i.php";   $i++;
}

3.require用相对路径的时候

当A引用B,而B又引用了其他文件C时,C的路径如果是相对路径,则是相对于A的路径,而不是相对于B的'

4.require_once() 语句在脚本执行期间包括并运行指定文件。此行为和 require() 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。

include_once() 语句在脚本执行期间包括并运行指定文件。此行为和 include() 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。如同此语句名字暗示的那样,只会包括一次。


5..文件引用方式

include有返回值,而require没有

 代码如下 复制代码
$login = include(’test.php’);
if(!empty($login))
{   echo “文件包含成功”;
 }
else
{   echo “文件包含失败”;
 }

include()执行时需要引用的文件每次都要进行读取和评估,
require()执行时需要引用的文件只处理一次(实际上执行时需要引用的文件内容替换了require()语句)
可以看出若有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高,
若每次执行代码时相读取不同的文件或者有通过一组文件叠代的循环,就使用include(),
可以给想要包括的文件名设置变量,当参数为 include()时使用这个变量

 代码如下 复制代码

<?
conn.php
$dbh=mysql_connect('localhost','root','123456');
mysql_select_db('DB','$dbh');
?>
在实际应用中,我们调用文件如:
require("conn.php")或者include("conn.php");
但是如果这样:
filename.php
require("conn.php");
function myfun($par1,$par2)
{包含对数据库处理的语句}
.....
myfun($par1,$par2);
.....
myfun($p1,$p2);
?>


 

总结


incluce在用到时加载
require在一开始就加载
_once后缀表示已加载的不加载
php系统在加载php程序时有一个伪编译过程,可使程序运行速度加快。但incluce的文档仍为解释执行
include的文件中出错了,主程序继续往下执行
require的文件出错了,主程序也停了
所以包含的文件出错对系统影响不大的话(如界面文件)就用include,否则用require
以下文档也适用于 require()。这两种结构除了在如何处理失败之外完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果你想在遇到丢失文件时停止处理页面就用 require()。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。
require()函数用给定文件的内容取代它本身,这一代替过程发生在PHP引擎编译代码期间,而不是在执行期间进行,它不象include()那样会首先进行计算。require()函数更多地用在静态元素中,而include()更多地用于动态元素中。与include_once()类似的是,require_once()将首先检查是否已经插入给定的代码,如果代码已经存在,就不再插入了。

文章分析介绍了多种利用正则提取图片中的地图方法,看了下面所有实例我都少不了preg_match_all这个函数,有需要的朋友可以参考一下。
 代码如下 复制代码

<?php
//取得页面所有的图片地址

function getimages($str)

{

    $match_str = "/((http://)+([^ rn()^$!`"'|[]{}<>]*)((.gif)|(.jpg)|(.bmp)|(.png)|(.GIF)|(.JPG)|(.PNG)|(.BMP)))/";

    preg_match_all ($match_str,$str,$out,PREG_PATTERN_ORDER);

    return $out;

}

?>

/<img.*srcs*=s*["|']?s*([^>"'s]*)/i
,我使用kindeditor保存文章,但是需要取出第N个图片的地址作为文章的标志图片,文章代码(内容的html)保存到数据库一个字段,然后图片地址保存到另外一个字段.我就是使用上面的正则解决的.

我说明下,上面的地址是直接获取img标签内src属性的值.在使用该正则的php页面访问该路径如果能找到图片的话,可以直接使用,如果不能,你可以使用preg_match_all将所有地址先保存到数组,然后处理路径,比如获取文件名称(不含路径部分),然后重新组成url,再删除图片.

我的例子:

 代码如下 复制代码
preg_match_all("/<img.*srcs*=s*["|']?s*([^>"'s]*)/i",str_ireplace("\","",$content),$arr);

呵呵 我的内容部分被php给加上转义了,所以我需要先把去除,str_ireplace("\","",$content),然后将匹配的内容保存到$arr数组(二维的).
$arr[1]就是存储该路径的数组.


实例

 代码如下 复制代码

<?php
$ext = 'gif|jpg|jpeg|bmp|png';//罗列图片后缀从而实现多扩展名匹配 by http://www.111cn.net  绿色软件
$str = '<p><img title="绿色软件" alt="绿色软件" onload="ResizeImage(this,860)" src="http://www.111cn.net /data/soft_img/2010091101619.jpg" /></p><p><img title="绿色软件" alt="绿色软件" onload="ResizeImage(this,860)" src="http://www.111cn.net /data/soft_img/2010091029938.jpg" /></p><p><img title="绿色软件" alt="绿色软件" onload="ResizeImage(this,860)" src="http://www.111cn.net /data/soft_img/2010092839019.jpg" /></p>';
preg_match_all("/(href|src)=(["|']?)([^ "'>]+.($ext))\2/i", $str, $matches);
var_dump($matches);
?>

结果

 代码如下 复制代码

array(5) {
  [0]=>
  array(3) {
    [0]=>
    string(57) "src="http://www.111cn.net /data/soft_img/2010091101619.jpg""
    [1]=>
    string(57) "src="http://www.111cn.net /data/soft_img/2010091029938.jpg""
    [2]=>
    string(57) "src="http://www.111cn.net /data/soft_img/2010092839019.jpg""
  }
  [1]=>
  array(3) {
    [0]=>
    string(3) "src"
    [1]=>
    string(3) "src"
    [2]=>
    string(3) "src"
  }
  [2]=>
  array(3) {
    [0]=>
    string(1) """
    [1]=>
    string(1) """
    [2]=>
    string(1) """
  }
  [3]=>
  array(3) {
    [0]=>
    string(51) "http://www.111cn.net /data/soft_img/2010091101619.jpg"
    [1]=>
    string(51) "http://www.111cn.net /data/soft_img/2010091029938.jpg"
    [2]=>
    string(51) "http://www.111cn.net /data/soft_img/2010092839019.jpg"
  }
  [4]=>
  array(3) {
    [0]=>
    string(3) "jpg"
    [1]=>
    string(3) "jpg"
    [2]=>
    string(3) "jpg"
  }
}

PHP正则匹配图片并给图片加链接详解

 

 代码如下 复制代码
$newstext=preg_replace(preg_replace('/(<img[^>]+srcs*=s*”?([^>"s]+)”?[^>]*>)/im', ‘<a href=”$2″>$1</a>', $newstext);

1.preg_replace和str_replace的区别:

str_replace只是纯字符替换,而preg_replace才是正则替换

2.$0,$1,$2等的说明:

$0指的是被整个模式所匹配的文本;

$1指的是首个 ( ) 引用的串;

$2指的是第二个()引用的串; 以此类推。

文章介绍一个简单的水印程序可以实现把中文字加在图片上面,有需要了解的朋友可以参考一下。
 代码如下 复制代码

 

<?php
// **************************************** //
// 功能:给图片添加文字
// 参数: $img 图片文件名
// $new_img 另存图片文件名,如果为空表示不另存图片
// $text 字符串内容
// text_size 字符串大小
// text_angle 字型串输出角度
// text_x 字符串输出 x 坐标
// text_y 字符串输出 y 坐标
// $text_font 字型文件名
// $r,$g,$b 字符串颜色RGB值
// **************************************** //
function img_text($img, $new_img, $text, $text_size, $text_angle, $text_x, $text_y, $text_font, $r, $g, $b){

$text=iconv("gb2312","UTF-8",$text);
Header("Content-type: image/gif");
$im = @imagecreatefromstring(file_get_contents($img)) or die ("打开图片失败!");
$color = ImageColorAllocate($im, $r,$g,$b);

//ImageTTFText(int im, int size, int angle, int x, int y, int col, string fontfile, string text):
//本函数将 TTF (TrueType Fonts) 字型文字写入图片。
//参数: size 为字形的尺寸;
// angle 为字型的角度,顺时针计算,0 度为水平(由左到右),90 度则为由下到上的文字;
// x,y 二参数为文字的坐标值 (原点为左上角);
// col 为字的颜色;
// fontfile 为字型文件名称;
// text 是字符串内容。
ImageTTFText($im, $text_size, $text_angle, $text_x, $text_y, $color, $text_font, $text);

if ($new_img==""):
ImageGif($im); // 不保存图片,只显示
else:
ImageGif($im,$new_img); // 保存图片,但不显示
endif;

ImageDestroy($im); //结束图形,释放内存空间
}  
?>

我们先来个个介绍一下关于php 批量下载图片文件和css中图片的方法,这个我们都会用到了file_put_contents()函数了,下面看第一个批量下载图片。
 代码如下 复制代码
set_time_limit(0);//设置PHP超时时间
$imagesURLArray = array_unique($imagesURLArray );
 
foreach($imagesURLArray as $imagesURL) {
    echo $imagesURL;
    echo "<br/>";
    file_put_contents(basename($imagesURL), file_get_contents($imagesURL));

}原理很简单,通过一个含有图片地址的数组循环,然后使用PHP的file_get_contents函数取得图片,在使用file_put_contents函数把图片保存下来。
P.S:一定要加上设置PHP超时时间哦~!

附上原文中通过php下载css中图片的代码:

 代码如下 复制代码

< ?php
/*
More & Original PHP Framwork
Copyright (c) 2007 - 2008 IsMole Inc.
Author: kimi
Documentation: 下载样式文件中的图片,水水专用扒皮工具
*/
 
//note 设置PHP超时时间
set_time_limit(0);
 
//note 取得样式文件内容
$styleFileContent = file_get_contents('images/style.css');
 
//note 匹配出需要下载的URL地址
preg_match_all("/url((.*))/", $styleFileContent, $imagesURLArray);
 
//note 循环需要下载的地址,逐个下载
$imagesURLArray = array_unique($imagesURLArray[1]);
    foreach($imagesURLArray as $imagesURL) {
    file_put_contents(basename($imagesURL), file_get_contents($imagesURL));
}

?>

延伸到


在扒皮过程中,必不可少的需要下载样式文件中的图片。碰到比较庞大的样式文件,其中可能会有上百个需要下载的图片,那么使用下面这段小代码是最为合适的了。

 代码如下 复制代码

  
    < ?php

 
    //note 设置PHP超时时间


 
    set_time_limit(0);
 
 
    //note 取得样式文件内容

    $styleFileContent = file_get_contents('images/style.css');


    //note 匹配出需要下载的URL地址

    preg_match_all("/url((.*))/", $styleFileContent, $imagesURLArray);


    //note 循环需要下载的地址,逐个下载


    $imagesURLArray = array_unique($imagesURLArray[1]);

    foreach($imagesURLArray as $imagesURL) {

    file_put_contents(basename($imagesURL), file_get_contents($imagesURL));

 
    }

 

最后预祝各位在扒皮的过程中,一扒到底


关于file_put_contents定义和用法
file_put_contents() 函数把一个字符串写入文件中。

与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

语法
file_put_contents(file,data,mode,context)

参数 描述
file 必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
data 可选。规定要写入文件的数据。可以是字符串、数组或数据流。
mode

可选。规定如何打开/写入文件。可能的值:

  • FILE_USE_INCLUDE_PATH
  • FILE_APPEND
  • LOCK_EX
context

可选。规定文件句柄的环境。

context 是一套可以修改流的行为的选项。若使用 null,则忽略。

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • PHP实现递归无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把...2015-10-23
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • ecshop商品无限级分类代码

    ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • 微信小程序手势操作之单触摸点与多触摸点

    这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 手把手教你uniapp和小程序分包(图文)

    本文主要介绍了手把手教你uniapp和小程序分包,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-02
  • 微信小程序实现canvas分享朋友圈海报

    这篇文章主要为大家详细介绍了微信小程序实现canvas分享朋友圈海报,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21