星期一, 十一月 27, 2006

Code:简单的服务器端发送http请求

Tag:php,rpc,socket,post

因为手里需要所以简单的写了点点,但没有对后期数据进行处理,也没有加异常处理
先用之,再改进...

$remove_url="http://localhost/worktest/test_server.php";
// Create the client object
$client = new SRPC_Client($remove_url);
$client->debug=true;
// Run a query for PHP
if (!$client->call("http://feed.feedsky.com/fallseir")) {
die('Something went wrong - '.$client->getErrorCode().' : '.$client->getErrorMessage());
}

// Display the result
echo '
';
print_r($client->headers);
print_r($client->contents);
echo '
';

class SRPC_Client{
var $server;
var $port;
var $path;
var $useragent;
var $debug;
var $error;

var $contents;
var $headers;
function SRPC_Client($server, $path = false, $port = 80) {
if (!$path) {
// Assume we have been given a URL instead
$bits = parse_url($server);
$this->server = $bits['host'];
$this->port = isset($bits['port']) ? $bits['port'] : 80;
$this->path = isset($bits['path']) ? $bits['path'] : '/';
// Make absolutely sure we have a path
if (!$this->path) {
$this->path = '/';
}
} else {
$this->server = $server;
$this->path = $path;
$this->port = $port;
}
$this->useragent = 'The simple RPC PHP Library';
}
function Call($content){
$r="\r\n";
$length=strlen($content);
$request = "POST {$this->path} HTTP/1.0$r";
$request .= "Host: {$this->server}$r";
$request .= "Content-Type: text/xml charset=utf-8$r";
$request .= "User-Agent: {$this->useragent}$r";
$request .= "Content-length: {$length}$r$r";
$request .= $content;
// Now send the request
if ($this->debug) {
echo '
'.htmlspecialchars($request)."\n
\n\n";
}
$fp = @fsockopen($this->server, $this->port);
if (!$fp) {
$this->error = array(-32300, 'transport error - could not open socket');
return false;
}
fputs($fp, $request);
$contents = '';
$gotFirstLine = false;
$gettingHeaders = true;
$headers = '';
while (!feof($fp)) {
$line = fgets($fp, 4096);
if (!$gotFirstLine) {
// Check line for '200'
if (strstr($line, '200') === false) {
$this->error = array(-32300, 'transport error - HTTP status code was not 200');
return false;
}
$gotFirstLine = true;
}
if (trim($line) == '') {
$gettingHeaders = false;
}
if (!$gettingHeaders) {
$contents .= trim($line).$r;
}else{
$rawheaders .= trim($line).$r;
}
}
fclose($fp);
if ($this->debug) {
echo '
'.htmlspecialchars($contents)."\n
\n\n";
}

preg_match_all('/(.*?): (.*)\r/', $rawheaders, $matches);
$count = count($matches[1]);
for ( $i = 0; $i < $count; $i++) {
$key = strtolower($matches[1][$i]);
$headers["$key"] = $matches[2][$i];
}
preg_match('/.*([0-9]{3}).*/', $rawheaders, $return);
$headers['response'] = $return[1]; // HTTP response code eg 204, 200, 404
$code = $headers['response'];
/** if ( ('302' == $code || '301' == $code) && isset($headers['location']) ) **/
$this->rawheaders=$rawheaders;
$this->headers=$headers;
$this->contents=$contents;
return true;
}
}

星期五, 十月 27, 2006

摘录:Bash中对变量的操作&特殊字符

Bash中对变量的操作 原文
本文出自:http://www.ytht.org 作者:chenhao (2001-10-29 07:00:00)

1.条件变量替换:
Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换
条件放在{}中.
(1) ${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.
(2) ${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将
word赋值给value
(3) ${value:?message}
若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若
此替换出现在Shell程序中,那么该程序将终止运行)
(4) ${value:+word}
若变量以赋值的话,其值才用word替换,否则不进行任何替换
(5) ${value:offset}
${value:offset:length}
从变量中提取子串,这里offset和length可以是算术表达式.
(6) ${#value}
变量的字符个数
(7) ${value#pattern}
${value##pattern}
去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配
#与##的区别在于一个是最短匹配模式,一个是最长匹配模式.
(8) ${value%pattern}
${value%%pattern}
于(7)类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样
(9) ${value/pattern/string}
${value//pattern/string}
进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区
别与上同

注意:上述条件变量替换中,除(2)外,其余均不影响变量本身的值


2.变量的算术运算
在Bash Shell中,只能进行两个整数间的运算,其结果仍为整数.要进行算术
运算,需要使用let命令,语法为:
let expr
expr是一个包含项和操作符的表达式,项可以是一个变量或是一个整数常数,
当使用整数常数时,其默认为十进制整数,用户可以用radio#number来指定其它
形式的整数,其中radio定义了整数是几进制表示的,number是该整数的值.若
radio>10,那么数字字符可从0-9和A-Z.
在表达式中支持的操作符及其含义为:
+,-,*,/,% 加,减,乘,除,取模
>>,<<,&,^,| 左移,右移,位与,位异或,位或
?: 三元运算符.与C语言中的定义一致
~ 取补码
!,>=,<=,>,<,==,!=,&&,||
=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
表达式式中也可以使用括号.括号或运算优先级的定义与一般计算机语言中的
相同.
let命令具有返回值.当计算结果(若有多个表达式时,以最后一个为准)为0时,
返回值为1,否则为0.
当表达式中含有shell的特殊字符(如|)时,需要用引用符('或")将其引用起来.
使用let时还需要注意的时,对于let x+y这样的式子,shell虽然计算了x+y的值
但却将结果丢弃,若不想这样,可以使用let sum=x+y将x+y的结果保存在变量sum中
另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术
表达式的引用,如果想返回表达式的值,则需用$(())的格式.

Bash中的特殊字符

Bash中的特殊字符 本文出自:http://www.ytht.org 作者:chenhao (2001-10-28 13:05:01)
1.通配符
* 匹配任何长度的任何串
? 匹配单个字符
[...] 匹配单个括号内的字符,[]中的-,!具有特殊含义,如:
$ echo [a-z]*
显示首字母在a-z范围内的文件或目录名
$ echo [a,b]*
显示首字母为a或b的文件或目录名
$ echo [!a]*
显示首字母不为a的文件或目录名(使用!时,!必须是[后的第一个字符)
!还可与-和,一起使用

在Bash 2.0以后的版本中,若用shopt打开了extglob选项(shopt -s extglob),
那么还可以扩展的模式表达式(模式表达式是指那些包含了一个或多个shell通配
符的字):
*(pattern [|pattern] ...) 匹配模式的零次或多次出现
+(pattern [|pattern] ...) 匹配模式的一次或多次出现
@(pattern [|pattern] ...) 匹配模式的一次出现
?(pattern [|pattern] ...) 匹配任何一个模式.与*不同的是它不匹配
多个模式或模式的重复出现
!(pattern [|pattern] ...) 与?类似,不过是不包括指定模式的串
应该注意到,模式表达式的定义是递归的,每个表达式都可以包含一个或多个
模式,而且模式表达式也是可以嵌套的.

2.数据或程序控制使用的特殊字符:
主要有:
< (file) 输出重定向到文件
>> (file) 输出重定向到文件,内容加到已存在的文件尾部
< (file) 输入重定向到文件
; 命令分隔符
| 管道符,把一条命令的输出重定向为另一命令的输入
& 放在命令之后强迫命令在后台执行
`` 命令替换,重定向一条命令的输出为另一命令的参数

3.用于引用和逃逸的特殊字符:
逃逸符\ 表示以后的字符不具有特殊的含义或不是Shell的函数,
除此之外,Bash还可以识别一些C语言中的转义序列,如:
\a 响伶
\b 回退
\e Escape
\n 换行
\r 回车
\t 制表
\v 制表
\\ 反斜线
\nnn 八进制的ASCII编码
\xnnn 十六进制的ASCII编码
但必须以如下方式进行引用:
$'string'
引用符'和" 将特殊字符或由空白分隔的字引用起来组成一个简单字符串
两者区别在与,双引号内的内容可以进行参数和变量替换

怎样通过shell解析文件中的变量
原文
[xyb@linux xyb]$ echo name=xyb > id.txt
[xyb@linux xyb]$ echo age=xx >> id.txt
[xyb@linux xyb]$ eval $(cat id.txt | grep name=)
[xyb@linux xyb]$ eval $(cat id.txt | grep age=)
[xyb@linux xyb]$ echo $name
xyb
[xyb@linux xyb]$ echo $age
xx
[xyb@linux xyb]$

#! /bin/sh
name=`grep -e '^name=' YOURFILE | sed -e 's/^name=//g'`

星期四, 十月 26, 2006

摘录:shell常用指令收集

shell常用指令收集

awk 是一种方便的面向行的文本处理语言。
cat 将指定为参数的文件内容打印到终端。作为管道的第一个命令,这是很方便的,例如,cat foo.txt | blah。
cut 从输入文件或流的每个行上抽取出由字符限定的字段。
expand 将输入制表符转换为空格。使用 -t 选项来指定制表符停止位。
fmt 对段落重新格式化以便在其边缘处进行换行。这个能力被构建到大多数文本编辑器中,但是应知道它仍是一个好工具。
head 打印出文件或流的前十行。使用 -n 选项来指定应显示的行数。
join 与 paste 类似,但它在每个输入行中使用一个字段(缺省情况下是第一个字段)来匹配一在单行上合并的字段。
nl 将行号添加到输入的每个行上。这对于打印输出很有用。
od 将输入流转换为八进制或十六进制的“转储”格式。
paste 获取两个或更多文件作为输入,连接输入文件上的每个后续行,并输出结果行。它对于创建文本的表或列是很有用的。
pr 将文件分解为多个页面的输出;通常用于打印。
sed 是一个功能强大的面向流的文本编辑器。
sort 按字母次序打印在命令行上指定的文件内容。当然,sort 也接受用管道传送的输入。输入 man sort 来熟悉控制排序行为的各种选项。
split 将较大的文件拆分成许多较小、更易处理的块。
csplit 也是拆分文件,和split不同的是,新文件的名字可以用pattern来控制
cat 可以将这些小文件合并为分割前的文件
tac 与 cat 类似,但它以逆向顺序打印所有行,换句话说,先打印最后一行。
tail 打印出文件或流的最后十行。使用 -n 选项来指定应显示的行数。
tee 将它的输入打印到文件和屏幕。当您想创建某些日志记录,但还想在屏幕上看时,这很有用。
tr 是字符转换工具;它用来将输入流中的某些字符映射成输出流中的某些其它字符。
unexpand 将输入空格转换为制表符。使用 -t 选项来指定制表符停止位。
uniq 获取已排序的文件或数据流(通过管道)并除去重复行。
wc 打印出指定文件或输入流(来自管道)中的行、字和字节的数量。输入 man wc 来学习如何精调显示的内容。
cmp -- 判断两个文件内容是否一样。
diff -- 详细输出两个不同文件的差别。
diff3,可以比较三个文件

comm 比较两个排好序的文件
fold 按指定的宽度把文本文件换行
basename 去处前导的目录后的文件或目录名
echo 打印字符串
env 打印环境变量
expr 数学表达式计算
expr 还可以在指定的字符串中查找特定的子串
false 设置返回值为1
true 设置返回值为0
pwd 打印当前目录名
seq 打印指定步进值的数字序列,整数浮点数都可以
sleep 让当前进程休息一会儿
uname 打印一些重要的内核信息
yes 不停打印指定字符串,缺省为y

grep is a very powerful search tool.
find / -name 'linux*' | grep -E 'linux'

echo "" > filename # 创建文件,文件中包含一个空行 echo默认输出一个换行符
echo -n "" >filename # 创建空文件
touch filename # 创建空文件 'touch' changes the timestamp of a file and creates one if it doesn't exist.
cat /dev/null >filename # 创建空文件
> file #创建空文件
cp /dev/null filename #创建空文件



--原文

摘录:在 echo 中控制输出颜色

使用 echo 来向控制台输出指定的颜色

echo -e '\e[44;33;1m colors \e[0m'
在echo输出时使用ESC序列来控制输出的颜色和样式
-e 用来开启echo中的转义
\e 或 \033 来输出Esc符号
设置颜色 \e[4背景色;3前景色;高亮m
Esc[background;foreground;1m
恢复默认 \e[0m
Esc[0m
Foreground colors: 30=black, 31=red, 32=green, 33=yellow, 34=blue 35=purple, 36=turquoise, 37=white
Background colors: 0=transparent, 40=back, 41=red, 42=green, 43=yellow, 44=blue 45=purple, 46=turquoise, 47=white

原文
-- http://www.linuxforum.net/forum/showflat.php?Cat=&Board=vrml&amp;Number=624453&page=0&view=collapsed&sb=5&o=31&fpart=
-- http://www.linuxforum.net/forum/files/345507-colors.txt
如果需要在shell脚本里打印不同颜色的字符,可以使用ESC序列。

echo -e '\e[44;33;1m colors \e[0m'

echo -e表示启用\字符转义;\e即打印ESC控制符;[固定格式;44设置

背景为蓝色;33设置前景为白色;1设置加亮显示;m固定格式;colors

要打印的字符串;\e[0m设回开始的shell环境颜色设置。

连起来就是打印背景蓝色、前景高亮白色的字符串colors。
#! /bin/bash
# show colors (version 2)

FG='30 31 32 33 34 35 36 37'
BG='40 41 42 43 44 45 46 47'

NORMALSTR=' Normal '
BOLDSTR=' Bold '

echo

# Row Title
echo -n " "
for i in $FG ; do
echo -n " ${i} "
done
echo

# Row Title Line
echo -n "== "
for i in $FG ; do
echo -n " ========"
done
echo

# Color Map
for i in $BG ; do
echo -n "${i} "
for j in $FG ; do
echo -ne "\e[${j};${i}m${NORMALSTR}"
done
echo -e '\e[0m'

echo -ne " "
for j in $FG ; do
echo -ne "\e[${j};${i};1m${BOLDSTR}"
done
echo -e '\e[0m'
done

echo

星期日, 十月 22, 2006

转载:Code-flash播放器

Code-flash播放器
转载自穷困潦倒的阿威 http://my.opera.com/shui1220/blog/show.dml/316714

基于Flash的音乐播放器收集

1. Audio Player(官方地址)

名字很直接,就叫音频播放器,呵呵。
2. Dew Player(官方地址)
很漂亮的东东,作者本人就是设计师。
3. Odeo(官方地址)
Odeo本身提供的就是Podcast的服务,这是它们的重要工具之一。另外,你可以不下载这个swf,直接引用该网站上的这个播放器使用。
4. XSPF Web Music Player (官方地址)
这个播放器最大的特点就是支持XSPF格式(有空我会介绍下,Webjay, Yahoo! Music Engine都用它)的音乐播放列表,也就是说,通过它你可以播放多首歌曲。
它还提供多种播放器样式,最小的是Button(播放按钮),其次是Slim(单条),以及Extended(多功能模式)。除了界面一般外,功能上,它算非常的强了,比前面几个都厉害。
5.FMP256 Flash MP3 Player (官方地址)
这个播放器也支持 XSPF格式的播放列表,可以放多首歌。另外,它还有更强大的商业版本,3美元。
6. Easy musicplayer for Flash (EMFF) (官方地址)
非常简洁的作品,出自德国人之手。
7. Mini Mp3 Flash Player(相关链接)
Dew Player很像,但看上去更丑些。
8.爱播播放器(官方地址)
很强大的玩意儿,由爱播网推出。

星期三, 十月 18, 2006

podcasting 展望

podcasting 展望
作者:飞扬轻狂 fallseir.lee (fallseir at gmail.com)
一、什么是podcasting
技术角度认为什么是podcasting
Podcast是为了用户更方便的获取数据,作者更容易的发布数据而产生的。
狭义的说 Podcast 简单的说就是blogger创作的音频列表。
更广一点的说 Podcast 就是经常被更新的专人维护的媒体数据列表(可以包含语音视频图片等格式的数据)。

上图是一幅描述广播、blog和podcast关系的草图
其实应该加上网站和读者,
下面来叙述一下他们的关系,
首先,
听众通过收音机来获取广播的内容
读者通过Feed阅读器来定于作者发布在FEED上的blog内容
podcasting的出现使得听众可以使用Podcast订阅器来订阅作者提供在支持podcast的网站上的音频数据了。
其次,
不论是广播的信息源还是blog之前网站的信息源都是少数人发布的,而由多数人来获取;
podcasting的出现使得人人都可以成为信息发布者。

可以设想,如果我们的任意款mp3可以连接电脑后就方便的获取和筛选我们需要的数据,而这些数据有是分门别类的排列好供我们挑选,如此网络该是多么享受的事情。
podcasting及应用其上的服务就可以为我们营造这个方便的未来,
1、作者将数据提交到网络
2、由扮演再发布者的角色进行筛选整合和归类
3、由网络中的读者和听众进行评论,归类和digg等大众参与的评估
4、最后听众和读者就可以得到他们想要的内容了
这一切都需要podcasting这样的通用格式来将数据流连接起来来保证更有效的发布,更实用的评估,更方便得获取。



下面是摘录的两篇关于podcasting的说明

Podcast,中文译名尚未统一,但最多的是将其翻译为“播客”。它是数字广播技术的一 种,出现初期借助一个叫“iPodder”的软件与一些便携播放器相结合而实现。Podcasting录制的是网络广播或类似的网络声讯节目,网友可将网 上的广播节目下载到自己的iPod、MP3播放器或其它便携式数码声讯播放器中随身收听,不必端坐电脑前,也不必实时收听,享受随时随地的自由。更有意义 的是,你还可以自己制作声音节目,并将其上传到网上与广大网友分享。
就像博客颠覆了被动接受文字信息的方式一样,播客颠覆了被动收听广播的方式,使听众成为主动参与者。有人说,播客可能会像博客(Blog)一样,带来大众传媒的又一场革命。

一.Podcast的推动者Doc Searls给出的定义:
PODcasting,Personal Optional Digital casting。PODcasting是自助广播,是全新的广播形式。收听传统广播时我们是被动收听我们可能想听的节目,而PODcasting则是我们 选择收听的内容、收听的时间以及以何种方式让其他人也有机会收听。 戴维·温纳(Dave Winer)的Morning Coffee Notes:人各有所专,所以理论上人人播客是可能的。

 二.Dave Shusher在其“Podcasting的定义”一文中的定义:

他提出Podcasting必须具备三个要件:

1.必须是一个独立的、可下载的媒体文件;

2.该文件的发布格式为RSS2.0 enclosure feed;

3.接收端能自动接收、下载并将文件转至需要的地方,放置于播放器的节目单中。

  他认为可下载MP3 不是波刻(Podcast)――这是充分但不是必要条件。“能下载固然不错,但能自动出现供你播放而无需你关照才是关键。这才是Podcasting。”

三.Wikipedia的定义:

像WIKI这样的定义是开放、动态的,到2004年12月13日为止,其定义为: Podcasting源于iPod,兼具broadcasting和webcasting 之意。Podcasting 与TiVo相似, 只是Podcasting是用于声讯节目而且目前免费。但是应该注意,该技术能把任何文件“拉”过来,包括软件更新、照片和视频。

摘自:什么是Podcast? http://tech.bokee.com/140/2005-04-14/364318.html
( 作者:郑雅钦 | 2005年04月14日 20:04 | 原始出处: 博客中国)


Podcast是以数字方式存储在网络上的音频广播。传统广播特点是直播的,有一定的时效性、一次性,播完就可能消失,而且只能是“你播啥我听啥”。Podcast就不同了,它更自由:播者自由,听者也自由。做为播客,你可以自己建立个Podcast网站自己做Podcast,播你喜欢的。做为听众,因为可以下载,那么你就可以存下来慢慢听,不喜欢听这段就换下一段,“想听啥就听啥,想啥时听就啥时听”。
摘自:iPodder初级教程 http://blog.terac.com/andy/e_206.html

php中的逻辑输出信息缓存处理

php中的逻辑输出信息缓存处理
tags: php, cache,out
-- fallseir.lee (fallseir at gmail.com) 20061018
doc in google http://docs.google.com/View?docid=dg4t629m_43f75qzq
/* ---- 事例代码 ---- */

/** 将输出缓存到内存 **/
$out_headers[]='<meta http-equiv="refresh" content="3;url='.$return_url.'">';
add_error_cache("您已经登陆,请退出后再进行登录操作!"); # 添加错误消息
add_cache_out("将在3秒后自动跳转到$return_url"); # 添加输出消息
add_cache_out("如果没有自动跳转请单击<a href=\"$return_url\">这里</a>!");
cache_clear() # 清除前边设置的缓存
$out_headers[]='<meta http-equiv="refresh" content="3;url='.$return_url.'">';
add_success_cache("退出成功!"); # 添加成功消息
add_cache_out("将在3秒后自动跳转到$return_url");
add_cache_out("如果没有自动跳转请单击<a href=\"$return_url\">这里</a>!");

/** 将缓存的内容输出 **/
out_cache(); # 输出内建样式的全部缓存信息
join("<br/>",get_error_cache()); # 输出指定的信息
join("<br/>",get_success_cache()); # 输出指定的信息
join("<br/>",get_out_cache()); # 输出指定的信息

/* ---- 页面缓存封装 ---- */
/** 设定输出缓存 **/
if(!is_array($cache_outs)){
$cache_outs=array();
}
if(!is_array($cache_keyouts)){
$cache_keyouts=array();
}
/** 输出缓存信息 **/
function out_cache($br=true,$out_str=false){
$errs=get_error_cache();
$sucs=get_success_cache();
$infos=get_out_cache();
$outstr="";
if(count($errs)>1||(is_array($errs) && $errs[0])){
$outstr.= '<p class="errbox">';
$outstr.= join("<br/>",$errs);
$outstr.= '</p>';
}
if(count($sucs)>1||(is_array($sucs) && $sucs[0])){
$outstr.= '<p class="sucbox">';
$outstr.= join("<br/>",$sucs);
$outstr.= '</p>';
}
if(count($infos)>1||(is_array($infos) && $infos[0])){
$outstr.= '<p class="infobox">';
$outstr.= join("<br/>",$infos);
$outstr.= '</p>';
}
if($br)$outstr=str_replace("\n","<br/>\n",$outstr);
if($out_str){
return $outstr;
}else{
echo $outstr;
return 1;
}
}
/**
* 清除输出缓存
*/
function cache_clear(){
global $cache_outs;
$cache_outs=array();
global $cache_keyouts;
$cache_keyouts=array();
}
/**
* 添加错误信息到缓存
*/
function add_error_cache($msg){
add_cache_out("ERROR",$msg);
}
/**
* 输出缓存的错误消息
*/
function get_error_cache($format="× {out}"){
return get_out_cache("ERROR",$format);
}
/**
* 添加正确信息到缓存
*/
function add_success_cache($msg){
add_cache_out("SUCCESS",$msg);
}
/**
* 输出缓存的正确消息
*/
function get_success_cache($format="√ {out}"){
return get_out_cache("SUCCESS",$format);
}
/**
* 将消息加入输出缓存
* cout($msg);
* cout($key,$msg);
* cout($keys,$msg);
*/
function add_cache_out($msg,$msg2=false){
if($msg2===false){
global $cache_outs;
if(!is_array($cache_outs)){
$cache_outs=array();
}
return add_array_cache($cache_outs,$msg,$msg2);
}else{
$key=$msg;
$msg=$msg2;
global $cache_keyouts;
if(!is_array($cache_keyouts)){
$cache_keyouts=array();
}
return add_array_cache($cache_keyouts,$msg,$key);
}
}
/**
* 输出缓存的消息
*/
function get_out_cache($key=false,$format=false){
print_r($cache_outs);
if($key===false){
global $cache_outs;
$os=$cache_outs;
}else{
global $cache_keyouts;
$os=$cache_keyouts;
}
return get_array_cache($os,$format,$key);
}
/* ---- 底层逻辑封装 ---- */
/** -- 使用数组进行缓存输出 -- **/
/**
* 添加输出信息到缓存数组中,可以使用key进行填充 使用get_array_cache获取添加到缓存数组的输出信息
* add_array_cache($os) 输出空行
* add_array_cache($os,$msg) 输出信息
* add_array_cache($os,$msg,$key:string) 将信息输出到指定的位置
* add_array_cache($os,$msg,$keys:array) 将信息输出的分层的位置
* -- fallseir.lee 20061018
*/
function add_array_cache(&$os,$msg="",$key=false){
if($key===false){
if(!is_array($os)){
$os=array();
}
array_push($os,$msg);
}else if(is_array($key)&&count($key)>0){
if(!is_array($os)){
$os=array();
}
$t=&$os;
for($i=0;$i<count($key);$i++){
if(!array_key_exists($key[$i],$t)){
$t[$key[$i]]=array();
}
$t=&$t[$key[$i]];
}
array_push($t,$msg);
}else{
if(!is_array($os)){
$os=array();
}
if(!array_key_exists($key,$os)){
$os[$key]=array($msg);
}else{
array_push($os[$key],$msg);
}
}
}
/**
* 获取添加到缓存数组的输出信息
* format中可以指定 {out} 和 {key} 的样式
* get_array_cache($os)
* get_array_cache($os,$format)
* get_array_cache($os,$format,$key)
* get_array_cache($os,$format,$key,$pkey)
* -- fallseir.lee 20061018

*/
function get_array_cache($os,$format=false,$key=false,$pkey=false){
if($format===false){
$format="{out}";
}
$ostrs=array();
if($key===false){
if(is_array($os)){
foreach($os as $k=>$v){
if(is_array($v)){
$ostrs=array_merge($ostrs,get_array_cache($v,$format,$key,$pkey!==false?"$pkey:$k":"$k"));
}else{
$t=preg_replace("/{key}/",$pkey,$format);
$ostrs=array_merge($ostrs,preg_replace("/{out}/",$v,$t));
}
}
}else{
$format=preg_replace("/{key}/","",$format);
$ostrs=array_merge($ostrs,preg_replace("/{out}/",$os,$format));
}
}else{
// out $keyouts[$key[0]][$key[1]]...
if(is_array($key)){
for($i=0;$i<count($key);$i++){
if(false===$os=try_get_array_value($os,$key[$i],false)){
return $ostrs;
}
}
$ostrs = get_array_cache($os,$format,null);
}else{
if(false===$os=try_get_array_value($os,$key,false)){
return $ostrs;
}
$ostrs = get_array_cache($os,$format,false);
}
}
return $ostrs;
}
if(!function_exists(try_get_array_value))
/**
* 尝试从数组中获取指定的值
*/
function try_get_array_value($array, $key, $default = null)
{
if($array && is_array($array)){
if( array_key_exists($key, $array) ){
return $array[$key];
}
}
return $default;
}
}
doc in google http://docs.google.com/View?docid=dg4t629m_43f75qzq