Как сделать цикл foreach в PHP? - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть функция, которая имеет запрос и цикл 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
)

Также, если I return $this->result;, $this->result[] = $this->notify($results); выполняется дважды, но использует одну и ту же запись дважды, возвращаемую $results вместо использования 2 записей из $object

Надеюсь, вы, ребята, можете понять мою проблему.

PS: я использую Zend Framework

Есть идеи?

Редактировать : notify - функция из другого класса

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Причиной возникновения проблемы является то, что вы переопределяете массив $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, приведенный выше ответ на самом деле неверен. Вам нужно сделать одну из двух вещей:

  • возвращает $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 - т.е. нужно ли сохранять результаты в объекте после выполнения этого кода.

2 голосов
/ 28 декабря 2011

$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, он будет заполнен последним, а не каждым элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...