2017-02-20 5 views
1

がここでそれを簡単にするために、すべての値のための最後の日付を取得することは、私が持っているものであるPHPのforeachのは

名の1)配列:

array (size=953) 
    0 => string 'name1' (length=5) 
    1 => string 'name2' (length=5) 

2)MongoDBのドライバでカーソルからのforeach:

foreach($cursor as $key => $document) { 

} 

このforeachに私は各nameの最新の日付を取得したいと考えています。 最新の日付から最も古い日付に反復しています.の最新の日付があれば、ループを続行したくありません。

配列にすべての名前の日付が来るまでどのようにループできますか?たくさんのデータがある可能性があるので、私はこのループを私の古い解決策よりも良くしたいと思っています。

多分このような何か?

foreach($cursor as $key => $document) { 
    if (!in_array($document->color->name, $array)) { 
     $position[] = array(
      'name' => $document->color->name, 
      'dateTime' => $document->color->dateTime, 
     ); 
    } 
    $array[] = $document->color->name; 
} 

ソリューション

foreach($cursor as $key => $document) { 
    if(!isset($array[$document->color->name])) { 
     $position[] = array(
      'name' => $document->color->name, 
      'dateTime' => $document->color->dateTime, 
     ); 
    } 
    $array[$document->color->name]=true; 
} 
+2

コードは問題ありませんが、 '$ array [$ document-> color-> name] = true;と' if(!array($ document-> color-> name))) 'bescause in_array()の方が速く、無駄なデリゲートで配列を埋めることはありません。 – JustOnUnderMillions

+0

それは働いているようです、ありがとうございます。私は実際にパフォーマンスの変化を見ることはできませんが、この方法は何千ものデータが良いでしょうか? – Baptiste

+0

phpのキーチェックは高速です(PHPの内部配列のもの)。配列検索では、ルックアップ(すべての値をチェックする前にキャストしているかもしれません)が見つかるまで、すべての値をチェックする必要があります。大きな配列(500.000+)でベンチマークを行うと、あなたが表示されます。 – JustOnUnderMillions

答えて

1

コードは、それがワットであるbescause $array[$document->color->name]=true;

if(!isset($array[$document->color->name]))

を行い、より良い、

罰金ですが、より速く、無駄なdublicatesで配列を埋めることはありません。