php 异步上传图片几种方法总结

 更新时间:2016年11月25日 16:23  点击:1683
要实现异步上传图片方法有常用的有二种,一种是利用iframe实现,另一种是借助于ajax来实现一般用第三方插件了。

上传图片form提交target到一个隐藏的iframe里,

 代码如下 复制代码

form action="upload.php" id="form1" name="form1" enctype="multipart/form-data" method="post" target="uploadIframe">
<!--上传图片页面  -->
</form>
<iframe name="uploadIframe" id="uploadIframe" style="display:none"></iframe>

然后后台处理完上传图片逻辑后返回给前台,利用ajax修改当前页面DOM对象实现无刷新上传图片的友好功能。

实例

 代码如下 复制代码

a.html

 <form enctype="multipart/form-data" action="a.php" target="ifram_sign" method="POST">
        <input name="submit" id="submit" value="" type="hidden">
        <label>上传文件: <input name="test_file" type="file" id="test_file" size="48"></label>
        <input type="image" value="立即上传" id="submit_btn">
 </form>

<iframe name="ifram_sign" src="" frameborder="0" height="0" width="0" marginheight="0" marginwidth="0"></iframe>

PHP代码:

 代码如下 复制代码
<?php
if ($_FILES["test_file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["test_file"]["error"] . "<br />";
  }
else
  {
//这里的判断图片属性的方法就不写了。自己扩展一下。
  $filetype=strrchr($_FILES["test_file"]["name"],".");
  $filetype=substr($filetype,1,strlen($filetype));
  $filename="img/".time("YmdHis").".".$filetype;
  move_uploaded_file($_FILES["test_file"]["tmp_name"],$filename);
  echo '<script >alert(1)</script>';
  $return="parent.document.getElementByIdx_x('mpic".$pageset_id."').innerHTML='".$dataimgpath."'";
  echo "<script >alert('上传成功')</script>";
  echo "<script>{$return}</script>";
  }
?>

其实jquery ajax图片异步上传

HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US">

<head>
  <title>图片异步上传</title>
</head>

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<link type="text/css" rel="stylesheet" href="css/index.css">

<body>
 <div class="frm">
  <form name="uploadFrom" id="uploadFrom" action="upload.php" method="post"  target="tarframe" enctype="multipart/form-data">
   <input type="file" id="upload_file" name="upfile">
  </form>
  <iframe src=""  width="0" height="0" style="display:none;" name="tarframe"></iframe>
 </div>
 <div id="msg">
 </div>
</body>
</html>


 

index.js

$(function(){
 $("#upload_file").change(function(){
   $("#uploadFrom").submit();
 });
});


function stopSend(str){
 var im="<img src='upload/images/"+str+"'>";
 $("#msg").append(im);

}

 

upload.php

<?php
 $file=$_FILES['upfile'];
 $name=rand(0,500000).dechex(rand(0,10000)).".jpg";
 move_uploaded_file($file['tmp_name'],"upload/images/".$name);

//调用iframe父窗口的js 函数

 echo "<script>parent.stopSend('$name')</script>";
?>

Zend_Auth和Zend_Acl进行登录认证及根据用户角色进行权限控制 有需要的朋友可参考一下。

Zend_Auth_Adapter_Interface中提供了一个接口,我们需要自己去实现

代码如下:

 代码如下 复制代码

<?php
require_once 'Zend/Auth/Adapter/Interface.php';
class Auth implements Zend_Auth_Adapter_Interface{
    private $_useraccount;
    private $_password;
    private $_db;
    /**
     * 构造函数 设置用户名和密码 数据连接对象  
     *
     * @return void     
     */
    public function __construct($useraccount,$password,$db){  
        $this->_useraccount = $useraccount;
        $this->_password      = $password;
        $this->_db             = $db;
    }
   
    /**    
     * 进行认证 
     * @throws Zend_Auth_Adapter_Exception   
     * @return Zend_Auth_Result
     *
     */
    public function authenticate()
    {
        //默认情况下是认证失败
        $authResult = array(
            'code'     => Zend_Auth_Result::FAILURE,//详参:Zend_Auth_Result
            'identity' => '',
            'info' => array()
           );
          
           //获得登录用户信息
        $result = $this->_getAccountData();
               
        if(isset($result)&&!empty($result)) {//认证成功,则将用户信息存储到session中
            $authResult = array(
                'code'     => Zend_Auth_Result::SUCCESS,
                'identity' => $result['name'],
                'info'     => array('status'=>$result['status'])
            );
            //角色存储  个人缓存空间
            $namespace = Zend_Auth::getInstance()//单例模式
                                 -> getStorage()
                                 -> getNamespace();
            $_SESSION[$namespace]['role']     = $result['group_id'];//所属用户组
            $_SESSION[$namespace]['userInfo'] = $result;
            $_SESSION[$namespace]['userInfo']['lastLoginTime'] = $result['login_time'];
            $_SESSION[$namespace]['userInfo']['lastLoginIp']   = $result['login_ip'];          
//            $_SESSION[$namespace]['userInfo']['password']   = $result['password'];//密码是很重要的,不要写到session中
        }
       
        return new Zend_Auth_Result($authResult['code'], $authResult['identity'], $authResult['info']);
    }
    /**
     * 用户密码加密
     * @param $pwd  原始密码
     * @return string  加密后的密码字符串
     *
     */
    static public function encryptionType($pwd=null) {
        $pwd = md5($pwd);
        return $pwd;
    }
    /**
     * 获得用户数据结构
     *
     * @todo 整理密码的公共类
     */
    private function _getAccountData(){
        $resArr = array();
        $sysUserObj = Base_Dao_Factory::getObject('Admin_Models_User');
        //先登录普通会员帐号
        $data = array(
            'login_name' => $this->_useraccount,
            'login_pwd'  => $this->encryptionType($this->_password)
        );
        $result = $sysUserObj->login($data);
        //判断是否有数据,是则赋值
        if ($result) {
            if (!empty($result[0])) {
                $resArr = $result[0];
            }
        }
        return $resArr;
    }
}

 

解释:在authenticate方法的实现代码中,return一个Zend_Auth_Result对象实例,而查看Zend_Auth_Result的源代码,知道实例化的时候需要传入三个参数:

 @param int $code            身份认证的结果(如:Zend_Auth_Result::SUCCESS)

 @param mixed $identity   用于身份认证的标示符(如:登录名(张三))

 @param array $messages 认证失败的原因数组

而一旦认证成功,则将信息存储到session变量中。

  linux中解析.htpasswd文件的PHP类有需要的朋友可参考一下。

介绍一个
使用方法

$

 代码如下 复制代码
passwdHandler = new Htpasswd('/home/myuser/.htpasswd');
// Add a user with name 'user1' and password 'I prefer to use passphrase rather than password.' if it doesn't exist in .htpasswd.
$passwdHandler -> addUser('user1', 'I prefer to use passphrase rather than password.');
// Delete the user 'user1' if it exists in .htpasswd.
$passwdHandler -> deleteUser('user1');
// Check if user 'user1' exists in .htpasswd.
if ($passwdHandler -> doesUserExist('user1')) {
// User 'user1' exists.
}

htpasswd类

 代码如下 复制代码

class Htpasswd {
private $file = '';
private $salt = 'AynlJ2H.74VEfI^BZElc-Vb6G0ezE9a55-Wj';
private function write($pairs = array()) {
$str = '';
foreach ($pairs as $username => $password) {
$str .= "$username:{SHA}$passwordn";
}
file_put_contents($this -> file, $str);
}
private function read() {
$pairs = array();
$fh = fopen($this -> file, 'r');
while (!feof($fh)) {
$pair_str = str_replace("n", '', fgets($fh));
$pair_array = explode(':{SHA}', $pair_str);
if (count($pair_array) == 2) {
$pairs[$pair_array[0]] = $pair_array[1];
}
}
return $pairs;
}
private function getHash($clear_password = '') {
if (!empty($clear_password)) {
return base64_encode(sha1($clear_password, true));
} else {
return false;
}
}
public function __construct($file) {
if (file_exists($file)) {
$this -> file = $file;
} else {
die($file." doesn't exist.");
return false;
}
}
public function addUser($username = '', $clear_password = '') {
if (!empty($username) && !empty($clear_password)) {
$all = $this -> read();
if (!array_key_exists($username, $all)) {
$all[$username] = $this -> getHash($clear_password);
$this -> write($all);
}
} else {
return false;
}
}
public function deleteUser($username = '') {
$all = $this -> read();
if (array_key_exists($username, $all)) {
unset($all[$username]);
$this -> write($all);
} else {
return false;
}
}
public function doesUserExist($username = '') {
$all = $this -> read();
if (array_key_exists($username, $all)) {
return true;
} else {
return false;
}
}
public function getClearPassword($username) {
return strtolower(substr(sha1($username.$this -> salt), 4, 12));
}
}

先要获取ip地址相当简单,下面先介绍两种获取IP地址的代码,后面需要利用QQIP库来查找当前IP是属于那个IP段然后得出城市字段并返回。

获取IP地址

 代码如下 复制代码

<?php
function GetIP() {
    if ($_SERVER["HTTP_X_FORWARDED_FOR"])
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if ($_SERVER["HTTP_CLIENT_IP"])
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if ($_SERVER["REMOTE_ADDR"])
        $ip = $_SERVER["REMOTE_ADDR"];
    else if (getenv("HTTP_X_FORWARDED_FOR"))
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if (getenv("HTTP_CLIENT_IP"))
        $ip = getenv("HTTP_CLIENT_IP");
    else if (getenv("REMOTE_ADDR"))
        $ip = getenv("REMOTE_ADDR");
    else
        $ip = "Unknown";
    return $ip;
}
echo GetIP();
?>

方法二

 

 代码如下 复制代码
function getip ()
{
                if (getenv('http_client_ip')) {
                        $ip = getenv('http_client_ip');
                } else if (getenv('http_x_forwarded_for')) {
                        $ip = getenv('http_x_forwarded_for');
                } else if (getenv('remote_addr')) {
                        $ip = getenv('remote_addr');
                } else {
                        $ip = $_server['remote_addr'];
                }
                return $ip;

更多详细内容请查看:http://www.111cn.net/phper/php/33938.htm

PHP通过IP地址判断用户所在城市
上文已经获得了用户IP地址,接下来,我们就是根据这个IP地址获得用户所在城市了。开始之前,我们需要下载一个现成的数据库QQ IP数据库。

最新IP地址数据库:http://8.zjdx2.crsky.com/201209/qqwry0830.rar

使用方法:解压后QQWry.Dat就是我们想要IP地址数据库,我们新建一个ipcity文件夹,将数据库放在下面。QQ IP数据库使用非常方便,数据也很齐全,你可以及时关注官方更新以保持数据最新,强力推荐一下:)
接下来,我们在上面的ipcity目录下新建一个ipaddress.php文件,直接复制以下代码进去即可,重要的地方也作了相应注释。B段:

 代码如下 复制代码

<?
/*
函数名称:ipCity
参数说明:$userip——用户IP地址
函数功能:PHP通过IP地址判断用户所在城市
author:lee
contact:xpsem2010@gmail.com
*/
function ipCity($userip) {
    //IP数据库路径,这里用的是QQ IP数据库 20110405 纯真版
    $dat_path = 'QQWry.dat';

    //判断IP地址是否有效
    if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $userip)){
        return 'IP Address Invalid';
    }

    //打开IP数据库
    if(!$fd = @fopen($dat_path, 'rb')){
        return 'IP data file not exists or access denied';
    }

    //explode函数分解IP地址,运算得出整数形结果
    $userip = explode('.', $userip);
    $useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];

    //获取IP地址索引开始和结束位置
    $DataBegin = fread($fd, 4);
    $DataEnd = fread($fd, 4);
    $useripbegin = implode('', unpack('L', $DataBegin));
    if($useripbegin < 0) $useripbegin += pow(2, 32);
    $useripend = implode('', unpack('L', $DataEnd));
    if($useripend < 0) $useripend += pow(2, 32);
    $useripAllNum = ($useripend - $useripbegin) / 7 + 1;

    $BeginNum = 0;
    $EndNum = $useripAllNum;

    //使用二分查找法从索引记录中搜索匹配的IP地址记录
    while($userip1num>$useripNum || $userip2num<$useripNum) {
        $Middle= intval(($EndNum + $BeginNum) / 2);

        //偏移指针到索引位置读取4个字节
        fseek($fd, $useripbegin + 7 * $Middle);
        $useripData1 = fread($fd, 4);
        if(strlen($useripData1) < 4) {
            fclose($fd);
            return 'File Error';
        }
        //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
        $userip1num = implode('', unpack('L', $useripData1));
        if($userip1num < 0) $userip1num += pow(2, 32);

        //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
        if($userip1num > $useripNum) {
            $EndNum = $Middle;
            continue;
        }

        //取完上一个索引后取下一个索引
        $DataSeek = fread($fd, 3);
        if(strlen($DataSeek) < 3) {
            fclose($fd);
            return 'File Error';
        }
        $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
        fseek($fd, $DataSeek);
        $useripData2 = fread($fd, 4);
        if(strlen($useripData2) < 4) {
            fclose($fd);
            return 'File Error';
        }
        $userip2num = implode('', unpack('L', $useripData2));
        if($userip2num < 0) $userip2num += pow(2, 32);

        //找不到IP地址对应城市
        if($userip2num < $useripNum) {
            if($Middle == $BeginNum) {
                fclose($fd);
                return 'No Data';
            }
            $BeginNum = $Middle;
        }
    }

    $useripFlag = fread($fd, 1);
    if($useripFlag == chr(1)) {
        $useripSeek = fread($fd, 3);
        if(strlen($useripSeek) < 3) {
            fclose($fd);
            return 'System Error';
        }
        $useripSeek = implode('', unpack('L', $useripSeek.chr(0)));
        fseek($fd, $useripSeek);
        $useripFlag = fread($fd, 1);
    }

    if($useripFlag == chr(2)) {
        $AddrSeek = fread($fd, 3);
        if(strlen($AddrSeek) < 3) {
            fclose($fd);
            return 'System Error';
        }
        $useripFlag = fread($fd, 1);
        if($useripFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if(strlen($AddrSeek2) < 3) {
                fclose($fd);
                return 'System Error';
            }
            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }

        while(($char = fread($fd, 1)) != chr(0))
            $useripAddr2 .= $char;

        $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
        fseek($fd, $AddrSeek);

        while(($char = fread($fd, 1)) != chr(0))
            $useripAddr1 .= $char;
    } else {
        fseek($fd, -1, SEEK_CUR);
        while(($char = fread($fd, 1)) != chr(0))
            $useripAddr1 .= $char;

        $useripFlag = fread($fd, 1);
        if($useripFlag == chr(2)) {
            $AddrSeek2 = fread($fd, 3);
            if(strlen($AddrSeek2) < 3) {
                fclose($fd);
                return 'System Error';
            }
            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
            fseek($fd, $AddrSeek2);
        } else {
            fseek($fd, -1, SEEK_CUR);
        }
        while(($char = fread($fd, 1)) != chr(0)){
            $useripAddr2 .= $char;
        }
    }
    fclose($fd);

    //返回IP地址对应的城市结果
    if(preg_match('/http/i', $useripAddr2)) {
        $useripAddr2 = '';
    }
    $useripaddr = "$useripAddr1 $useripAddr2";
    $useripaddr = preg_replace('/CZ88.Net/is', '', $useripaddr);
    $useripaddr = preg_replace('/^s*/is', '', $useripaddr);
    $useripaddr = preg_replace('/s*$/is', '', $useripaddr);
    if(preg_match('/http/i', $useripaddr) || $useripaddr == '') {
        $useripaddr = 'No Data';
    }

    return $useripaddr;
}
?>

PHP根据IP地址实现城市切换或跳转
到这里,其实问题已经很简单了,用简单的js就通通搞定。C段如下:
//根据IP地址跳转指定页面js取得城市

 代码如下 复制代码

var city='<?echo ipCity($xp_UserIp);?>';

//根据IP地址所有城市跳转到指定页面

 代码如下 复制代码

if(city.indexOf("上海市")>=0){
        window.location.href="http://shanghai.demo.com/";
}

将开头的A段代码和上面的C段代码分别放在B段代码的头和尾,然后我们在需要跳转的页面加入以下代码:

 代码如下 复制代码

<script src="/ipcity/ipaddress.php" type="text/javascript" language="javascript"></script>

刷新页面,是不是达到预想的效果了呢?

上面的代码只是简单的判断了ip那里就跳到那,如果出现如,我想把湖南所有IP都跳到长沙去,那像衡阳,刘阳,耒阳 这些就要作多次父线处理了,要想知道请看下集。

表格展示无限级分类(PHP版)有需要的参考一下。

表格展示无限级分类(PHP版)
  TreeTable是一个能把无限分类展现为表格形式的PHP类库插件,分类的层级表示为表格的列,分类的行数表格分类的总数。单元格显示分类名称。

TreeTable通过对单元格的行合并和列合并实现了无限层级也能较好的展示层级架构。

 

1.构建ID/PID/NAME的数组,后期可通过数据库生成的动态数据。Tree算法请点击

 代码如下 复制代码
?array(
    *      1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
    *      2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
    *      3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
    *      4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
    *      5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
    *      6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
    *      7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
    *      )
 

2. 导入TreeTable类库。

 代码如下 复制代码

import('@.ORG.Util.TableTree'); //Thinkphp导入方法3. 生成TreeTable HTML代码

$treeTable->init($treearr);
echo $treeTable->get_treetable();

注意:get_treetable()只生产表体部门,<TALBE></TABLE>请自行构建。

 

完整代码

 代码如下 复制代码


<?php
/**
 * File name: TreeTable.class.php
 * Author: run.gao 312854458@qq.com  Date: 2012-07-24 23:22 GMT+8
 * Description: 通用的表格无限级分类
 * */

/**
 * 表格展示无限分类是将无线分类已表格的形式表现出来,更好的能体现出分类的所属关系
 * 使用方法:
 * 1. 实例化分类
 * $treeTable = new TreeTable();
 * 2. 初始化分类,$treearr必须是一个多维数组且包含 id,parentid,name字段
 * $treeTable->init($treearr);
 * 3. 获取无限分类HTML代码
 * echo $treeTable->get_treetable();
 * */

class TreeTable {
    /**
    * 生成树型结构所需要的2维数组
    * @var array
    */
    public $arr = array();

    /**
     * 表格列数
     * @var int
     */
    public $columns = 0;

    /**
     * 表格行数
     * @var int
     */
    public $rows  = 0;
   
    /**
    * 初始化TreeTable数据
    * @param array 2维数组
    * array(
    *      1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
    *      2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
    *      3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
    *      4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
    *      5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
    *      6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
    *      7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
    *      )
    */
    public function init($arr=array()){
        if(!is_array($arr)) return false;
       
        foreach ($arr as $k=>$v) {
            $this->arr[$v['id']] = $v;
        }
       
        foreach ($this->arr as $k => $v){
            $this->arr[$k]['column']           = $this->get_level($v['id']); // Y轴位置
            $this->arr[$k]['arrchildid']       = $this->get_arrchildid($v['id']); // 所有子节点
            $this->arr[$k]['arrparentid']      = $this->get_arrparentid($v['id']); // 所有父节点
            $this->arr[$k]['child_bottom_num'] = $this->get_child_count($v['id']); // 所有底层元素节点
        }
       
          $this->columns = $this->get_columns(); // 总行数
        $this->rows    = $this->get_rows(); // 总列数
       
           // 按照arrparentid和id号进行排序
        $this->sort_arr();
       
        foreach ($this->arr as $k => $v){
            $this->arr[$k]['row']     = $this->get_row_location($v['id']);    // X轴位置
            $this->arr[$k]['rowspan'] = $v['child_bottom_num']; // 行合并数   
            $this->arr[$k]['colspan'] = $v['child_bottom_num'] == 0 ? $this->columns - $v['column'] + 1 : 0; //列合并数
        }
       
        return $this->get_tree_arr();
    }
   
    /**
     * 获取数组
     * */
    public function get_tree_arr(){
        return is_array($this->arr) ? $this->arr : false;
    }
   
    /**
     * 按arrparentid/id号依次重新排序数组
     * */
    public function sort_arr(){
       
        // 要进行排序的字段
        foreach ($this->arr as $k => $v){
            $order_pid_arr[$k] = $v['arrparentid'];
            $order_iscost[] = $v['sort'];
            $order_id_arr[$k] = $v['id'];   
        }
       
        // 先根据arrparentid排序,再根据排序,id号排序
        array_multisort(
        $order_pid_arr, SORT_ASC, SORT_STRING,
        $order_iscost, SORT_DESC, SORT_NUMERIC,
        $order_id_arr, SORT_ASC, SORT_NUMERIC,
        $this->arr);
       
        // 获取每一个节点层次
           for ($column = 1; $column <= $this->columns; $column++) {
               $row_level = 0;
               foreach ($this->arr as $key => $node){
                   if ($node['column'] == $column){
                       $row_level++;
                       $this->arr[$key]['column_level']  = $row_level;
                   }
               }
           }
          
           // 重新计算以ID作为键名
        foreach ($this->arr as $k=>$v) {
            $arr[$v['id']] = $v;
        }
       
        $this->arr = $arr;
    }
   
    /**
    * 得到父级数组
    * @param int
    * @return array
    */
    public function get_parent($myid){
        $newarr = array();
        if(!isset($this->arr[$myid])) return false;
        $pid = $this->arr[$myid]['parentid'];
        $pid = $this->arr[$pid]['parentid'];
        if(is_array($this->arr)){
            foreach($this->arr as $id => $a){
                if($a['parentid'] == $pid) $newarr[$id] = $a;
            }
        }
        return $newarr;
    }

    /**
    * 得到子级数组
    * @param int
    * @return array
    */
    public function get_child($myid){
        $a = $newarr = array();
        if(is_array($this->arr)){
            foreach($this->arr as $id => $a){
                if($a['parentid'] == $myid) $newarr[$id] = $a;
            }
        }
        return $newarr ? $newarr : false;
    }
       
    /**
     * 获取当前节点所在的层级
     * @param $myid 当前节点ID号
     * */
    public function get_level($myid, $init = true){
        static $level = 1;
        if($init) $level = 1;
        if ($this->arr[$myid]['parentid']) {
            $level++;
            $this->get_level($this->arr[$myid]['parentid'], false);
        }
        return $level;
    }
   
    /**
     * 获取当前节点所有底层节点(没有子节点的节点)的数量
     * @param $myid 节点ID号
     * @param $init 第一次加载将情况static变量
     * */
    public function get_child_count($myid, $init = true){
        static $count = 0;
        if($init) $count = 0;
        if(!$this->get_child($myid) && $init) return 0;
        if($childarr = $this->get_child($myid)){
            foreach ($childarr as $v){
                $this->get_child_count($v['id'], false);
            }
        }else{
            $count++;
        }
        return $count;
    }
   
    /**
     * 获取节点所有子节点ID号
     * @param $catid 节点ID号
     * @param $init 第一次加载将情况static初始化
     * */
    public function get_arrchildid($myid, $init = true) {
        static $childid;
        if($init) $childid = '';
        if(!is_array($this->arr)) return false;
        foreach($this->arr as $id => $a){
            if($a['parentid'] == $myid) {
                $childid = $childid ? $childid.','.$a['id'] : $a['id'];
                $this->get_arrchildid($a['id'], false);
            }
        }
        return $childid ;
    }
   
    /**
     * 获取该节点所有父节点ID号
     * @param $id 节点ID号
     * */
    public function get_arrparentid($id, $arrparentid = '') {
        if(!is_array($this->arr)) return false;
        $parentid = $this->arr[$id]['parentid'];
        if($parentid > 0) $arrparentid = $arrparentid ? $parentid.','.$arrparentid : $parentid;
        if($parentid) $arrparentid = $this->get_arrparentid($parentid, $arrparentid);
        return $arrparentid;
    }
   
    /**
     * 获取节点所在地行定位
     * @param $myid 节点ID号
     */
    public function get_row_location($myid){
           $nodearr = $this->arr;
           // 获取每一个节点所在行的位置
          foreach ($nodearr as $key => $node){
              if($myid == $node['id']) {
                  $node_row_count = 0;
                $arrparentid = explode(',', $node['arrparentid']);
                // 所有父节点小于当前节点层次的底层节点等于0的元素
                foreach ($arrparentid as $pid){
                    foreach ($nodearr as $node_row){
                        if($node_row['column'] == $nodearr[$pid]['column'] && $nodearr[$pid]['column_level'] > $node_row['column_level'] && $node_row['child_bottom_num'] == 0){
                            $node_row_count ++;
                        }
                    }   
                }
                // 所有当前节点并且节点层次(rowid_level)小于当前节点层次的个数
                foreach ($nodearr as $node_row){
                    if($node['column'] == $node_row['column'] && $node_row['column_level'] <  $node['column_level']){
                        $node_row_count += $node_row['child_bottom_num'] ? $node_row['child_bottom_num'] : 1;
                    }
                }
                $node_row_count++;
                break;
            }
        }
        return $node_row_count;   
    }
   
    /**
     * 获取表格的行数
     * */
    public function get_rows(){
        $row = 0;
        foreach ($this->arr as $key => $node){
            if($node['child_bottom_num'] == 0){
                $rows++; // 总行数
            }
        }
        return $rows;
    }
   
    /**
     * 获取表格的列数
     * */
    public function get_columns(){
        $columns = 0 ;
        foreach ($this->arr as $key => $node){
            if($node['column'] > $columns){
                $columns = $node['column']; // 总列数
            }
        }
        return $columns;
    }
   
    /**
     * 获取分类的表格展现形式(不包含表头)
     * */
    public function get_treetable(){
        $table_string = '';
        for($row = 1; $row <= $this->rows; $row++){
            $table_string .= "rt<tr>";
            foreach ($this->arr as $v){
                if($v['row'] == $row){
                    $rowspan = $v['rowspan'] ? "rowspan='{$v['rowspan']}'" : '';
                    $colspan = $v['colspan'] ? "colspan='{$v['colspan']}'" : '';
                    $table_string .= "rtt<td {$rowspan} {$colspan}>
                    {$v['name']}
                    </td>";
                }
            }
            $table_string .= "rt</tr>";
        }
        return $table_string;
    }
}
?>

[!--infotagslink--]

相关文章

  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Photoshop古装美女图片转为工笔画效果制作教程

    今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • 利用JS实现点击按钮后图片自动切换的简单方法

    下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
  • jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮

    jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13
  • js实现上传图片及时预览

    这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
  • Photoshop枪战电影海报图片制作教程

    Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14
  • python opencv通过4坐标剪裁图片

    图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
  • 使用PHP下载CSS文件中的图片的代码

    共享一段使用PHP下载CSS文件中的图片的代码 复制代码 代码如下: <?php //note 设置PHP超时时间 set_time_limit(0); //note 取得样式文件内容 $styleFileContent = file_get_contents('images/style.css'); //not...2013-10-04
  • 微信小程序如何获取图片宽度与高度

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

    PHP代码如下:复制代码 代码如下:if (isset($_FILES["Filedata"]) || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) || $_FILES["Filedata"]["error"] != 0) { $upload_file = $_FILES['Filedata']; $fil...2013-10-04
  • C#中图片旋转和翻转(RotateFlipType)用法分析

    这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25
  • ps怎么制作图片阴影效果

    ps软件是现在很多人比较喜欢的,有着非常不错的使用效果,这次文章就给大家介绍下ps怎么制作图片阴影效果,还不知道制作方法的赶紧来看看。 ps图片阴影效果怎么做方法/...2017-07-06
  • OpenCV如何去除图片中的阴影的实现

    这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
  • JavaScript 如何禁止用户保存图片

    这篇文章主要介绍了JavaScript 如何禁止用户保存图片,帮助大家完成需求,更好的理解和使用JavaScript,感兴趣的朋友可以了解下...2020-11-19
  • C#将图片和字节流互相转换并显示到页面上

    本文主要介绍用C#实现图片转换成字节流,字节流转换成图片,并根据图片路径返回图片的字节流,有需要的朋友可以参考下...2020-06-25
  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • JS实现图片的不间断连续滚动的简单实例

    下面小编就为大家带来一篇JS实现图片的不间断连续滚动的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-06-12