Archive

Archive for May, 2008

DISCUZ代码分析之COOKIE篇

May 31st, 2008

discuz提供了通行证 可有时候使用通行证不一定适用 就比如说那一段很长很长的url吧 看着就让人心烦
有什么解决方法捏? 那就是生成一个discuz 验证cookie

废话说完了 开始正题:
开始之前 咱先了解一下discuz的登陆机制
先来一个简单的form

<?php
<form action='i_login.php'>
    user:<input  name='username' type='text'>
    password:<input name='password' type='password'>
    <input type='submit' value='login'>
</form>
?>

下面 说下php方面的 我们假设改文件和discuz同一目录里
看代码
i_login.php

<?php
 
    /**
     * 加载discuz的入口文件 当然你也可以不加 不过你得提出几个必要的函数
    */
     require_once './include/comon.inc.php';
 
 
     $formUsername = trim($username); // 接受POST传来的$username
     $formPassword = trim($password); // 接受POST传来的$password
 
 
    /**
     *  说下下面的secques
     *  secques呢 是论坛里的安全回答经过编码后提取的一段字符 虽然我们登陆的时候不会用到它
     *  但是生成COOKIE呢 它还是不可或缺的滴
    */
 
 
     $query = $db->query("SELECT uid,password,secques FROM cdb_members WHERE username='$formUsername'");
     $member = $db->fetch_array($query);
 
     // 验证用户密码是否匹配
     if($member['password'] == md5($formPassword))
     {
        // 已经验证用户密码都是匹配的 下面比较关键的就是生成cookie了 可要仔细看好了
 
 
        /*
 
         先说下dsetcookie函数  这是一个dz一个设置cookie的函数 可以在include/global.func.php里查看
         通常只需要三个参数即可 第一个为cookie键 第二个为键值 第三个为cookie有效时间 这里我就随便设置一个
 
         再说 authcode 此为加密函数  俺一直用这个函数 很强大 很难破解 有兴趣的朋友也可在include/global.func.php里
 
            找到改函数 研究一下
        */
        dsetcookie('sid','',-2423234234); // 注销掉sid
        dsetcookie('auth', authcode("$formPasswordt$$member['secques']t$member['uid']", 'ENCODE'), '1234243');
 
 
        // OK 关键步骤 我们都已经完成了 下面就由你写一个header跳转到论坛首页看是否登陆了 我本地测试可以 你由问题的话那可就是
        // RPWT了
 
 
        header("location:/index.php");
 
 
 
     }
     else
     {
        // 我们这里返回一个错误信息 告诉那个用户密码错误
     }
 
    ?>

好 一个简单的登陆验证就完成了

如果你不想加载common.inc.php文件的话 你需要提取
authcode 和dsetcookie函数 都比较简单哈

OK 我们继续说下discuz验证部分 没兴趣的可以跳过去

验证部分 在common.inc.php 大约119行 开始

<?php
// 拆解COOKIE auth
list($discuz_pw, $discuz_secques, $discuz_uid) = isset($_DCOOKIE['auth']) ? explode("t", authcode($_DCOOKIE['auth'], 'DECODE')) : array('', '', 0);
 
$discuz_pw = addslashes($discuz_pw);
$discuz_secques = addslashes($discuz_secques);
$discuz_uid = intval($discuz_uid);
 
// 不存在$_DCOOKIE['auth']的话 就直接清楚COOKIE
if(isset($_DCOOKIE['auth']) && !$discuz_uid) {
    clearcookies();
}
 
$newpm = $newpmexists = $sessionexists = $seccode = $bloguid = 0;
if($sid) {
 
      //存在$discuz_uid的话 根据uid取出用户信息 否则根据sid
    if($discuz_uid) {
        // 取用户信息
    } else {
        // 用sessions表中取用户信息
    }
 
    // 下面就是验证了 我不写了 (sid是用户的一个sessionid 用户登陆后会在sessions表内生成一条用户记录 用户推出后该记录删除
?>

PHP&MYSQL ,

Apache日志中“指定的网络名不再可用”问题的解决

May 29th, 2008

Apache日志中“指定的网络名不再可用”问题的解决

在Apache的logs/error.log中经常出现如下记录:

[Fri Mar 16 17:28:49 2007] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Fri Mar 16 17:28:49 2007] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Fri Mar 16 17:28:50 2007] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Fri Mar 16 17:28:50 2007] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Fri Mar 16 17:28:50 2007] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Fri Mar 16 17:28:50 2007] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.
[Fri Mar 16 17:28:50 2007] [warn] (OS 64)指定的网络名不再可用。 : winnt_accept: Asynchronous AcceptEx failed.

出现这个故障时硬盘灯狂闪,内存占用极大,导致网站访问极慢。

解决方法:

Apache 关闭 AcceptEx() ,这个在Windows平台下适用

方法是在 httpd.conf 内加入 Win32DisableAcceptEx 。

Win32DisableAcceptEx 顾名思义就是在 Windows 下关掉 AcceptEx() 功能的指令。至於 AcceptEx() 这个东西是什么,可以参考 Apache 的官方网页:

http://httpd.apache.org/docs-2.0/mod/mpm_winnt.html#win32disableacceptex

QUOTE:
AcceptEx() is a Microsoft WinSock v2 API that provides some performance improvements over the use of the BSD style accept() API in certain circumstances. Some popular Windows products, typically virus scanning or virtual private network packages, have bugs that interfere with the proper operation of AcceptEx(). If you encounter an error condition like:

[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

you should use this directive to disable the use of AcceptEx().

主要是说这 AcceptEx() 是 Microsoft WinSock v2 API 一组提升网络效率 API 中的指令。而且在 Windows 上似乎蛮有可能出问题的。

注:可能为了效能还是预设为开啟 AcceptEx()

如果无预警的发生问题,我猜可能是 Windows Update 或是防火墙、防毒软体更新了某些网路原件,造成 Microsoft WinSock v2 API 动作不正常,这时可以把这个功能先给关掉。

依照官方说明 , Win32DisableAcceptEx 这个功能,只有 2.0.49 版以后的才可以使用,所以我猜测 AcceptEx() 这个指令大概也是 2.0.49 才会开始支援(目前最新的就是 2.0.49)。

关掉 AcceptEx() 的方式只要在 httpd.conf 找到 区段,加入 Win32DisableAcceptEx 就可以了。

QUOTE:

Win32DisableAcceptEx #加入这一行
ThreadsPerChild 250
MaxRequestsPerChild 0

然后重新启动动 Apache,“指定的网络名不再可用”再也不出现了

apache , ,

php处理文本中的换行符

May 29th, 2008

我看有些朋友说的是用header()函数。但是在html中显示,就可能碰到一些问题,如把html也当文本完全显示出来了。
要在一个html页面中显示或写入一个纯文本文件。则要动用键值。chr(13)和chr(10),其实这两个键值就是/r/n

读取文本中的换行符,用’/r/n’
而要在txt中写入换行符,要符合windows下程序的规则,则要写入chr(13).chr(10)
例:读 explode(“\r\n”,$contents);//每行导入数组 $contents已经是文本整个读入
写 fwrite ($fp,’12345′.chr(13).chr(10));

PHP&MYSQL , ,

php中echo, print, printf 和 sprintf 的区别

May 29th, 2008

- echo

是命令,不能返回值。echo后面可以跟很多个参数,之间用分号隔开,如:
echo $myvar1;
echo 1,2,$myvar,”bold“;

- print

是函数,可以返回一个值,只能有一个参数。

- printf

函数,把文字格式化以后输出,如:
$name=”hunte”;
$age=25;
printf(“my name is %s, age %d”, $name, $age);

- sprintf

跟printf相似,但不打印,而是返回格式化后的文字,其他的与printf一样。
- echo

是命令,不能返回值。echo后面可以跟很多个参数,之间用分号隔开,如:
echo $myvar1;
echo 1,2,$myvar,”bold“;

- print

是函数,可以返回一个值,只能有一个参数。

- printf

函数,把文字格式化以后输出,如:
$name=”hunte”;
$age=25;
printf(“my name is %s, age %d”, $name, $age);

- sprintf

跟printf相似,但不打印,而是返回格式化后的文字,其他的与printf一样。

PHP&MYSQL , , , ,

discuz的md5加密方法

May 26th, 2008

以前,人们习惯将用户的密码md5之后,存入数据库。这样就算是数据库被人非法得到,也无法得知用户的密码。
由于sql注入、跨站脚本攻击、上传漏洞、以及一些网管的粗心大意等原因,造成不少论坛被攻破,数据库被盗,这对用户的隐私和个人信息安全造成了很坏的影响。尤其是很多用户对多种网络服务使用同一密码,如果论坛密码被窃,将威胁到用户的邮箱,即时通讯,网银等一系列的安全。以至于出现了“一个密码引发的血案”。

现在常用论坛都是将用户密码用MD5等hash函数hash后,再存放在数据库中。这种做法在一定程度上提高了安全性。万一不法分子得到数据库后,只拿到用户密码的HASH值。但一般用户在设置密码时,为了怕忘记,大多数采用姓名拼音,生日,常用单词,数字串单独或组合使用的方式。所以,不法分子只需将这些数据及其hash值存放在数据库中,再通过查询hash值的方式,就能破解很多用户的密码。如果这个字典数据库足够大,并且字典比较符合人们的设置习惯的话,那威力是惊人。以至于现在网上出现了MD5 hash串查询的网站,号称用4T硬盘共存储md5记录4574亿条,能破译动网论坛83%的密码。
那么如何防范这种字典攻击和网上那种MD5 hash串查询攻击呢。我在《应用密码学》这本书上找到了答案。salt是一随机字符串,它与口令连接在一起,再用单向函数对其运算,然后将salt值各单向函数运算的结果存入数据库中。如果可能的salt值的数目足够大的话,它实际上就消除了对常用口令采用的字典式攻击,因为不法份子不可能在数据库中存储那么多salt和用户密码组合后的HASH值。当然,他们仍可以对单个用户的密码进行暴破。所以用户最好不要在不同的地方使用相同的口令。但利用 salt后的安全性还是有所示增加的。
例如discuz论坛的密码加密方式。
采用salt方式,随机获得一个字符串,然后把明文密码MD5之后,再与随机字符串连接起来之后,再次MD5。这样可极大的提高安全系数。

获得随机字串的代码:

<?php
function random($length, $numeric = 0) {
    PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
    if($numeric) {
        $hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
    } else {
        $hash = '';
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
        $max = strlen($chars) - 1;
        for($i = 0; $i < $length; $i++) {
            $hash .= $chars[mt_rand(0, $max)];
        }
    }
    return $hash;
    exit;
    }
?>

得得随机字符串
加密密码:md5(md5($newpw).$salt) $salt为random返回的字符串$hash
这样就极大的提高了用户密码的安全性。

PHP&MYSQL , , ,

郭德刚 刚刚好(一)

May 21st, 2008

《刚刚好》(歌词)
  2005年我认识这个人
  周末常混在北京的南城
  他在茶馆里说他的相声
  现在的他是最火的草根
  (郭)床前明月光,疑是地上霜,举头望明月,我叫郭德纲。大伙是愿意听啊,是愿意听啊,是愿意听啊?我决不强求。
  这个世界真的奇妙
  速溶咖啡比茶要经泡
  街上墨镜戴的不少
  上过海选就带保镖
  这个世界真太浮躁
  唱不清歌词还火爆
  名人争着原告被告
  连馒头也幸免不掉

  刚刚好
  我没恶搞
  刚刚好我没恶搞
  (郭)这个事儿啊离现在不远,家里有老人的可以回家问问,在春秋战国时期啊,人来得不少,我很欣慰。你不知道我?我艺术家啊,我都艺术家一个多礼拜了

  (郭)如花PK了万人迷
  海选VERY了柯以敏
  (郭)大S恋上了周渝民
  李宇春长得不像姚明
  (郭)奥斯卡请来了章子怡
  打官司火了个黄圣依
  (郭)无极火了一个小网民
  大侠挤爆了电视机
  刚刚好
  我烦不了
  刚刚好
  我烦不了
  (郭)流氓会武术,谁知挡不住。这地上有一个人,天堂上就有一块表,好人的表针儿转得慢,坏人的表针儿转得就快。
  (郭)刘刚,你要看看你的表吗?(刘)想啊,我的表在哪呢?(郭)“哦——在上帝那屋当电扇呢。”
  娱乐圈呆长了心慌
  明星们都担心走光
  (郭)狗仔队搞垮了情侣档
  主持人最好港台腔
  晚会基本都是假唱
  爆红需要中性长相歌曲流行他得嘻唰唰混个脸熟春晚联唱
  刚刚好
  我没赶上
  刚刚好
  我没赶上
  (郭)这小伙子长得,把脸挡上跟演员似的……有缺房的、缺车的、缺钱的、缺德的……
  还有些什么我们忘了纪念
  还有什么我们没有经验
  给一个断点
  不敢再想从前
  刚刚好
  我没沾边
  刚刚好
  我没沾边
  (郭)笑什么笑,再笑加钱

小娱一乐 ,

郭德刚 刚刚好II

May 21st, 2008

《刚刚好II》郭德纲&刘刚

*你呀,干点正事吧,整天到晚的啊,
你整天到晚的混得一点正型也没有,
你看看人家, 开好车的买大楼房,
你看看你,你是一无所有,
你脚下的地在抖,你身边的水在流,
(你爸爸姓崔? )你爸爸叫贱(笑声,吁….)
*2006年火了的这个人 有人预计他红不过年根
年头到年尾和官司有缘分 依然红火他艺多不压身
*床前依然明月光,疑似一片地上霜,
举头总得望明月,我名还叫郭德纲。
人干点好事总想让鬼神知道,
干点坏事总以为鬼神不知道,
我们太让鬼为难了.
*娱乐圈里吵吵闹闹 演个丫鬟要投怀送抱
是非恩怨没有征兆 不过争得是个龙套
娱乐圈里装着炸药 今天翻脸明天报料
旧人在哭新人在笑 赚得还是百姓腰包
刚刚好 我名气小 刚刚好 我胆子小
*三教九流各行各业,他的工作都对社会有意义.
那怕是一个赶大车送菜的。驾驾驾.喔喔喔…
我看着很羡慕啊, 我想夸他两句.
谁是我儿子?喔喔喔,
哎呀,给人民带来快乐. (谁给谁带来了快乐)
最起码我快乐了很多.
谁是我孙子?喔喔喔,哎呀,(喝!这位也不长记性.)
谁是王八?(他说什么呀)他提着鞭子过来了.
(那是要抽你)他有不厚道的一面.
*周董and了费玉清 孟广美sorry了众网民
偷拍伤了阿娇的心 张钰她睡觉睡出了名
棚菲生了一个小千金 张柏芝也跟着怀了孕
石头疯了四两拨千斤 整容整到了范冰冰
刚刚好 我没怀孕 刚刚好 我没拍电影
*遇事你别老望上看,你得望下看.(怎么望下看? )
比如说啊,做买卖你赔钱了,那还有跳楼的呢,
看着他你不是很快乐吗.(诶.没错)
你这儿生一闺女,你恨得慌,那还有没孩子的呢.(啊)
你那失业了,那还有失身的呢.(这没可比性啊)
你想,你媳妇不要你了,他也没要我啊.(笑,吁…..)
*娱记们乱点着鸳鸯 钻石李baybay了李湘
世界杯喊哑了黄健翔 要选秀最好学师洋
宪哥主持到了中央 祖德要变性穿女装
老太太死咬着赵忠祥 隐私被博客全部暴光
刚刚好 我没乱讲 刚刚好 我还正常
*早上四点就得起,出去练轻功去,
刚一出去,警察过来了,嗨,喊我,我心里不亏啊,
我可没犯事啊,干嘛啊,晨练都不许嘛,
许!回去把裤子穿上….(笑声)
(干什么也没有光着出来的),起猛了.(笑声)
*到底为什么我们有点厌倦
到底怎样明星才能成仙
得道去西天 能不能还要脸
刚刚好 我没疯癫
刚刚好 我有于谦
刚刚好 就快过年
*哎,干嘛呢你,逮那个飞机拉线的…

小娱一乐 ,

nginx 0.7.30 for 已经发布 windows版同时发布

May 20th, 2008

(更新记录)(2008年12月31日)

For windows版

Branch Package Release Date
Development 0.7.30 24 December 2008
Stable 0.6.34 27 November 2008
Legacy 0.5.37 07 July 2008

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。

HTTP基础功能:

* 处理静态文件,索引文件以及自动索引;

* 反向代理加速(无缓存),简单的负载均衡和容错;

* FastCGI,简单的负载均衡和容错;

* 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;

* SSL 和 TLS SNI 支持;

IMAP/POP3 代理服务功能:

* 使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;

* 使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;

* 认证方法:

o POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;

o IMAP: IMAP LOGIN;

o SMTP: AUTH LOGIN PLAIN CRAM-MD5;

* SSL 支持;

* 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

支持的操作系统:

* FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;

* Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;

* Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;

* MacOS X (10.4) PPC;

结构与扩展:

* 一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;

* kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;

* kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;

* sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;

* 输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;

* 10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。

* 最小化的数据拷贝操作;

其他HTTP功能:

* 基于IP 和名称的虚拟主机服务;

* Memcached 的 GET 接口;

* 支持 keep-alive 和管道连接;

* 灵活简单的配置;

* 重新配置和在线升级而无须中断客户的工作进程;

* 可定制的访问日志,日志写入缓存,以及快捷的日志回卷;

* 4xx-5xx 错误代码重定向;

* 基于 PCRE 的 rewrite 重写模块;

* 基于客户端 IP 地址和 HTTP 基本认证的访问控制;

* PUT, DELETE, 和 MKCOL 方法;

* 支持 FLV (Flash 视频);

* 带宽限制;

实验特性:

* 内嵌的 perl

* 通过 aio_read()/aio_write() 的套接字工作的实验模块,仅在 FreeBSD 下。

* 对线程的实验化支持,FreeBSD 4.x 的实现基于 rfork()

Nginx 主要的英语站点是 http://sysoev.ru/en/

nginx

迅雷去广告方法(不用下载补丁)

May 19th, 2008

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 1904

Warning: Invalid argument supplied for foreach() in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 1904

Warning: Invalid argument supplied for foreach() in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2257

Warning: Invalid argument supplied for foreach() in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3206

Warning: implode() [function.implode]: Argument must be an array in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3258

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3289

Warning: Invalid argument supplied for foreach() in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3289

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3332

Warning: Invalid argument supplied for foreach() in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3332

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3477

Warning: Invalid argument supplied for foreach() in /home/wkiiorg/public_html/akii.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3477

迅雷是我们常用的下载工具之一,但是我们在使用迅雷时经常有些烦人的广告,那么,我们怎么去掉它呢?修改之前关闭迅雷。

一、去广告
1、打开迅雷的安装目录 我的是C:\Program Files\Thunder Network\Thunder\Program
2、找到gui.cfg文件,然后用记事本打开
3、把它的内容改为:

[URL]
ADServer=
LastModifyTime=Mon, 2 Apr 2007 06:32:45 GMT
NavigateTimes=10
TimeSpan=300
PartnerNavigateTimers=10
PartnerTimeSpan=300
PVServer=
PVPort=3076
PVTimeSpan=5
ADCountingServer=
ADCountingPort=3076
HomePage=

4、同时去掉C:\Program Files\Thunder Network\Thunder\Program\AD目录下的所有文件
只留下main.gif、002.gif、new.gif和default_main.swf这四个文件(如果不留的话广告栏会是
空白的)
5、修改完后保存,然后重新启动迅雷。

二、 去热门推荐
1、打开迅雷的安装目录C:\Program Files\Thunder Network\Thunder\Profiles
2、找到UserConfig.ini文件,然后打开;
3、找到[Splitter_1]项下面的Pane1_Hide,将其值改为1(原始值为0)
4、修改完后保存,然后启动迅雷。

software ,

php中用each() 和 list() 结合使用来遍历数组

May 19th, 2008

each
(PHP 4, PHP 5)
each — 返回数组中当前的键/值对并将数组指针向前移动一步
说明
array each ( array &$array )
返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为 0,1,key 和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
如果内部指针越过了数组的末端,则 each() 返回 FALSE。

例 288. each() 例子

<?php
$foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each($foo);
print_r($bar);
?>

$bar 现在包含有如下的键/值对:

Array
{
[1] => bob
[value] => bob
[0] => 0
[key] => 0
}

<?php
$foo = array("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each($foo);
print_r($bar);
?>

$bar 现在包含有如下的键/值对:

Array
{
[1] => Bob
[value] => Bob
[0] => Robert
[key] => Robert
}

each() 经常和 list() 结合使用来遍历数组,例如:

例 289. 用 each() 遍历数组

<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');
reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>

上例将输出:
a => apple
b => banana
c => cranberry

在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()。

小心
因为将一个数组赋值给另一个数组时会重置原来的数组指针,因此在上边的例子中如果我们在循环内部将 $fruit 赋给了另一个变量的话将会导致无限循环。

PHP&MYSQL , , ,