我有一个具有查询和foreach循环的函数:
$sql = "SELECT * FROM explore WHERE id = $id";
$object = $this->db->select($sql);
foreach($object as $val){
$results = array('id'=>$val->id, 'from_id'=>$val->from_id);
$this->result[] = $this->notify($results);
}
return $results;
这里的问题是,如果我return $object
我得到2条记录:
Array
(
[0] => stdClass Object
(
[from_id] => 6
[id] => 3
)
[1] => stdClass Object
(
[from_id] => 6
[id] => 1
)
)
和return $results
有1条记录:
Array
(
[id] => 1
[from_id] => 6
)
此外,如果我return $this->result;
,$this->result[] = $this->notify($results);
确实会运行两次,但会使用$results
两次返回的相同记录,而不是使用$object
中的2条记录
希望你们能理解我的问题。
ps:我正在使用zend框架
有什么想法吗?
修改:notify
是另一个类中的函数
答案 0 :(得分:2)
$getResults
未在代码中的任何位置设置,显而易见。看起来您应该返回$this->result
,因为这是存储结果的地方。考虑到你给我们的代码数量,这是我最好的猜测。如果您可以提供更多代码,我可以进一步更新我的答案,如果它不适合您。
根据您的评论,将您的代码更新为:
$sql = "SELECT * FROM explore WHERE id = $id";
$object = $this->db->select($sql);
foreach($object as $val){
$results = array('id'=>$val->id, 'from_id'=>$val->from_id);
$this->result[] = $this->notify($results);
}
return $this->result;
如果您只返回$results
,则会填写最后一项,而不是每件商品。
答案 1 :(得分:2)
您遇到问题的原因是您在$results
循环的每次迭代中重新定义foreach
数组,而不是向其添加元素。
这就是问题所在:
//...
foreach($object as $val){
$results = array('id'=>$val->id, 'from_id'=>$val->from_id);
//... ^ you are reassigning the whole value of $results
请改为:
//...
$results = array();
foreach($object as $val){
$results[] = array('id'=>$val->id, 'from_id'=>$val->from_id);
//... ^^ note the array push instead of complete reassign
正如@Cyclone正确指出的那样,EDIT ,上述答案实际上是错误的。你需要做两件事之一:
$this->result
而不是$results
$results
变量,而不是$this->result
。基本上,您需要更改:
return $results;
为:
return $this->result;
或者,将循环更改为:
$results = array();
foreach($object as $val){
$results[] = $this->notify(array('id'=>$val->id, 'from_id'=>$val->from_id));
}
您要做的是哪一个取决于您是否确实需要$this->result
- 即在执行此代码后是否需要将结果保留在对象中。