PHPでの配列代入の混乱を解決する

WBOY
リリース: 2016-06-23 13:30:37
オリジナル
928 人が閲覧しました

本当に頭がおかしいです...
一般的な考え方は次のとおりです:
うわー
専門家の方、まず上記のコードを見てください。これは問題ないはずです。質問がある場合は、指摘してください。同時に、以下の長いリストを見る必要はありません...
中心となるのは、2 つの配列を結合することです (他の実装方法)。現時点では説明しません。最初にこれを使用してください) )、小数点以下 4 桁を保持してください

上記のコードに問題がない場合は、以下のデバッグを参照してください。
--------------------------デバッグ---------------------- ---
実際に操作してみると、fv フィールドに小数点以下の桁が多く残っていることがわかり、要するに丸め操作が行われていないことがわかりました。
コードでは PR (print_r) が見えました。データを確認したところ、更新の foreach 後はまだ正常ですが、月次サイクルに入ると異常になります
コンパイルされたデバッグ コードは次のとおりです:

$update=['f1'=>121.231,'f2'=>2312.12,     'f3'=>31.1231,'f4'=>213.12,'fv'=>3189.21321];$month=['m1'=>123.1289,'m2'=>123.23198,      'm3'=>23.21,'m4'=>138.21,'mv'=>1231.81];		foreach($update as &$v){			$v=round($v,4);		}		foreach($month as $k=>$v){			$update[$k]=round($v,4);		}
ログイン後にコピー


サポートされるデバッグ結果は次のとおりです:
		if($debug_flag){			echo('原始数据');BR();			PR($update);		}		foreach($update as $k=>&$v){			$v=round($v,4);		}		//实在没有整明白为什么update的最后一个fv不进行四舍五入呢?		if($debug_flag){			echo('update foreach 循环后数据');BR();			PR($update);			echo('进入month循环');BR();			echo('month原始数据');BR();			PR($month);		}		foreach($month as $k=>$v){			if($debug_flag){				echo('in month ');BR();				PR($update);				PR($k);BR();			}			$update[$k]=round($v,4);			if($debug_flag){				PR($update);				echo('month 循环中数据');BR();			}		}		if($debug_flag){			echo('month循环后数据');BR();			PR($update);			PR($month);			die();		}
ログイン後にコピー


忍耐強く読めばわかるでしょう 月サイクルに入った後、データはすでにランダムに変更され始めています...
foreach または $array[$key]=$value について不明な点はありますか?配列は?
助けを求めています!


ディスカッションに返信 (解決策)

ここでデバッグした後にコードを変更しました

原始数据Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 600.85900353103)update foreach 循环后数据Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 600.859)进入month循环month原始数据Array(    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325    [m4] => 602.0825    [mv] => 600.85900353103)in monthArray(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 0)m0Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 0    [m0] => 0)month 循环中数据in monthArray(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 596.4    [m0] => 0)m1Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 596.4    [m0] => 0    [m1] => 596.4)month 循环中数据in monthArray(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 604.5    [m0] => 0    [m1] => 596.4)m2Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 604.5    [m0] => 0    [m1] => 596.4    [m2] => 604.5)month 循环中数据in monthArray(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 600.3325    [m0] => 0    [m1] => 596.4    [m2] => 604.5)m3Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 600.3325    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325)month 循环中数据in monthArray(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 602.0825    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325)m4Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 602.0825    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325    [m4] => 602.0825)month 循环中数据in monthArray(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 600.85900353103    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325    [m4] => 602.0825)mvArray(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 600.85900353103    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325    [m4] => 602.0825    [mv] => 600.859)month 循环中数据month循环后数据Array(    [f1] => 596.4    [f2] => 604.5    [f3] => 600.3325    [f4] => 602.0825    [fv] => 600.85900353103    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325    [m4] => 602.0825    [mv] => 600.859)Array(    [m0] => 0    [m1] => 596.4    [m2] => 604.5    [m3] => 600.3325    [m4] => 602.0825    [mv] => 600.85900353103)
ログイン後にコピー

このデータは正常であり、より短く、明確で、エラーがありません。
しかし、元のコードのどこが間違っているのでしょうか?

		$update=array_merge($update,$month,$year);		foreach($update as &$v){			$v=round($v,4);		}
ログイン後にコピー
$update = array (  'f1' => 596.4,  'f2' => 604.5,  'f3' => 600.3325,  'f4' => 602.0825,  'fv' => 600.85900353103,);$month = array (  'm0' => 0,  'm1' => 596.4,  'm2' => 604.5,  'm3' => 600.3325,  'm4' => 602.0825,  'mv' => 600.85900353103,);foreach($update as $k=>&$v){    $v = round($v, 4);}unset($v);foreach($month as $k=>$v){    $update[$k] = round($v, 4);}print_r($update);
ログイン後にコピー
違いがわかりますか?追加の unset($v); を使用しました
実際、これは、テストした 2 つのデータセットがまったく同じであることが原因です。 $month['mv'] を 0 に変更すると、すぐにわかります。問題です。

違いがわかりますか?追加の unset($v); を使用しました
実際、これは、テストした 2 つのデータセットがまったく同じであることが原因です。 $month['mv'] を 0 に変更すると、すぐにわかります。問題です


そうそう…今回は引用するのを忘れてしまいました… & はほとんど使いませんが、たまに使うと間違いないです…
ありがとうございます!
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート