php 函数迭代,在PHP中迭代字符串中的每一行

在PHP中迭代字符串中的每一行

我有一个表单,允许用户上传文本文件或将文件的内容复制/粘贴到textarea。 我可以很容易地区分这两者,并将他们输入的任何一个放入一个字符串变量,但是我从那里去哪里?

我需要遍历字符串的每一行(最好不要担心不同机器上的换行符),确保它只有一个令牌(没有空格,制表符,逗号等),清理数据,然后生成SQL查询 基于所有线条。

我是一个相当优秀的程序员,所以我知道如何做到的一般想法,但是我用PHP工作已经很久了,我觉得我在寻找错误的东西,从而得出无用的信息。 我遇到的关键问题是我想逐行读取字符串的内容。 如果它是一个文件,那将很容易。

我主要寻找有用的PHP函数,而不是如何做到的算法。 有什么建议?

Topher Fangio asked 2019-07-11T23:21:05Z

7个解决方案

163 votes

preg_split包含文本的变量,并迭代返回的数组:

foreach(preg_split("/((\r?\n)|(\r\n?))/", $subject) as $line){

// do stuff with $line

}

Kyril answered 2019-07-11T23:21:18Z

134 votes

我想提出一个明显更快(和内存效率)的替代方案:$separator而不是"\r\n"。

$separator = "\r\n";

$line = strtok($subject, $separator);

while ($line !== false) {

# do something with $line

$line = strtok( $separator );

}

测试性能,我在17000行测试文件上迭代100次:$separator需要27.7秒,而"\r\n"需要1.4秒。

请注意,尽管$separator定义为"\r\n",但strtok将在任一字符上分开 - 从PHP4.1.0开始,跳过空行/标记。

请参阅strtok手册条目:[http://php.net/strtok]

Erwin Wessels answered 2019-07-11T23:22:04Z

91 votes

如果你需要处理不同系统中的换行符,你可以简单地使用PHP预定义常量PHP_EOL([http://php.net/manual/en/reserved.constants.php]]并简单地使用explode来避免常规开销 表达引擎。

$lines = explode(PHP_EOL, $subject);

FerCa answered 2019-07-11T23:22:29Z

17 votes

这是过于复杂和丑陋,但在我看来这是要走的路:

$fp = fopen("php://memory", 'r+');

fputs($fp, $data);

rewind($fp);

while($line = fgets($fp)){

// deal with $line

}

fclose($fp);

pguardiario answered 2019-07-11T23:22:53Z

4 votes

foreach(preg_split('~[\r\n]+~', $text) as $line){

if(empty($line) or ctype_space($line)) continue; // skip only spaces

// if(!strlen($line = trim($line))) continue; // or trim by force and skip empty

// $line is trimmed and nice here so use it

}

^这是你如何正确打破线,跨平台兼容Regexp :)

CodeAngry answered 2019-07-11T23:23:18Z

4 votes

考虑到你需要能够在不同的机器上处理换行,Kyril的答案是最好的。

“我主要是在寻找有用的PHP函数,而不是如何使用算法   去做吧。 有什么建议?”

我经常使用这些:

在给定a的情况下,explode()可用于将字符串拆分为数组单一分隔符。

implode()是爆炸的对应物,从数组返回到字符串。

Joe Kiley answered 2019-07-11T23:24:09Z

3 votes

file的潜在内存问题:

由于其中一个建议的解决方案使用file,遗憾的是它没有指出潜在的内存问题(尽管它声称内存有效)。 根据手册使用strtok时,:

请注意,只有第一次调用strtok才会使用字符串参数。   每次对strtok的后续调用都只需要使用令牌,因为它   跟踪当前字符串中的位置。

它通过将文件加载到内存中来完成此操作。 如果您正在使用大文件,则需要在循环浏览文件时对其进行刷新。

function process($str) {

$line = strtok($str, PHP_EOL);

/*do something with the first line here...*/

while ($line !== FALSE) {

// get the next line

$line = strtok(PHP_EOL);

/*do something with the rest of the lines here...*/

}

//the bit that frees up memory

strtok('', '');

}

如果您只关心物理文件(例如数据挖掘):

根据手册,对于文件上传部分,您可以使用file命令:

//Create the array

$lines = file( $some_file );

foreach ( $lines as $line ) {

//do something here.

}

AbsoluteƵERØ answered 2019-07-11T23:25:08Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值