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
}