0

ページの実行時間に関するベンチマーク データを取得しています。フレームワークによって文字列として提供されます。それを float に変換し、1000 を掛けて、int として DB に格納したいと考えています。本当に奇妙な動作をしているようで、誰かが理由を理解するのを手伝ってくれることを望んでいました. コードは次のとおりです。

    $elapsed = $this->benchmark->elapsed_time();
    var_dump("before:");
    var_dump($elapsed);

    $elapsed = floatval($elapsed);

    var_dump("after:");
    var_dump($elapsed);

結果は次のとおりです。

文字列 'before:' (長さ = 7) 文字列 '0.7608' (長さ = 14) 文字列 'after:' (長さ = 6) float 0

編集:文字列の長さが間違っていると誰かが指摘してくれたおかげで、これを理解しました。メソッドが文字列 '{elapsed_time}' を返しているようです。フレームワークは出力をバッファリングし、その文字列を最終評価時間に置き換えています。助けてくれてありがとう。

4

5 に答える 5

2
$elapsed = ((float)$this->benchmark->elapsed_time()) * 1000;
于 2012-04-20T18:39:38.723 に答える
1
<?php

    $time = '0.5643';
    var_dump( $time );        
    //output  :: string(6) "0.5643"
    var_dump( $time * 1000 ); 
    //output  :: float(564.3)
?>

期待通りのすべて..しかし、あなたはこのような本当に愚かなことをします:

<?php

    $badtime = "\0\0\0\0\0\0\0\0" . $time;
    var_dump( $badtime );        
    //output  :: string(14) "0.5643"

    var_dump($badtime * 1000); 
    //output  :: int(0)

    $goodtime = str_replace("\0", "", $badtime);
    var_dump($goodtime * 1000);
    //output  :: float(564.3)

?>
于 2012-04-20T18:28:24.293 に答える
1

わかりませんが、$elapsed *= 1000;問題ないはずです。

于 2012-04-20T18:28:36.980 に答える
1

<?php var_dump((float)'0.734' * 1000); //float(734) ?>

于 2012-04-20T18:29:58.097 に答える
1

$this->benchmark->elapsed_time() がフロートの前に大量のジャンクを追加している可能性があります。これが、minitech が指摘したように 0.7608 が 14 文字である理由です。

試す:

$elapsed = floatval(trim($elapsed));

また

$elapsed = floatval(preg_replace('/[^0-9\.]/', '', $elapsed));

少し奇妙なものですが、上記が役立つかもしれませんが、確かではありません。

于 2012-04-20T18:44:45.250 に答える