我有一个包含以下内容的文件。我想搜索字符串“13030115 ...”,即“#”之前的值。但搜索应该向后执行,即从底部到顶部。我怎么能用PHP做到这一点?
1303011581#user: textMsg
1303011582#user: textMsg
1303011583#user: textMsg
1303011584#user: textMsg
1303011585#user: textMsg
1303011586#user: textMsg
答案 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";
}
}
?>
修改强>
在重新阅读您的问题之后,这是另一种应该更快一点的方法:
<?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);
?>
答案 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!';
}?>