在生成器函数中使用explode来迭代PHP中的长字符串

时间:2018-05-04 17:50:33

标签: php string iterator generator explode

我正在使用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并且该函数看起来是一个很好的用例来重构使用它,因为爆炸输出的数组很大并且消耗了一些内存。

我想要的是什么:

/**
 * @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

1 个答案:

答案 0 :(得分:2)

从一段文本中提取线条时如何使用生成器的示例。这有一个循环来一个接一个地找到这些行,并使用 @IBAction func recoverPasswordButton(_ sender: Any) { PFUser.requestPasswordResetForEmail(inBackground: emailTextField.text!, block: { (success, error) in if self.emailTextField != nil { self.displayAlert(title: "Check your email", message: "A link has been sent to recover your password. Follow the instructions.") print("A link to recover your password has been sent") } else { var errorText = "Unknown error: please try again" if let error = error { errorText = error.localizedDescription } self.displayAlert(title: "Email is not valid", message: errorText) } }) } 一次传回一个段。

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; } 并将每行输出到foreach

在此代码中$line是要解析的字符串。