当前位置:  编程技术>php
本页文章导读:
    ▪PHP数组:无限分级数据的层级化处理      各种树形菜单、物品归类、权限层级 等经常用到的数据结构体。下面两个 平摊--引用 法 来自http://topic.csdn.net/u/20110728/15/eadffb68-5eb6-40d8-9ec1-2bc439f45322.html/** * 创建父节点树形数组 * 参数 * $ar 数.........
    ▪【个人建站心得】wordpress页面真正静态化插件really static          有好几周没来写博客了,不过每天都还会来博客园看看。前一阵子看同事建了个站,自己也摸索着看了些关于建站的资料,买了域名、空间,突击了些wordpress知识,开始搭起了属于.........
    ▪从LazyPhp说起      最近一周一直在看PHP. 开始慢慢梳理基本语法.顺便看了一个比较入门Php轻框架-LazyPhp.在NetBeans上Coding 过程中深感Php作为弱语言在语法层次和perl有很多相似之处.当然现在也有很多动态网页脚本.........

[1]PHP数组:无限分级数据的层级化处理
    来源:    发布时间: 2013-10-15

各种树形菜单、物品归类、权限层级 等经常用到的数据结构体。

下面两个 平摊--引用 法 来自

http://topic.csdn.net/u/20110728/15/eadffb68-5eb6-40d8-9ec1-2bc439f45322.html

/**
* 创建父节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
**/
function find_parent($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ){
if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];

$t[$k]['reference'] = true;
}
}
return $t;
}


/**
* 创建子节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
**/
function find_child($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ) {
$t[$item[$pid]]['child'][$item[$id]] =& $t[$k];

$t[$k]['reference'] = true;
}
}
return $t;
}

 

 

示例:

$data = array(
array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')
);
$p = find_parent($data, 'ID', 'PARENT');
$c = find_child($data, 'ID', 'PARENT');

 

上面两种方法是将所有节点按id平摊到一个数组中,然后找到他们的 parent 或 children ,通过引用将 平摊的元素挂接到 parent 、children 下,

但被引用的元素依然存在于平摊的数组中,因此,在实际应用时,最好标记那些被引用的元素,以避免以他们为根开始遍历,导致重复。

foreach ($p as $key => $item) {
if($item['reference']) continue;
print_r($item);
}

foreach ($c as $key => $item) {
if($item['reference']) continue;
print_r($item);
}

 

 

递归法,PHP 数组元素被删除后,数组游标会归零,因此在遍历过程中一些已经找到 “归宿” 的元素也不得不留在数组中,无法缩减后继元素的搜索范围:

$mylist = array(array( 'parent_id'=>0,'id'=>1),
array( 'parent_id'=>0,'id'=>2),
array( 'parent_id'=>0,'id'=>3),
array( 'parent_id'=>2,'id'=>4),
array( 'parent_id'=>2,'id'=>5),
array( 'parent_id'=>3,'id'=>6),
array( 'parent_id'=>3,'id'=>7),
array( 'parent_id'=>4,'id'=>8),
array( 'parent_id'=>5,'id'=>9),
array( 'parent_id'=>5,'id'=>10)
);



function _findChildren($list, $p_id){ //数据层级化,
$r = array();
foreach($list as $id=>$item){
if(
    
[2]【个人建站心得】wordpress页面真正静态化插件really static
    来源:    发布时间: 2013-10-15

    有好几周没来写博客了,不过每天都还会来博客园看看。前一阵子看同事建了个站,自己也摸索着看了些关于建站的资料,买了域名、空间,突击了些wordpress知识,开始搭起了属于自己的博客小站(www.nhliwu.com)。

    然后预备seo知识,在做seo这一块,我需要把博客里面的文章做成纯静态的页面(懂点seo的都知道静态页面更容易被搜索引擎收录)。

    初期被推荐了两款插件:cos-html-catch,really static,通过个人试用筛选和站长论坛交流,判断出真正能把动态页面,生成本地化静态页面文件的插件只有really static。

     网上也有别人介绍的相关文章,写的都不详细,大概都是互相copy的。在真正用这个插件的过程中还有不少细节在里面,我前前后后被这个插件绊了好几次,开始以为是wordpress的一些问题,把wordpress重装3次左右,这个插件更是重装不下5次。历程十分艰辛,也许是刚建站,悟性不够吧!不过现在我玩转了这个插件,相信对初期建站的朋友们肯定有点用。

说了这么多,下面开始详细介绍此插件的用法吧:

1.先展示下插件的庐山真面目吧

2.点击 goto the 1-2-3 quicksetup again进入安装页面。or的左边选项是真正的生成静态页面,右边选项是测试生成静态页面。(直接选择左边选项)

3.进入下一步set destinations,设置如下,可见我直接生成在了网站根目录,最开始我是选择默认的配置,发现的路径很长,显示在浏览器很难看,后来就生成到根目录了。

4.进入下一步,出现如下三个选项说明配置正确,直接next。(如果只有Logfile writeable,Logfile readable两个绿色块,说明上一步的物理路径和访问者配置错误)

5.下一步。点击start generating files...按钮开始生成本地静态文件。

6.生成好的文件夹如下所示,而且还会在同级目录下生成一个index.html页面。

 

 以上只是通过配置生成了静态页面,是第一次使用配置需要,后面写新文章后,只需要在设置里面重新生成下静态文件,插件会自动重写覆盖之前的页面,下面简单介绍下Really Static Settings的选项设置,只有两点需要注意:

(1):source和destination的路径配置和初始配置的路径保持一致,一次配置后面无需变动,除非你想把静态文件生成在新目录的时候,如下图:

(2)写了新文章如果想立马生成静态的,只需要先把网站先改为动态访问模式,然后在Reset下点击reset filedatabase,Manual Refresh下点击write all files就OK了,如下图:

 

 

以上是我对really static 插件的使用介绍,我做三点总结:

  • 每次用插件生成静态页面的时候都需要把网站改为默认的动态访问形式,我猜想插件会像爬虫一样爬到每个动态页然后生成静态页。(例:我的是php网站,把网站起始页面设置成index.php。这个很关键,我最开始使用的时候,生成了一次成功了,后来发表了新文章,然后在设置页(Really Static Settings)重新生成一下静态页面,由于当前网站是静态的,生成的页面都是指向网站的首页index.html,这个我目前没找到原因,比较困惑。)
  • 要把静态文件生成在网站根目录下,这样浏览器地址简洁好看。生成在其他路径下我目前还没有找到解决办法,我那样做过,试图用把网站域名解析到所在目录路径,但是未果o(︶︿︶)o 唉
  • 生成成功后,再把网站起始页面改为index.html,这样网站运行的才是生成的静态页面

 

         这只是我个人对应这个插件的见解,这只是网站建设路上的一个小点,从选域名空间,然后备案,搭站这里面,细节挺多的,后面肯定还有很多新东西需要去探讨学习。热烈欢迎有兴趣的园友加入我的QQ群70762253,讨论建站的方方面面,当然也可以交流.NET技术:-) 。

 

 

本文链接


    
[3]从LazyPhp说起
    来源:    发布时间: 2013-10-15

最近一周一直在看PHP. 开始慢慢梳理基本语法.顺便看了一个比较入门Php轻框架-LazyPhp.

在NetBeans上Coding 过程中深感Php作为弱语言在语法层次和perl有很多相似之处.当然现在也有很多动态网页脚本语言Perl,Asp,Jsp等.它里面的语法大量借鉴了C和Perl.首先Php是开源的.同样对于一个动态网站经典配置Php+Apache+MySQl这样完全免费并且跨平台的组合.成功构建类似MediaWiki[维基百科]和WordPress Blog系统就是很好例子.

如果你熟悉Perl你会发现Php的函数库远远多于Perl.最重要的是PHP中完全没有nameSpace命名空间的概念.这难免导致了在Coding时必须尽力避免模块间命名上冲突.Php在数据库访问上也几乎支持所有流行的数据库.Java是通过JDBC访问数据库.通过不同数据库厂商提供驱动访问数据库.相对来说接口比较统一.但我看了Php 在不同的数据库Demo发现时采用不同访问接口.数据访问这部分代码可通用性不高.

在底层运作上Php采用的是 Web服务器(Apache,Nginx)->Php 解析器解释脚本并回显. 而JSp采用的是Web服务器(Apache,Nginx)->容器->java虚拟机解析Servlet并回显.可以明显看到Php自身缺乏多层结构的支持.相对于已经具有成熟框架和开发工具支持的java.Php自身结构上缺陷。在大型复杂的项目开发和维护上显得比较困难.但反过来Php语法简单.更适合于快速开发.成本和学习曲线偏低.能够快速响应需求变化./Java在规模上则偏向于于开发大型的应用系统,易维护、可复用性较高特点..只能说尺有所短寸有所长.

看到有人在网上总结了目前动态网页脚本语言一些特点总结.比较同意 如下[用过Java/RoR]:

Php –Java – Ruby –Python:

Php: Quick and Dirty

Java: Beauty and Slowly

Ruby: Quick and Beauty

Python:Quick and Simple

曾使用过Asp.net,Jsp,Ruby Of Rails.当然给我体验最好莫过于ROR了.

在梳理Php基本语法同时.也看项目中使用一个比较入门LazyPhp框架.相对于Zend Php臃肿和庞大.LazyPhp则体现出一个小巧易用基于MVC特点.FrontController+Layout系统+20个常用函数就是全部.当然更多Lazyphp介绍请参考:

LazyPhp Home Page:http://ftqq.com/lazyphp/

LazyPhp3 Download At github: https://github.com/easychen/LazyPHP

从github下载源码.花费一个下去搞清楚里面执行流程.可能是因为LazyPhp太过于小众我一直没有找到很好的基于这个框架的一些Sample demo. 还好Github上下载源码其实就是采用Lazyphp构建第一个网站末班.唯一不同时没有任何内容.

在NetBeans打开LazyPhp源码代码结构如下:

从LazyPhp介绍来看.Index.php是当前站点所有请求的入口.源码如下:

1: <?php 2: /* lp app root */ 3: // ↑____ for aoi . Do Not Delete it. 4: /**** load lp framework ***/ 5: define( 'DS' , DIRECTORY_SEPARATOR ); 6: define( 'AROOT' , dirname( __FILE__ ) . DS ); 7:   8: //ini_set('include_path', dirname( __FILE__ ) . DS .'_lp' ); 9: include_once( '_lp'.DS .'lp.init.php' ); 10: /**** lp framework init finished ***/

首先在Index中定义两个常量.其中ARoot定义是网站所在的根目录.加载Lazyphp框架_Lp目录下lp.init.php文件.

1: <?php 2:   3: if( !defined('AROOT') ) die('NO AROOT!'); 4: if( !defined('DS') ) define( 'DS' , DIRECTORY_SEPARATOR ); 5:   6: // define constant 7: define( 'IN' , true ); 8:   9: define( 'ROOT' , dirname( __FILE__ ) . DS ); 10: define( 'CROOT' , ROOT . 'core' . DS ); 11:   12: // define 13: error_reporting(E_ALL^E_NOTICE); 14: ini_set( 'display_errors' , true ); 

定义两个常量.其中Root框架根目录,CRoot为框架核心目录.并设置当前PHP报错级别为Notice.

1: include_once( CROOT . 'lib' . DS . 'core.function.php' ); 2: @include_once( AROOT . 'lib' . DS . 'app.function.php' ); 3:   4: include_once( CROOT . 'config' . DS . 'core.config.php' ); 5: include_once( AROOT . 'config' . DS . 'app.config.php' );

载入框架核心函数即[core.function.php]文件.和站点自定义函数[app.function.php]. 并载入Lazyphp框架当前配置[core.config.php] 站点自身对应配置[app.config.php]文件.

1:   2: $c = $GLOBALS['c'] = v('c') ? v('c') : c('default_controller'
    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3