我有以下课程的单身人士。我想要实现的是收集对整个应用程序中调用的各种数据库结果数组的引用,然后最终向数据库发出单个请求并获取一些替换值(转换),而不是为每个查询执行此操作。
抛开这种方法的优点和缺点,我不能做的是每次查询时通过引用传递给translate()
方法的“原始”值(数据库结果)的实际替换被发送到数据库服务器。
class Translator {
public $translatableTables = ['content' => ['title', 'body']];
private $table = 'translations';
private $queue = array();
public function translate($table, &$results)
{
if(!isset($this->queue[$table])) {
$this->queue[$table] = array();
}
$this->queue[$table][] =& $results;
}
public function fetchTranslations()
{
foreach($this->queue as &$table) {
foreach($table as &$results) {
foreach($results as &$result) {
$result->content = 'DON\'T PANIC THIS IS A TEST';
}
}
}
var_dump($this->queue);
// dumps just the right data, so I know it's all been collected
}
}
在请求生命周期结束时(但在生成输出之前),我在同一个单例实例上调用fetchTranslations()
方法。
我期望发生的是要用字符串DON'T PANIC THIS IS A TEST
替换的原始值,但这不起作用。
任何想法/想法?
编辑:3个嵌套的foreach
循环可能看起来很糟糕,但这是该方法中实际业务逻辑的简短版本,与问题无关,为了便于阅读而跳过。
编辑:事实证明我应该将每个foreach
值作为参考。这是代码的一个真正问题,但在进行所述更改后,它仍然显示相同的行为(或更准确地说,不显示预期的行为)。
答案 0 :(得分:1)
你的foreach
中的每一个都在复制数组,因为它有多个引用。 Discussion.
您可以&
引用foreach
值,也可以添加密钥,这样最后您就可以$this->queue[$i][$j][$k]->content = 'foo';
答案 1 :(得分:0)
考虑这一行,
public function translate($table, &$results)
评估为对$results
应用的更改应用于传递给该函数的变量。
现在,
if(!isset($this->queue[$table])) {
$this->queue[$table] = array();
}
$this->queue[$table][] =& $results;
现在,没有采取任何措施来改变上述代码中的结果。
现在,请考虑以下内容,
public function fetchTranslations()
{
foreach($this->queue as $table) {
foreach($table as $results) {
foreach($results as &$result) {
$result->content = 'DON\'T PANIC THIS IS A TEST';
}
}
}
}
现在,你通过了反对传递了它,但是$results
毕竟会改变,而不是$this->queue
如果我建议,你需要为该类
再次构建逻辑