逐行搜索字符串从底部到顶部

时间:2011-04-17 03:43:06

标签: php

我有一个包含以下内容的文件。我想搜索字符串“13030115 ...”,即“#”之前的值。但搜索应该向后执行,即从底部到顶部。我怎么能用PHP做到这一点?

1303011581#user: textMsg
1303011582#user: textMsg
1303011583#user: textMsg
1303011584#user: textMsg
1303011585#user: textMsg
1303011586#user: textMsg

3 个答案:

答案 0 :(得分:2)

<?php

$messages = "1303011581#user: textMsg
1303011582#user: textMsg
1303011583#user: textMsg
1303011584#user: textMsg
1303011585#user: textMsg
1303011586#user: textMsg";

$messages = explode("\n", $messages);

$c_messages = count($messages);

for ($i = 0; $i < $c_messages; $i++) {
    $index = ($c_messages-$i)-1;
    if ($messages[$index] != '') {
        $message = explode("#", $messages[$index]);
        $id = $message[0];
        $text = substr($messages[1], strpos($messages[1],':')+2);
        echo "$id: $text\r";
    }
}

?>

http://codepad.org/x56Sa6qd

修改

在重新阅读您的问题之后,这是另一种应该更快一点的方法:

<?php

$messages = "1303011581#user: textMsg1
1303011582#user: textMsg2
1303011583#user: textMsg3
1303011584#user: textMsg4
1303011585#user: textMsg5
1303011586#user: textMsg6";

function findMessage($id, $messages) {
    if (strpos($messages, $id) === false) {
        return false;
    }
    $message = substr($messages, strpos($messages, $id));
    $message = substr($message, strpos($message, ':')+2);
    $message = substr($message, 0, strpos($message, "\n"));

    return $message;
}

echo findMessage('1303011582', $messages);

?>

http://codepad.org/i3SXT4Rn

答案 1 :(得分:1)

如果您的问题与速度问题有关,那么就不会有令人满意的答案。从底部读取文件并不容易管理。只是“反向”扫描它们并没有太大的成就。

无论如何,一个值得考虑的替代方案可能是使用操作系统而不是PHP函数:

 $found = exec("tac file.txt | egrep '^13030115'");

但是这仍然可以读取整个文件。 (如果你有休息状态,使用管道实际上可能有帮助。)

比foreach循环快一点通常是一个正则表达式。他们可以将文件拆分成行,并且迭代速度比PHP数组/爆炸解决方法更快:

 $text = file_get_contents("messages.txt");
 preg_match_all('/^13030115.*?#.*?$/m', $text, $match);
 print_r($match[0]);

如果您只需要最后几条消息,那么您可以进行有根据的猜测,只读取最后100K * $ x字节:

 $text = file_get_contents("messages.txt", NULL, NULL,
           max(0, filesize("messages.txt")-100000));

使用一些启发式逻辑,您可以将其设为循环,如果从早期行获得结果,则回溯文件读取。

答案 2 :(得分:0)

你可以做的就是将所有内容放入一个数组中:

<?php

$file = '1303011581#user: textMsg
1303011582#user: textMsg
1303011583#user: textMsg
1303011584#user: textMsg
1303011585#user: textMsg
1303011586#user: textMsg';

$fileSplode = explode("\n", $file); // pr whatever the line is split by


$info = array();
foreach($fileSplode as $line){

   list($info[], $temp) = explode('#', $line);

}

//$info contains all the first numbers

//then:
if(in_array('1303011582', $info)){
    echo 'found it!';
}?>

演示:http://codepad.org/d6PTlxtY