如何在PHP中进行foreach循环?

时间:2011-12-27 21:19:09

标签: php oop zend-framework foreach

我有一个具有查询和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是另一个类中的函数

2 个答案:

答案 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 - 即在执行此代码后是否需要将结果保留在对象中。