php вложенный foreach не работает

   //connects to mongo
   $collection  = (new MongoDB\Client)->mfrmls->properties;

   //takes array with data from array of objects            
   foreach ($obj as $k => $v){

    //prints to make sure on the right record.  this works fine
    echo "object {$v['ListingId']} \n";

    // creates a query to the mongo DB, which works fine, i have checked via var_dump
    $cursor = $collection->find(['ListingId'  => $v['ListingId']]);

    //this for each will never print anything it just seems to be skipped.
    //if i take it out of the nested foreach it works fine.
    foreach($cursor as $document) {
            echo "no no \n";
            }
    }

я получаю следующие результаты:

object G4849756 
object A4202291 
object O5548422 
object O5548513 
object D5921405 

в котором явно отсутствует второе эхо цикла for.

просто для справки. «$ cursor» вызывается только после выполнения оператора foreach, я думаю, именно так работает mongoDB - PHP.


person blonc    schedule 11.03.2018    source источник
comment
Попробуйте добавить var_dump($cursor); сразу после его настройки, чтобы узнать, что в нем на самом деле. Я также думаю, возможно (я должен подтвердить) вам может потребоваться преобразовать его из obect в array, прежде чем вы сможете используйте foreach на нем. Не уверен в этом.   -  person UncaAlby    schedule 11.03.2018


Ответы (2)


foreach выполняет итерацию только по массиву. Вы можете проверить, какой тип данных $cursor, используя var_dump($cursor);

person Azhary Arliansyah    schedule 11.03.2018
comment
это объект, MongoDB \ Driver \ Cursor Object ([database] = ›mfrmls [collection] =› properties [query] = ›MongoDB \ Driver \ Query Object - person blonc; 11.03.2018

В вашем коде отсутствуют некоторые проверки. попробуй это:

//connects to mongo
   $collection  = (new MongoDB\Client)->mfrmls->properties;

   //takes array with data from array of objects            
   foreach ($obj as $k => $v){

    //prints to make sure on the right record.  this works fine
    echo "object {$v['ListingId']} \n";

    // creates a query to the mongo DB, which works fine, i have checked via  
    $cursor = $collection->find(['ListingId'  => $v['ListingId']]);
print_r( $cursor);
    //this for each will never print anything it just seems to be skipped.
    //if i take it out of the nested foreach it works fine.
    if((is_array($cursor) || is_object($cursor)) && !empty( $cursor)) {
       foreach($cursor as $document) {
            echo "no no \n";
            }
     }
    }
person flik    schedule 11.03.2018
comment
не должно быть проблем с этим типом объекта. - person blonc; 11.03.2018
comment
повторить что-то в другом состоянии и проверить, поступает ли это в foreach или нет? - person flik; 11.03.2018