如何避免对 MYSQL 数据使用 PHP 生成器来提高性能的嵌套 foreach?
How to avoid nested foreach using PHP generator for MYSQL data to increase perfomance?
我有以下代码
$this->connection->transactional(function () {
$data = $this->connection->executeQuery('SELECT * FROM faq_questions')->fetchAll();
$faqs = $this->connection->executeQuery('SELECT * FROM faq')->fetchAll();
$countries = $this->connection->executeQuery('SELECT * FROM countries')->fetchAll();
foreach ($faqs as $faq) {
foreach ($countries as $country) {
foreach ($data as $datum) {
if ($datum['faq_id'] === $faq['id']) {
$stmt = $this->connection->prepare('INSERT INTO faq_questions ...');
$stmt->execute([...]);
}
}
}
}
});
效果很好。为了节省记忆,我的团队负责人建议我重构这段代码。
如何使用 PHP 生成器避免第三个 foreach?
看来您可以使用连接删除循环。
不清楚您的完整 SQL 语法,但这应该为您指明正确的方向:
$query='
select *
from faq
left join faq_questions faq.id=faq_questions.faq_id
left join countries=faq.countries.id=faq.countries_id
';
$questions=$this->connection->executeQuery($query)->fetchAll();
foreach($questions as $question){
//do insert stuff
}
请注意,这是未经测试的,我不知道您的正确架构,因此您可能需要更改一些内容,但希望这足以提供帮助。
我有以下代码
$this->connection->transactional(function () {
$data = $this->connection->executeQuery('SELECT * FROM faq_questions')->fetchAll();
$faqs = $this->connection->executeQuery('SELECT * FROM faq')->fetchAll();
$countries = $this->connection->executeQuery('SELECT * FROM countries')->fetchAll();
foreach ($faqs as $faq) {
foreach ($countries as $country) {
foreach ($data as $datum) {
if ($datum['faq_id'] === $faq['id']) {
$stmt = $this->connection->prepare('INSERT INTO faq_questions ...');
$stmt->execute([...]);
}
}
}
}
});
效果很好。为了节省记忆,我的团队负责人建议我重构这段代码。 如何使用 PHP 生成器避免第三个 foreach?
看来您可以使用连接删除循环。
不清楚您的完整 SQL 语法,但这应该为您指明正确的方向:
$query='
select *
from faq
left join faq_questions faq.id=faq_questions.faq_id
left join countries=faq.countries.id=faq.countries_id
';
$questions=$this->connection->executeQuery($query)->fetchAll();
foreach($questions as $question){
//do insert stuff
}
请注意,这是未经测试的,我不知道您的正确架构,因此您可能需要更改一些内容,但希望这足以提供帮助。