首页 > 编程技术 > php

PHP使用递归算法无限遍历数组示例

发布时间:2017-1-22 11:08

这篇文章介绍了PHP使用递归算法无限遍历数组的实例,分析了php针对一维数组、二维数组及多维不规则数组的通用遍历技巧,有兴趣的同学可以看看

本文实例讲述了PHP使用递归算法无限遍历数组。分享给大家供大家参考,具体如下:

 代码如下 复制代码

<?php

//无限遍历数组

$a1=array("a","b","c");//一维数组

$a2=array(array(21, 3, 6),array("a","b","c"));//二维数组

$a3=array(array(array(5, 55), 4, 444), 2, 7, 6, 8,array("w","d",array(3, 2,"a"),"s"));//多维不规则数组

functionfun($a) {

  foreach($aas$val) {

    if(is_array($val)) {//如果键值是数组,则进行函数递归调用

      fun($val);

    }else{// 如果键值是数值,则进行输出

      echo"$val<br />";

    }//end if

  }//end foreach

}//end fun

//fun($a1);

//fun($a2);

fun($a3);

?>

输出:

 代码如下 复制代码

5

55

4

444

2

7

6

8

w

d

3

2

a

s

分页基本上是每个项目都会使用到的。本文介绍了常用PHP封装分页工具类,对此有疑问的同学快来看看这篇文章吧!

分页基本上是每个项目都会使用到的,所以呢,把它封装成一个工具类,以后直接调用就可以了(虽然TP框架的灰常强大,但是自己封一个也未尝不可。),这样既省时又省力还赚‘工分'。

我封的这个分页工具类还比较完整,有首页,上一页,下一页,末页和可选数量的页码数量(也就是当页面很多时,只显示依据参数传入的个数),还可以依据需求选择是否使用下拉跳转页面功能。

 代码如下复制代码

<?php

/**

 * 分页工具类

 */

 

classpage{

 

  /**

   * 返回分页所需字符串

   * @param $pageNum int 显示的页码

   * @param $pageCount int 总的页码数

   * @param $url string 当前页码路径

   * @param $Count string 页码列表里显示的个数

   * @param $selected bool 是否开启下拉框选择功能。默认不开启

   * return $strpage string 分页字符串

   */

  functionshowPage($pageNum,$pageCount,$url,$Count= 5,$selected= false){

    $pageMaxVal=$Count- 1;// 页码到达最大时,页码列表里第一个页码与最大页码的差

    $pageMiddleVal=ceil($Count/ 2);// 依据需要显示页码个数得到的中间值

    $pageMiddleCha=floor($Count/ 2);// 依据需要显示页码个数得到的当前页码与第一个页码的差

 

    // 判断url是否已经存在?

    if(!strpos($url,'?')){// 未存在?

      $url.='?'

    }else{

      $url.='&'

    }

 

    // 首页

    $strpage="首页";

 

    // 上一页

    $preNum=$pageNum> 1 ?$pageNum- 1 : 1;

 

    // 当页码为第一页时取消上一页按钮的功能

    $strpage.=$pageNum== 1 ?"上一页":"上一页";

 

    // 显示的页码列表中的第一个页码

    $startPage=$pageNum>$pageMiddleVal?$pageNum-$pageMiddleCha: 1;

    // 起始页码最大值 = 总页数 - 4

    if($pageCount-$pageMaxVal> 0 &&$startPage>$pageCount-$pageMaxVal){

      $startPage=$pageCount-$pageMaxVal;

    }

 

    // 显示的页码列表中的最后一个页码

    $endPage=$startPage<($pageCount-$pageMaxVal) ?$startPage+$pageMaxVal:$pageCount;

 

    // 中间数字页码

    for($i=$startPage;$i<=$endPage;$i++){

      if($i==$pageNum){

        $strpage.="$i";

      }else{

        $strpage.="$i";

      }

    }

 

    // 下一页

    $nextNum=$pageNum<$pageCount?$pageNum+ 1 :$pageCount;

 

    // 当页码为最后一页时取消下一页按钮的功能

    $strpage.=$pageNum==$pageCount?"下一页":"下一页";

 

    // 末页

    $strpage.="末页";

 

    // 总页数

    $strpage.="总页数:{$pageCount}  ";

 

    // 判断是否是否选择页码功能

    if($selected){// 选择了

      $strpage.="当前页码:

        for($i= 1;$i<=$pageCount;$i++){

          if($i==$pageNum){

            $strpage.="

          }else{

            $strpage.="

          }

        }

         

      $strpage.="";

    }

 

    return$strpage;

  }

 

}

 

接下来应该会PO完MySQL剩余部分知识吧,希望大家继续关注。

小编给大家分享的这篇文章介绍了PHP实现二维数组根据key进行排序的方法,对二维数组根据key进行排序有疑惑的同学可以参考一下本文

在PHP中内置了很多对数组进行处理的函数,有很多时候我们直接使用其内置函数就能达到我们的需求,得到我们所想要的结果;但是,有的时候我们却不能通过使用内置函数实现我们的要求,这就需要我们自己去编写算法来对自己的想法进行实现。下面就讲述一下如何实现二维数组根据key进行排序。

实现方法:

 
 代码如下 复制代码
<?php
/**
 * =======================================
 * Created by Zhihua_W.
 * Author: Zhihua_W
 * Date: 2016/11/26 0002
 * Time: 下午 2:43
 * Project: PHP开发小技巧
 * Power: 实现二维数组根据key进行排序
 * =======================================
 */
/**
 * 二维数组排序
 * @param array $arr 需要排序的二维数组
 * @param string $keys 所根据排序的key
 * @param string $type 排序类型,desc、asc
 * @return array $new_array 排好序的结果
 */
functionarray_sort($arr,$keys,$type='desc')
{
  $key_value=$new_array=array();
  foreach($arras$k=>$v) {
    $key_value[$k] =$v[$keys];
  }
  if($type=='asc') {
    asort($key_value);
  }else{
    arsort($key_value);
  }
  reset($key_value);
  foreach($key_valueas$k=>$v) {
    $new_array[$k] =$arr[$k];
  }
  return$new_array;
}
$arr=array(
  array(
    'name'=>'a',
    'sex'=>'m',
    'sort'=> 5
  ),
  array(
    'name'=>'c',
    'sex'=>'m',
    'sort'=> 8
  ),
  array(
    'name'=>'g',
    'sex'=>'m',
    'sort'=> 3
  ),
  array(
    'name'=>'e',
    'sex'=>'w',
    'sort'=> 6
  ),
  array(
    'name'=>'b',
    'sex'=>'w',
    'sort'=> 2
  ),
);
//打印出原数组
print_r($arr);
//打印出排好序的数组
print_r(array_sort($arr,'name'));
?>
 

通过打印出的结果我们就可以看到,数组根据“name”进行排序。

 
 代码如下 复制代码
//原数组
Array
(
  [0] => Array
    (
      [name] => a
      [sex] => m
      [sort] => 5
    )
  [1] => Array
    (
      [name] => c
      [sex] => m
      [sort] => 8
    )
  [2] => Array
    (
      [name] => g
      [sex] => m
      [sort] => 3
    )
  [3] => Array
    (
      [name] => e
      [sex] => w
      [sort] => 6
    )
  [4] => Array
    (
      [name] => b
      [sex] => w
      [sort] => 2
    )
)
//排序后数组
Array
(
  [2] => Array
    (
      [name] => g
      [sex] => m
      [sort] => 3
    )
  [3] => Array
    (
      [name] => e
      [sex] => w
      [sort] => 6
    )
  [1] => Array
    (
      [name] => c
      [sex] => m
      [sort] => 8
    )
  [4] => Array
    (
      [name] => b
      [sex] => w
      [sort] => 2
    )
  [0] => Array
    (
      [name] => a
      [sex] => m
      [sort] => 5
    )
)
 
是到了PHP落幕的时候了。就在我这个顽固的PHP分子正要把一个现有的Ruby on Rails代码库转换成PHP时,我要说这样的话。

是到了PHP落幕的时候了。就在我这个顽固的PHP分子正要把一个现有的Ruby on Rails代码库转换成PHP时,我要说这样的话。

历史在重演

我认为PHP将亡,因为我以前见到过。大概十年之前,PHP灭掉了Perl。当然了,并不十分彻底;它还坚守在某些环境里,它还有相当可观数量的顽固粉丝,遗留下来的应用程序也需要维护,持续几十年。但这种语言对于新一代的人,特别是web开发者,它在1999年就开始灭亡了,到2005年左右几乎完全死了。

作为在那个时期出现的新的web开发者,事情显的很明白而且水到渠成:Perl已经不适应新的应用开发环境了。在Perl里,页面需要冗长的公式化的CGI方式实现,而这些在PHP里却可以用基本的、缺省的编程方式实现。Perl语言里到处都是旧时代的特征 — 引用,不方便的数据结构,还有其他许多的小的古怪语法语义 —— 这使得web开发冗长,不稳定,不方便。无怪乎没有一个出色的web应用是用Perl写成的,而用PHP你却能做的又快又简单,尽管PHP存在着在当时就显而易见的缺陷。

在1999年支持Perl反对PHP的争论有很多:Perl要快的多,有更多的程序库和驱动支持,CPAN是个神奇的地方,里面预先写好的代码能让你绝大部分任务省去80%的工作量。现在看起来这些就有点可笑了,但“PHP缺乏可扩展性”却是个真正的缺点。但总之PHP赢了,因为上面所说的这些问题并不是这种语言固有的。PHP解释器可以变得更快,程序库可以被开发出来,PERA和PECL目前已经变得相当庞大,这还不包括各种厂商希望人们去使用他们的API而提供的非正式的程序库。

时间在推移

十年之后,我可以感觉到历史大潮正在重演。开发人员对语言的期望在前进。如果说Perl最缺乏的是PHP里令人惊讶的灵活的“关联数组”(也就是智能哈希表),那么PHP现在缺乏的就是lambdas和方法链(method chaining)了。同时PHP往往是用在只要20行代码就能写出一个网页的地方,而如今却是如果你不使用什么MVC框架之类的东西就会被认为没有把事情做对。公式化的代码表明了问题所在:这种语言需要一个框架来替人们做这些事情。

退回到以前,我认为那些顽固的使用Perl来做web开发的人很傻。现在,经历了十年的PHP开发,我处在相同的位置上了。我可以在一个小时里用PHP敲出一个不错的网站,在一两天里开发出一个优秀的网站。PHP的性能众人皆知,我可以无限的扩展它。我雇佣过的每个开发人员都会它,我集成过的每个系统里都有一个用它写出的打包的代码库。我深陷于PHP的方便性,尽管它对于我的任务并不是一个合适的语言。

转向Ruby on Rails

最明显有潜在能力继任PHP的是Ruby on Rails。Ruby是一个新的、干净的语言,具有现代的语言特征,松散、优雅的语法(很像Python)。Rails省去了我们常见的任务,省去了集成web应用里的公式化的做法,把PHP里三、四行的习惯写法变成了first-class语言结构。这看起来极其像我需要的PHP替代品、能让开发工作再一次提速的东西。

我每天使用Rails,修改一个喜爱这种框架和语言的有经验的Rails专家所写的Rails应用,七个月后,我却不能断言Rails是一个正确的选择了,原因很难表达。我这篇文章的目的就是想试图把原因说清楚。

我的主要的抱怨,必须要提的,就是性能。我之前就说过这种问题不应该被当作一种语言的致命缺陷,它只是语言实现中的暂时的问题。所以我不能把这当作一个真正的问题,尽管它是我把现在的应用移植到PHP的最主要的一个原因。我可以让Rails跑的跟PHP一样快,但那需要提供2到4倍高的硬件条件。我估计五年内将还会这样,五年后我也许不必把程序移植到PHP。但现在,它不能满足我的要求。

第二,我讨厌Active Record。Active Record是一种模式,并不是Ruby固有的,在Rails的最新版本里是可选择的,但是对它的使用和这种模式已经深入到了Rails的DNA里了。我之前曾解释过为什么我认为这数据库上的ORM不是个好做法,所以我不会再重复解释,但有一点我需要总结的就是你省去了手工写CRUD所获得的效能要大于ActiveRecord做傻事所损失的效能,要花时间搞清楚它是怎么工作的,顺应框架原则,防止它做这样的事情。

第三,我十分的不信任代码自动生成。工具能帮你生成模板式的代码很有用,但你的程序了却多出了成堆的毫无用处的代码来实现这些目的,这就变的不好了。代码生成喜欢“神奇推理”,因为生成器并不确定代码某些特别有用的特征究竟是专门写出的还是语言环境固有自带的。神奇推理是危险的。

代码生成让我想到了Ruby on Rails的一个可能是最根本的问题,就是它并不是一种语言。Ruby是一种语言。但Ruby,它在解决了PHP上的一些基本问题外,并没有解决核心问题,那就是现代web应用需要一系列的改进:像routing,model/view分类,drop-in功能性等都是很常见的特征。Rails里有,但这跟PHP里的Zend,Symfony 和 Code Igniter之类的MVC框架一样只是绑上去的绷带。

那么缺的是什么?

能够取代PHP的语言必须十分优秀于PHP,就如同PHP优秀于Perl一样。它必须承担起web应用的主要实现任务,就像PHP那样,你的代码的主要功能就是输出网页 —— 一个有点激进的要求,它要不适合去做其它的事情,例如当中shell脚本语言。我希望有这样一种语言,它能够承担起我开发一个MVC式的web应用时的所有的任务,所有功能都是核心内置的,不能仅是一个程序包。

问题是,没有这样的一种语言。有一段时间服务器端JavaScript看起来将会成为下一个重要的语言,它能统一web应用前端和后端的编程语言。但是这些JavaScript上的伟大思想总是徘徊在一些跑题的行为上,比如nodejs:事件驱动模式非常的激进和强大,能让你开发出高性能的应用程序,最大化的使用新式硬件,但这是一种开发服务器端应用程序的思路,不是web页面。并且你仍然需要去写一大堆可怕的web页面。另外一些CommonJS的成果例如ejScript开始尝试着取代PHP,但仍没有解决框架问题。

仍在等待

我不得不做出结论,PHP的替代者还不存在。Ruby on Rails很好,但并不比一个PHP之上的类似的MVC框架强多少,更别提由于Ruby自身的效率不高和ActiveRecord的ORM恶搞带来的双重打击。Python看起来并不感兴趣于作为下一代的web语言,JavaScript的服务器端解决方案还刚刚只是个开始。

我等待下一个大目标的出现。我希望能从PHP上转走,真的。我可不想成为Perl式的古董。但不管怎样,这种语言看起来还不存在。我判断错了吗?

这篇文章介绍了php的4种常用运行方式,CGI、FastCGI、APACHE2HANDLER和CLI,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

php的4种常用运行方式:CGI、FastCGI、APACHE2HANDLER、CLI。

1、CGI

CGI即通用网关接口(common gatewag interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi 方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。

2、FastCGI

fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。
Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)。FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web 请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接(Persistent database connection)可以工作。

3、APACHE2HANDLER
PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

4、CLI

cli是php的命令行运行模式,cli端的运行命令有时会很有用,以下总结几个:

查看php版本信息

eric:~ youngeric$ php -v
 
PHP 5.5.38 (cli) (built: Oct 1 2016 23:03:00)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies

查看当前php的扩展

eric:~ youngeric$ php -m
 
[PHP Modules]
bcmath
bz2
calendar
Core
ctype
curl
date
......

查看php.ini配置信息(相当于使用phpinfo()函数)

eric:~ youngeric$ php -ini
 
phpinfo()
PHP Version => 5.5.38
 
System => Darwin eric.local 16.1.0 Darwin Kernel Version 16.1.0: Wed Oct 19 20:31:56 PDT 2016; root:xnu-3789.21.4~4/RELEASE_X86_64 x86_64
BuildDate=> Oct 1 2016 23:01:51
Configure Command =>'./configure''--prefix=/usr/local/Cellar/php55/5.5.38_11''--localstatedir=/usr/local/var''--sysconfdir=/usr/local/etc/php/5.5''--with-config-file-path=/usr/local/etc/php/5.5''--with-config-file-scan-dir=/usr/local/etc/php/5.5/conf.d''--mandir=/usr/local/Cellar/php55/5.5.38_11/share/man''--enable-bcmath''--enable-calendar''--enable-dba''--enable-exif''--enable-ftp''--enable-gd-native-ttf''--enable-mbregex''--enable-mbstring''--enable-shmop''--enable-soap''--enable-sockets''--enable-sysvmsg''--enable-sysvsem''--enable-sysvshm''--enable-wddx''--enable-zip''--with-freetype-dir=/usr/local/opt/freetype''--with-gd''--with-gettext=/usr/local/opt/gettext''--with-iconv-dir=/usr''--with-icu-dir=/usr/local/opt/icu4c''--with-jpeg-dir=/usr/local/opt/jpeg''--with-kerberos=/usr''--with-libedit''--with-mhash''--with-ndbm=/usr''--with-png-dir=/usr/local/opt/libpng''--with-xmlrpc''--with-zlib=/usr''--with-readline=/usr/local/opt/readline''--without-gmp''--without-snmp''--with-libxml-dir=/usr/local/opt/libxml2''--with-pdo-odbc=unixODBC,/usr/local/opt/unixodbc''--with-unixODBC=/usr/local/opt/unixodbc''--with-bz2=/usr''--with-openssl=/usr/local/opt/openssl''--enable-fpm''--with-fpm-user=_www''--with-fpm-group=_www''--with-curl''--with-xsl=/usr''--with-ldap''--with-ldap-sasl=/usr''--with-mysql-sock=/tmp/mysql.sock''--with-mysqli=mysqlnd''--with-mysql=mysqlnd''--with-pdo-mysql=mysqlnd''--disable-opcache''--enable-pcntl''--without-pear''--enable-dtrace''--disable-phpdbg''--enable-zend-signals'
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /usr/local/etc/php/5.5
Loaded Configuration File => /usr/local/etc/php/5.5/php.ini
Scan this dirforadditional .ini files => /usr/local/etc/php/5.5/conf.d
......

查看函数信息

eric:~ youngeric$ php --rfdate
 
Function [ <internal:date>functiondate] {
 - Parameters [2] {
  Parameter #0 [ <required>$format]
  Parameter #1 [ <optional>$timestamp]
 }
}

查看类信息

eric:~ youngeric$ php --rc pdo
 
Class [ <internal:PDO>classPDO ] {
 
 - Constants [89] {
  Constant [ integer PARAM_BOOL ] { 5 }
  Constant [ integer PARAM_NULL ] { 0 }
  Constant [ integer PARAM_INT ] { 1 }
  Constant [ integer PARAM_STR ] { 2 }
  Constant [ integer PARAM_LOB ] { 3 }
  Constant [ integer PARAM_STMT ] { 4 }
  Constant [ integer PARAM_INPUT_OUTPUT ] { 2147483648 }
 ......

检测php代码

eric:~ youngeric$ php -l jiance.php
 
PHP Parse error: syntax error, unexpectedendof file, expecting','or';'in jiance.php on line 3
Errors parsing jiance.php

作为世界上最好的语言,php甚至还内置了服务器的功能(有没有很震惊的样子)。

eric:Desktop youngeric$ php -S 127.0.0.1:8080
 
PHP 5.5.38 Development Server started at Thu Dec 22 09:44:20 2016
Listening on http://127.0.0.1:8080
Document root is /Users/youngeric/Desktop
Press Ctrl-C to quit.
[Thu Dec 22 09:44:29 2016] 127.0.0.1:52988 [404]: / - No such fileordirectory
[Thu Dec 22 09:44:29 2016] 127.0.0.1:52989 [404]: /favicon.ico - No such file
标签:[!--infotagslink--]

您可能感兴趣的文章: