0

私は配列を持っています ($arr):

[0] => Array
    (
        [sv_317] => 1,650
        [sv_318] => 1,254

    )


[1] => Array
    (
        [sv_317] => 1,580
        [sv_318] => 1,580

    )

これらの要素の値を数値として使用しようとしているため、数値以外の文字 (上記の例ではコンマ) を削除する必要があります。

これを行うには、次を使用しています:

foreach($arr as $k=>$v)
    {       
    $v[sv_317] = str_replace(",", "", $v[sv_317]);
    $v[sv_317] = preg_replace('/\s+/', '', $v[sv_317]);
    $v[sv_318] = str_replace(",", "", $v[sv_318]);
    $v[sv_318] = preg_replace('/\s+/', '', $v[sv_318]);

    echo "318 :".$v[sv_318];
    echo "317 :".$v[sv_317];
    }

エコーは、意図したとおりに動作していることをテストするためだけにあり、コンマや空白なしで要素の値を出力するのに十分です。

ただし、これでは要素を数値的に使用できなかったので、配列を print_r($arr); でテストしました。上記のループの直後で、配列要素は影響を受けないように見えました (つまり、まだコンマが含まれています。

ここにスコープの問題はありますか?もしそうなら、どうすればコンマを完全に削除できますか?

どうもありがとう。

4

2 に答える 2

2

$v を変更しようとしているので、次のように参照変数にする必要があります。

foreach($arr as $k => &$v) {       
  $v[sv_318] = str_replace(",", "", $v[sv_318]);
}

...しかし、コードにはさらに修正する必要があります。

  • 最後にすべきunset($v)なので、その後のコードがおかしくなることはありません
  • 配列インデックスは文字列リテラルであるため、引用符で囲む必要があります。
  • 対応がより明確であるため、str_replace() よりも strtr() を好みます。

.

foreach($arr as $k => &$v) {
  $v['sv_318'] = strtr( $v['sv_318'], array(','=>'') );
}; unset($v);

また、$v の任意の数の値を処理するには、別の foreach を使用します。

foreach ($arr as $key => &$subarr) {       
  foreach ($subarr as $subkey => &$val) {       
    $val = strtr( $val, array(','=>'') );
  }; unset($val);
}; unset($subarr);
于 2013-06-24T23:41:05.207 に答える
1

foreach ループは、配列自体では機能しません。配列のコピーで動作します。そのためprint_r($arr)、元の配列が表示されます。実際の配列 $arr は変更されません。

PHP foreachドキュメントから:

ループ内で配列要素を直接変更できるようにするには、$value の前に & を付けます。その場合、値は参照によって割り当てられます。

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>

この SO 投稿をチェックして、foreach が実際にどのように機能するかを理解してください: How does PHP 'foreach' really work?

これがあなたの質問に答えることを願っています:)

于 2013-06-24T23:33:48.147 に答える