Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中执行foreach循环?_Php_Oop_Zend Framework_Foreach - Fatal编程技术网

如何在php中执行foreach循环?

如何在php中执行foreach循环?,php,oop,zend-framework,foreach,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->n

我有一个具有查询和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;
这里的问题是,如果我返回$object,我会得到2条记录:

Array
(
[0] => stdClass Object
    (
        [from_id] => 6
        [id] => 3
    )

[1] => stdClass Object
    (
        [from_id] => 6
        [id] => 1
    )

)
返回$results有1条记录:

Array
(
    [id] => 1
    [from_id] => 6
)
如果我返回$this->result$此->结果[]=$this->notify$results;运行两次,但使用$results返回的同一记录两次,而不是使用$object中的两条记录

希望你们能理解我的问题

ps:我正在使用zend框架

有什么想法吗

编辑:notify是另一个类中的函数

$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,它将被最后一项填充,而不是每个项。

出现问题的原因是在foreach循环的每次迭代中重新定义$results数组,而不是向其中添加元素

这就是问题所在:

//...
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正确指出的那样,上述答案事实上是错误的。你需要做两件事中的一件:

返回$this->result而不是$results 用处理后的数据填充$results变量,而不是$this->result。 本质上,您需要改变:

return $results;
致:

或者,将循环更改为:

$results = array();
foreach($object as $val){
    $results[] = $this->notify(array('id'=>$val->id, 'from_id'=>$val->from_id));  
}

您想做哪一个取决于您是否确实需要$this->result,即在执行此代码后是否需要将结果保存在对象中。

变量$getResults和$this->result来自何处,以及$this->notify是什么?您希望生成的数组是什么样子的?对不起,您到底在哪里为$getResults赋值?我的错,我说的是$results,请将这个问题排列起来,这是一个有效的问题,如果我们检查一下我的一些键入错误,您的具体问题是什么?您所描述的问题,只是告诉您的代码按照它应该的方式工作。很明显,它不是你所期望的,那么你期望它做什么呢?您想做什么?return$this->result的问题是我得到了两个结果,但它们使用$results的第一个结果,而不是使用数组中的两个结果$结果在数组中有两个结果:0和1。return$this->result将使用0两次-1,结果数组应该在每次传递时通过$this->notify函数,正如您在OP的代码中看到的那样。修正了这一点,我将改变我的投票,公平地说,你是绝对正确的,我已经编辑了我的答案,并且+1了你的答案。没有完全关注整个代码,总是一个错误…返回$this->result的问题;我得到了两个结果,但它们使用$results中的第一个结果,而不是使用数组中的两个结果$结果在数组中有两个结果:0和1。返回$this->result;将使用0twice@Patrioticcow:那么这听起来像是其他地方代码中的一个问题。$this->notify做什么?$this->notify返回一些其他内容
$results = array();
foreach($object as $val){
    $results[] = $this->notify(array('id'=>$val->id, 'from_id'=>$val->from_id));  
}