0

私は最近、配列の値をphpの配列の配列にマージすることについて質問し、正しい答えを得ました。どのように問題が発生したか、配置したvarダンプまたはエコーに関係なく理解できないものです。

同じ配列の例と、私がそうする場合に提供される解決策を使用します。

$result = array();
if(is_array($ticketLabors) && !empty($ticketLabors)){
    foreach ($ticketLabors as $innerArray) {
        foreach ($innerArray as $key=>$value) {
            $result[$key] = number_format($result[$key] + $value, 2);
        }
    }
}
var_dump($result);

次のような配列で:

array(2) {
  [0]=>
  array(10) {
    ["ticket_labor_ot_travel_c"]=>
    string(5) "34.50"
    ["ticket_labor_travel_c"]=>
    string(5) "23.00"
    ["ticket_labor_ot_c"]=>
    string(5) "34.50"
    ["ticket_labor_reg_c"]=>
    string(5) "23.00"
    ["ticket_labor_user_id"]=>
    string(3) "319"
    ["ticket_labor_tot_hours"]=>
    string(4) "0.50"
    ["ticket_labor_reg_hours"]=>
    string(4) "0.50"
    ["ticket_labor_ot_hours"]=>
    string(4) "0.00"
    ["ticket_labor_travel_hours"]=>
    string(4) "0.00"
    ["ticket_labor_ot_travel_hours"]=>
    string(4) "0.00"
  }
  [1]=>
  array(10) {
    ["ticket_labor_ot_travel_c"]=>
    string(4) "0.00"
    ["ticket_labor_travel_c"]=>
    string(4) "0.00"
    ["ticket_labor_ot_c"]=>
    string(4) "0.00"
    ["ticket_labor_reg_c"]=>
    string(4) "0.00"
    ["ticket_labor_user_id"]=>
    string(1) "0"
    ["ticket_labor_tot_hours"]=>
    string(4) "0.00"
    ["ticket_labor_reg_hours"]=>
    string(4) "0.00"
    ["ticket_labor_ot_hours"]=>
    string(4) "0.00"
    ["ticket_labor_travel_hours"]=>
    string(4) "0.00"
    ["ticket_labor_ot_travel_hours"]=>
    string(4) "0.00"
  }
}

(前の質問と同じように、上記の配列には 70 個の配列が含まれている可能性があることに注意してください)

私は次のようなものを返します:

array(10) {
  ["ticket_labor_ot_travel_c"]=>
  string(5) "0.00"
  ["ticket_labor_travel_c"]=>
  string(5) "0.00"
  ["ticket_labor_ot_c"]=>
  string(5) "0.00"
  ["ticket_labor_reg_c"]=>
  string(5) "0.00"
  ["ticket_labor_user_id"]=>
  string(5) "0.00"
  ["ticket_labor_tot_hours"]=>
  string(4) "0.00"
  ["ticket_labor_reg_hours"]=>
  string(4) "0.00"
  ["ticket_labor_ot_hours"]=>
  string(4) "0.00"
  ["ticket_labor_travel_hours"]=>
  string(4) "0.00"
  ["ticket_labor_ot_travel_hours"]=>
  string(4) "0.00"
}

前の配列の配列のすべての配列が圧縮され、それら$key=>$valueの が一緒に追加された 1 つの配列。

問題は何ですか?私がどこにいてvar_dumpも、echo$key$value$innerArray

私は最終的に次のような通知を大量に受け取ります。

注意: 未定義のインデックス: C:\xampp\htdocs\rms\site\web\module\Report\controller\Index.controller.phpの146 行目の ticket_labor_ot_travel_hours

各通知は、のキーごとに異なります$innerArrayif(isset($key) && isset($value)){ ... }だから私はいいえ、同じ問題をやろうと思った。

私は外側の配列をチェックし、入ってくるものが私が望むものであり、すべてのキーが設定されていることを保証できます.

146行目が何であるか疑問に思っている場合:$result[$key] = number_format($result[$key] + $value, 2);

何か助けはありますか?

4

4 に答える 4

0

エラーが発生している行を次のように置き換えてみてください。

$result[$key] = isset($result[$key]) ? $result[$key] + $value : 0;

その時点で数値形式にしたくないのは、1000 になると、 , のために 1,000 + 1 を追加できないためです。

number_format 関数の end パラメーターを設定して千単位の区切り文字を使用しないようにすることはできますが、複雑さが増し始め、パフォーマンスが低下するという点では事実です (なぜなら、関数の出力を適切に使用していないときにメソッドを繰り返し呼び出すからです)。最後の反復での関数への最後の呼び出しまで、コードのその時点で必要ないのに、なぜ複雑さが増すのですか?)。

たとえば、エンドユーザーに表示するときなど、最後に数値をフォーマットする必要があります。計算中に小数点以下 2 桁までの精度を維持したい場合。代わりに使用しても問題ありませんround($result[$key] + $value, 2)

于 2013-11-06T20:15:57.013 に答える
0

まず、未定義のインデックスの問題を修正するには、その行の上にチェックを追加します。

if(!array_key_exists($key, $result))
    $result[$key] = 0;

第二に、配列が圧縮されている理由は、2 レベルの深さでループしていて、$results配列が 1 深さしかないためです。反復ごとに値を合計し、最後に出力したいと思います...次のようにします:

$result[$key] += $value;

number_formatデータを出力するときに関数を配置します。

于 2013-11-06T20:13:05.360 に答える
0

$result[$key]これは、初期化されていないときに、読み取りのために初めてアクセスしたときに発生します。初期化されていない場合にチェックを追加する必要があることを修正するには、0 に置き換えます。

$result[$key] = number_format((array_key_exists($key, $result)?$result[$key]:0) + $value, 2);

issetとの違いarray_key_exists:

$a = array('key1' => 'フーバー', 'key2' => null);

isset($a['key1']);             // true
array_key_exists('key1', $a);  // true

isset($a['key2']);             // false
array_key_exists('key2', $a);  // true

から取得: isset と array_key_exists の違い

于 2013-11-06T20:13:15.177 に答える