PHPでのforeachを使用して配列からデルタを取得します

Karuppiah RK:

私は、JSON APIを使用していくつかの値を表示しようとしています。これは、日付と数字でいくつかの濃度値を返します。首尾よく、私は、URLからのすべての戻り値を印刷しています。今、私は前日密度の値に1つの濃度値との差を見つけたいです。

私は、通常の静的な数の差異を計算する方法を知っています。しかし、私は確かにどのように私は内部でこれを達成んないですforeachループ。

PHPコード:

$json_url = "https://www.example.com/api";

$json = file_get_contents($json_url);
$obj  = json_decode($json,true);
$data = $obj["data"];

foreach(array_slice($data, 0, 10) as $k) {

    echo $k["date"]." - ".$k["density"]."<br/><br/>";

}

電流出力:

14-02-2020 - 110 

13-02-2020 - 114 

2020年12月2日- 112 

2020年11月2日- 110 

2020年10月2日- 105 

2020年7月2日- 125 

2020年6月2日- 122 

05 -02-2020 - 118 

2020年4月2日- 119 

2020年3月2日- 119

予想される出力:

14-02-2020 - 110 -差分は-4前の日から

13-02-2020 - 114 - diffは前の日から+2である

112 - - 2020年12月2日diffが前の日から+2であり、

2020年11月2日- 110 - diffは前の日から+5である

105 - - 2020年10月2日差分は-20前の日から

2020年7月2日- 125 - diffは前の日から+3である

122 - - 2020年6月2日diffがあります前の日から+4 

118 - - 2020年5月2日差分がなく-1前の日から

2020年4月2日- 119 -差異-同じ

2020年3月2日- 119 -差異-同じ
シェリフ:

所望の効果を達成するために、一度に配列2つの要素を反復処理する必要があります。これは簡単に行うことができないforeachあからさま。だからではなく、私は一度という配列の値のリターンのペアを生成器を実装します。

function getPairs(Array $array) {
    reset($array);
    do {
        $a1  = current($array);
        $key = key($array);
        $a2  = next($array);
        yield [$a1, $a2];
    } while($key = key($array) !== null);
}

その後、所望の効果を達成する、配列を横断するこのジェネレータの実装を使用することができます。

$array = [
    ["date" => "14-02-2020", "density" => 110],
    ["date" => "13-02-2020", "density" => 114],
    ["date" => "12-02-2020", "density" => 112],
    ["date" => "11-02-2020", "density" => 110],
    ["date" => "10-02-2020", "density" => 105],
    ["date" => "07-02-2020", "density" => 125],
    ["date" => "12-02-2020", "density" => 112],
    ["date" => "06-02-2020", "density" => 122],
    ["date" => "05-02-2020", "density" => 118],
    ["date" => "04-02-2020", "density" => 119],
    ["date" => "03-02-2020", "density" => 119],
];

foreach(getPairs($array) as [$a, $b]) {
    // We must check if $b is empty to account for end of the array
    if ($b) {
        $diff = $a["density"] - $b["density"];
    } else { // Otherwise there are no more elements to diff against
        $diff = 0;
    }
    if ($diff > 0) {
        $diff = "+$diff";
    }
    echo "{$a['date']} - {$a['density']} - Diff is $diff from Previous Date<br><br>";
}

これはあなたに所望の出力を与える必要があります。

14-02-2020 - 110 -差分は-4前の日から

13-02-2020 - 114 - diffは前の日から+2である

112 - - 2020年12月2日diffが前の日から+2であり、

2020年11月2日- 110 - diffは前の日から+5である

105 - - 2020年10月2日差分は-20前の日から

2020年7月2日- 125 - diffは前の日から+13である

112 - - 2020年12月2日diffがあります-10前の日から

2020年6月2日- 122 - diffは前の日から+4である

118 - - 2020年5月2日差分は-1前の日から

2020年4月2日- 119 - diffが前の日から0 

03 -02-2020 - 119 - diffは前の日から0であります

NB

技術的にはあなたが実際にここでは、現在の日付と前の日付の間の差を取得されていません話します。むしろ、あなたは現在の日付との間の差になっている次の日付を。以前の日付の間の差分を取得した場合は、すべての次の日からの情報を必要としません。代わりに、あなただけの最後に格納する一時的な変数を使用したいdensity各反復でそのに対する値との差分を。しかし、私はあなたの期待される結果に合わせて私の答えを合わせてきました。

そうしないと予想される出力は、実際には次のようになります。

14-02-2020 - 110 - diffが前の日から+110である

114 - - 13-02-2020差分は前日から+4である

112 - - 2020年12月2日差分は-2前の日から

2020年11月2日- 110 -差分は-2前の日から

2020年10月2日- 105 -差分は-5前の日から

2020年7月2日- 125 - diffは前の日から+20である

112 - - 2020年12月2日差分であります-13前の日から

2020年6月2日- 122 - diffは前の日から+10である

118 - - 2020年5月2日差分は-4前の日から

2020年4月2日- 119 - diffが前の日から+1であります

2020年3月2日- 119 - diffは前の日から0であります

そして、あなたは私がすべてで使用ジェネレータの実装を必要としないことを実現しています。あなたは、単に定期的にこれを行うことができますforeachので、同様のループ:

$lastDiff = 0; // Initialize the diff to 0

foreach($array as $a) {
    $date = $a['date'];
    $density = $a['density'];
    $diff = $a["density"] - $lastDiff; // diff against the last known value
    if ($diff > 0) {
        $diff = "+$diff";
    }
    echo "$date - $density - Diff is $diff from Previous Date<br><br>";
    $lastDiff = $a["density"]; // store the last known density here for the next iteration
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=10068&siteId=1