tl; dr DateTimeプロパティを含む1000個のオブジェクトの配列を反復処理し、このプロパティをダンプすると、1000個の有効なDateTimeオブジェクトが返されます。後続のダンプ行に->format
を追加すると、終了は最初の要素で直ちに停止します。 format()
コールをダンプ文の外に追加すると、1000番目の要素での終了のみが停止します。デバッグ中に異常な動作が発生しました。ブール値
:メンバ関数形式に
コール()ブール
に通常、これは簡単に修正だろうしかし、私はデバッグ中にいくつかの奇妙な動作に遭遇しました。
private function filterDuplicates(array $data) {
$duplicateMap = [];
foreach($data as $index => $item) {
// dump here, see below
$hashKey = md5($item->getBracelet()->getId() . $item->getTimestamp()->format('d/m/y H:i'));
if (isset($duplicateMap[$hashKey])) {
unset($data[$index]);
unset($data[$duplicateMap[$hashKey]]);
} else {
$duplicateMap[$hashKey] = $index;
}
}
return $data;
}
このコードでは、現在、$ hashkey変数を設定しようとしているところで、フォーマットエラーが発生しています。どうやら、$ itemオブジェクトの1つに無効なDateTimeが含まれていると思いました。
dump($item->getTimeStamp());
を追加すると、正確に1000の正しいDateTimeオブジェクトが取得され、その後に同じformat()エラーが発生します。当初は、配列の最新のオブジェクトでエラーが発生したと考えました。
しかし、私の配列には正確に1000個のオブジェクトしか含まれていません。dump(count($data));
を使ってテストしました。
奇数しかし、大丈夫。私はそのようなものとして私のダンプを書き換えた:dump($item->getTimestamp() instanceof \DateTime)
。これは1000回true
を印刷しました。すべてが動作するはずです。
今、変な部分です。
dump($index);
dump($item->getTimestamp()->format('d/m/y H:i'));
$hashKey = md5($item->getBracelet()->getId() . $item->getTimestamp()->format('d/m/y H:i'));
私が得た:これにすることを変る時には、しかし
...
996
997
998
999
PHP Fatal error: Call to a member function format() on boolean in /Users/svenhoskens/Documents/web_projects/Tomorrowland_api/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php on line 53
:
私は今、これまでの私のダンプを変更:
dump($index);
$hashKey = md5($item->getBracelet()->getId() . $item->getTimestamp()->format('d/m/y H:i'));
そして、この出力を受けこの奇妙な出力:
0
PHP Fatal error: Call to a member function format() on boolean in /Users/svenhoskens/Documents/web_projects/Tomorrowland_api/src/AdminPanelBundle/Command/ProcessDatafileCommand.php on line 374
ご覧のとおり、1000個のオブジェクトをループして最後にエラーを投げるのではなく、私のダンプの直後に非常に同じフォーマットコールが続いていても、エラーが発生します。
私はここで何が欠けていますか?このような行動を引き起こす原因は何ですか?
$ item-> getTimestamp()は何をしますか?場合によってはブール値を返すように見えるので、問題が存在する可能性があります。 – colburton
DateTimeを返す、私のEntityのシンプルなゲッターです。戻り値の型をダンプすると、1000件ごとにDateTimeが返されます。しかし、このループは、私の質問の一番下に記載されているように、その下の行に - >フォーマットコールを追加するとすぐに停止するようです。 –
'getTimestamp()'呼び出しを省略し、ハードコードされた日付時刻のリストでこれを試してみたらどうでしょう? – vrwim