开发者社区> 问答> 正文

php 字符串过滤/匹配 和 循环读取文件名的问题?:报错

大家好,有点小问题想问问各位大牛。

1:有道很简单的题目是求两个形式类似{2,6,5,8}这样的集合的交集和并集。现在我想问下,在对输入内容进行验证时 如何验证中间的元素没有出现其他字符?比如{2,*T%&,6}这样?

1.1:    我在php手册里的array_intersect函数里的注释段看到有人发表的一个小函数:

    function my_array_intersect($a,$b)
{
    for($i=0;$i<sizeof($a);$i++)
    {
    $m[]=$a[$i];
    }
    for($i=0;$i<sizeof($b);$i++)
    {
    $m[]=$b[$i];
    }
    sort($m);
    $get=array();
    for($i=0;$i<sizeof($m);$i++)
    {
    if($m[$i]==$m[$i+1])
    $get[]=$m[$i];
    }
    return $get;
    }

但是我发现如果我输入的是{2,6,5,8}然后去掉头尾的{}后 用explode拆分到一个数组里运行此函数进行求交集,那么得到的结果是个空集,这个函数只能对类似{a,b,c}这样的集合使用,这是为什么?

2:有个题目是在一个页面上输入日志,然后点击一个按钮提交后生成名如program201210210101.txt 的一个日志文件,并在页面上显示当前小时的日志内容。

    生成日志文件倒简单,就是"program".date("YmdHi",time()).".txt" 再fopen,fwrite,fclose;

但是显示当前小时内的日志内容让我有点无从下手。

我的思路是:1:有没一个函数,可以循环读取某目录下的所有文件名并存放进一个数组?,

                    2:去掉program与".txt"并与time()-3600比较,小于则读取文件内容存到变量里输出?

    如果这方法可行的话,就是第一步有点问题,(我知道stat里有filectime可以看到文件的上次修改时间,所以能不能遍历文件夹中所有的文件然后用stat得到filectime属性进行比较?)

展开
收起
kun坤 2020-06-06 16:22:35 655 0
1 条回答
写回答
取消 提交回答
  • 生成数组以后可以用array_filter过滤元素

    上面的函数是可以求元素交集的,但有些小问题,改了两个地方:


    function my_array_intersect( $a, $b ) {
    	for ( $i = 0; $i<sizeof( $a ); $i++ ) {
    		$m[] = $a[$i];
    	}
    	for ( $i = 0; $i<sizeof( $b ); $i++ ) {
    		$m[] = $b[$i];
    	}
    	sort( $m );
    	$get = array();
    	for ( $i = 0; $i<sizeof( $m )-1; $i++ ) {
    		if ( $m[$i]==$m[$i+1] ) {
    			$get[] = $m[$i];
    		}
    	}
    	return array_unique($get);
    }
    var_dump(my_array_intersect( array(2,3,3,6), array(3,9,8,2) ));


    glob()函数可以扫描指定目录下的特定类型文件,相当于linux下的find命令和win的文件搜索。scandir()可以列出一个目录下的所有文件,它们都是以数组返回。

    第二个问题,用文件名和ctime时间都可以,看对准确性的要求了,因为构造出文件名到文件写入完成之间有极短的时间间隔,如果文件很大甚至会有若干秒的时间间隔,或者这个文件在写入时遇到了另一个进程的写锁导致写入延迟 ,这些时间很有想象空间。

    ######

    引用来自“朱亚杰”的答案

    生成数组以后可以用array_filter过滤元素

    上面的函数是可以求元素交集的,但有些小问题,改了两个地方:


    function my_array_intersect( $a, $b ) {
    	for ( $i = 0; $i<sizeof( $a ); $i++ ) {
    		$m[] = $a[$i];
    	}
    	for ( $i = 0; $i<sizeof( $b ); $i++ ) {
    		$m[] = $b[$i];
    	}
    	sort( $m );
    	$get = array();
    	for ( $i = 0; $i<sizeof( $m )-1; $i++ ) {
    		if ( $m[$i]==$m[$i+1] ) {
    			$get[] = $m[$i];
    		}
    	}
    	return array_unique($get);
    }
    var_dump(my_array_intersect( array(2,3,3,6), array(3,9,8,2) ));


    glob()函数可以扫描指定目录下的特定类型文件,相当于linux下的find命令和win的文件搜索。scandir()可以列出一个目录下的所有文件,它们都是以数组返回。

    第二个问题,用文件名和ctime时间都可以,看对准确性的要求了,因为构造出文件名到文件写入完成之间有极短的时间间隔,如果文件很大甚至会有若干秒的时间间隔,或者这个文件在写入时遇到了另一个进程的写锁导致写入延迟 ,这些时间很有想象空间。

    非常感谢你的回答!问题解决了。目前先用glob实现了,再考虑ctime时间对比看看。

    现在我有一些可能的想法:整个逻辑是这样:

    1,打开页面后首先从文件目录里读取当前小时内的日志内容并存放到一变量里输出

    2,用户输入日志,生成日志文件后,日志内容同时在一变量里存放。并输出

    这样只有初次打开页面时候才涉及到文件操作,这样速度会不会更快?但是如果日志数量特别大,持续运行时间很长的话,要定时释放变量这样可能靠谱点。

    元芳,你怎么看?


    ######如果要求严格,用ctime不是折腾自己么?有远一点的免费高速,就别抄那坑哇的近道
    2020-06-08 11:21:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载