请教一个关于“限时回复”的思路

2013-06-07 16:34:46 +08:00
 brando
内容是这样的,我发了一个站内消息给了某人,然后是要限时在24小时内回复,超过24小时,回复的按钮就变成了灰色。
请教这个PHP的编写方式应该如何写?
3900 次点击
所在节点    PHP
20 条回复
raincious
2013-06-07 16:44:06 +08:00
if ($postTime < time() - 3600 * 24) {
$stype='可用色';
} else {
$stype='灰色';
}
raincious
2013-06-07 16:45:32 +08:00
@raincious 啊,错了,真的不能边聊天边写程序,抱歉:

if ($postTime > time() - 3600 * 24) {
$style='可用色';
} else {
$style='灰色';
}
LionXen
2013-06-07 21:24:52 +08:00
判断站内信创建时间啊,如果超过24小时就控制按钮显示了。

顺便求解一个问题,由于新注册无法发帖,问题比较急,所以搭车了。

有两个数组,$a和$b,$a是原始内容,$b是正则匹配规则,我需要匹配出$a里的每个键值对,然后用$b的键组成一个新数组,代码结果如下

$a = array(abc7,cbd4,def9) //待匹配内容

$b = array("r1" => "/abc\d/","b2" => "/cbd\d/, "f5" => "/def\d/") //匹配规则

最后匹配出的结果

$c = array("r1" => "abc","b2" => "cbd","f5" => "def")

求大神解答,语言是PHP
LionXen
2013-06-07 21:25:21 +08:00
@raincious 求大神帮忙解决下我这个问题,谢谢
Sunyanzi
2013-06-07 21:34:04 +08:00
<?php
$a = [ 'abc7', 'cbd4', 'def9' ];
$b = [
'r1' => '/abc\d/',
'r2' => '/cbd\d/',
'r3' => '/def\d/'
];
$c = [];

foreach( $a as $ia )
foreach( $b as $ik => $ib )
if ( preg_match( $ib, $ia, $ic ) ) $c[$ik] = $ic[0];

print_r( $c );


@LionXen 既然看到了就顺手写一下 ... 两次循环而已有什么难点么 ..?
LionXen
2013-06-07 21:46:24 +08:00
@Sunyanzi 已跪,我是兴趣学php,对循环一类的一直都比较恼火,谢谢您的解答,可以使用
raincious
2013-06-07 21:56:27 +08:00
@Sunyanzi

$b = [
'r1' => '/abc\d/',
'r2' => '/cbd\d/',
'r3' => '/def\d/'
];

我测试了@LionXen的正则表达式,发现不能匹配。修改成这样才能匹配:

$b = array('r1' => '/abc/', 'b2' => '/cbd/', 'f5' => '/def/');

测试代码:

<?php

$a = array('abc7', 'cbd4', 'def9');

$b = array('r1' => '/abc/', 'b2' => '/cbd/', 'f5' => '/def/');

$result = array(); // Store the result

$iloop = 0; // Use to match corresponding element key in $a;

$matches = array();

foreach($b AS $key => $preg) {
if (preg_match($preg, $a[$iloop++], $matches)) {
$result[$key] = $matches[0];
}
}

print_r($result);

?>
lizheming
2013-06-07 22:02:33 +08:00
@Sunyanzi 又见Sunyanzi大大~_~
LionXen
2013-06-07 22:04:37 +08:00
@raincious 感谢,这个正则只是例子,非常感谢^_^
Sunyanzi
2013-06-07 22:11:20 +08:00
@raincious 你的这种写法 ... 怎么说呢 ... 我改变一下 $a 的顺序不就挂了 ...

以及 ... 正则没有任何问题 ..?

<?php
preg_match( '/abc\d/', 'abc2222', $foo );
echo $foo[0];

上面这段程序你无法得到 abc2 这个结果么 ..?
raincious
2013-06-07 22:20:35 +08:00
@Sunyanzi 那个只是测试代码。因为我在调试楼主的问题时发现没法匹配得到楼主的结果。

然后拿你的例子代码算了下,结果是Array ( [r1] => abc7 [r2] => cbd4 [r3] => def9 )。就是说问题主正则里的\d基本没用。

所以我就太奇怪了,于是才发了提问。preg_match( '/abc\d/', 'abc2222', $foo ); 的结果是abc2没错。

现在的问题是,为什么问题主的正则里\d会没用?难道是我版本的问题?PHP 5.4.3。
raincious
2013-06-07 22:22:07 +08:00
@LionXen 额,原来如此。怪我没看题。
Sunyanzi
2013-06-07 22:26:45 +08:00
@raincious 我我 ... 我又一头雾水没明白了我 ... \d 怎么会没用 ..?

abc2222 如果没有 \d 就只能匹配到 abc ... 只有有了 \d 才能匹配到 abc2 ...

至于 @LionXen 描述的写法 ... 如果不改变他的正则的确无法得到没有 \d 的结果 ...

但你可以发现他在原字符串的两边也没有加引号 ...

所以我想 ... 那大概只是一个随手写的例子 ... 也许他在写那个问题的时候漏了吧 ..?
raincious
2013-06-07 22:31:49 +08:00
@Sunyanzi 嗯,确实是例子,我现在满脸黑线的看着问题主。

我先看了他的$a和$b,然后看了他的结果。然后跟你一样写了两个循环,然后。。死活不能匹配,然后拆了循环一个个匹配,还是不行,然后刷新了页面,看到了你的帖子,代码原样贴上去,结果也跟楼主的结果不一样。

然后我就猛然发现了个\d,删掉了,就正常得到结果了。然后我就把结果贴上来了。

我决定洗洗睡了。
brando
2013-06-08 00:05:43 +08:00
非常感謝@raincious
LionXen
2013-06-08 00:06:01 +08:00
@raincious 哈哈,其实我问这个问题重点是怎么循环重组到一个新数组,我想把原来的规则搬过来,但是太长了不利于描述问题,于是随便写了个 哈哈
PrideChung
2013-06-08 00:31:59 +08:00
你应该在收到回信的HTTP请求的时候再去判断时间,而不是单纯的在输出页面的时候把按钮灰掉,要是打开回复页面的时候还没超过24小时,然后那个页面就挂着半天不动了,过了24小时后再回复怎么办。
brando
2013-06-08 08:11:06 +08:00
谢谢@PrideChung 关于http的请求其实已经做了,因为当时考虑到要知道点击链接之后,判断是否已阅读,所以在点击的时候已经触发了http的请求了,并且会更新数据库。(嘻嘻,当然我自己不是什么程序员,真的要考虑很周到是不太可能滴...)
最后感谢V2ex的回复者和查看的朋友们。
buru
2013-06-08 13:43:45 +08:00
@LionXen
@Livid
新注册用户多久可以发贴呢?
Livid
2013-06-08 13:58:48 +08:00
@buru 在 V2EX,新用户需要等待 3600 秒(一小时)才可以发帖。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/71610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX