2011-12-27 39 views
-1

我有一個具有查詢和foreach循環功能:如何在PHP中做一個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);確實運行兩次但使用相同的記錄t由$results而不是使用$object的012記錄

希望你們能理解我的問題。

ps:我正在使用zend框架

任何想法?

編輯notify是另一個類

+0

變量'$ getResults'和'$ this-> result'來自哪裏?什麼是$ this-> notify'?你想讓結果數組看起來像什麼? –

+3

對不起,您在哪裏爲'$ getResults'賦值? – DaveRandom

+0

我的不好,我在說'$ results',請排列這個問題,這是一個有效的問題,如果我們看看我的一些輸入錯誤 – Patrioticcow

回答

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,它會被填充的最後一個項目,不是每一個項目。

+0

'return $ this-> result;'是我得到2個結果,但它們使用'$ results'的第一個結果不是使用數組中的兩個結果。 '$ results'在數組中有2個結果,0和1.'return $ this-> result;'將使用0兩次 – Patrioticcow

+0

@Patrioticcow:那麼這聽起來像是代碼中其他地方的問題。 '$ this-> notify'做什麼? – Cyclone

+0

'$ this-> notify'返回一些其他內容 – Patrioticcow

2

您遇到問題的原因是您在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; 

到:

return $this->result; 

或者,改變循環,以這樣的:

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

你要哪一個做取決於你是否真的需要$this->result - 即不管你在代碼執行後需要將結果保留在對象中。

+0

-1,結果數組應該在每次傳遞時通過'$ this-> notify'函數進行推送,正如您在OP代碼中所看到的。解決這個問題,我會相當改變我的投票。 – Cyclone

+0

@Cyclone你是絕對正確的,我已經編輯了我的答案,並對你的答案進行了修正。沒有完全關注整個代碼,總是出錯... – DaveRandom