在生成器函数中使用 explode 迭代 PHP 中的长字符串
Use explode in a generator function to iterate over a long string in PHP
我正在使用 PHP 函数来解析一个很长的字符串(shell_exec 命令的输出)。目前,该功能如下所示并且可以正常工作。
/**
* @param string $result Output of shell command
* @return array $lines each line of output in array
*/
public function getLines($result)
{
$lines = [];
$expl = explode(PHP_EOL, $result);
foreach ($expl as $line) {
$lines[] = $this->funcFormatLine($line);
}
return $lines;
}
现在,我开始使用 generators in PHP 并且该函数看起来是使用它进行重构的一个很好的用例,因为 explode 输出数组很大并且会消耗一些内存。
我想要的:
/**
* @param string $result Output of shell command
* @return string $line one line of output until end_of_line
*/
public function getLines($result)
{
$line = fancy_func_to_get_all_before_end_of_line_without_array(PHP_EOL, $result);
yield $line;
}
//somewhere in the function
foreach (getLines($result) as $line) {
doThings($this->funcFormatLine($line));
}
在第一种情况下,我有两个包含大量信息的数组($expl
和 $lines
),在第二种情况下,我试图使用生成器来避免耗尽这些内存用数组。
我是不是以错误的方式使用了生成器的概念?如果没有,是否可以在不分解字符串然后 yield $expl[$key]
?
的情况下实现它
我尝试使用 substr($string, $pos, strpos($string, PHP_EOL, $pos));
,其中 $pos
是字符串的位置,但我只能使用它调用一次 getLines。
信息:
PHP 5.6
从一段文本中提取行时如何使用生成器的示例。这有一个循环来一个接一个地查找行,并使用 yield
一次一个地传回每个段..
function getLines( $result ) {
$start = 0;
while (($end = strpos($result, PHP_EOL, $start)) !== false) {
$line = trim(substr($result, $start, $end - $start));
yield $line;
$start = $end+1;
}
}
foreach ( getLines($test) as $line) {
echo ">".$line."<".PHP_EOL;
}
如你所见,函数调用的return值用于驱动foreach
并将每一行输出到$line
.
这段代码中$test
是要解析的字符串
我正在使用 PHP 函数来解析一个很长的字符串(shell_exec 命令的输出)。目前,该功能如下所示并且可以正常工作。
/**
* @param string $result Output of shell command
* @return array $lines each line of output in array
*/
public function getLines($result)
{
$lines = [];
$expl = explode(PHP_EOL, $result);
foreach ($expl as $line) {
$lines[] = $this->funcFormatLine($line);
}
return $lines;
}
现在,我开始使用 generators in PHP 并且该函数看起来是使用它进行重构的一个很好的用例,因为 explode 输出数组很大并且会消耗一些内存。
我想要的:
/**
* @param string $result Output of shell command
* @return string $line one line of output until end_of_line
*/
public function getLines($result)
{
$line = fancy_func_to_get_all_before_end_of_line_without_array(PHP_EOL, $result);
yield $line;
}
//somewhere in the function
foreach (getLines($result) as $line) {
doThings($this->funcFormatLine($line));
}
在第一种情况下,我有两个包含大量信息的数组($expl
和 $lines
),在第二种情况下,我试图使用生成器来避免耗尽这些内存用数组。
我是不是以错误的方式使用了生成器的概念?如果没有,是否可以在不分解字符串然后 yield $expl[$key]
?
我尝试使用 substr($string, $pos, strpos($string, PHP_EOL, $pos));
,其中 $pos
是字符串的位置,但我只能使用它调用一次 getLines。
信息:
PHP 5.6
从一段文本中提取行时如何使用生成器的示例。这有一个循环来一个接一个地查找行,并使用 yield
一次一个地传回每个段..
function getLines( $result ) {
$start = 0;
while (($end = strpos($result, PHP_EOL, $start)) !== false) {
$line = trim(substr($result, $start, $end - $start));
yield $line;
$start = $end+1;
}
}
foreach ( getLines($test) as $line) {
echo ">".$line."<".PHP_EOL;
}
如你所见,函数调用的return值用于驱动foreach
并将每一行输出到$line
.
这段代码中$test
是要解析的字符串