2010-11-29 11 views
4

での$ varで/除算配列の値を乗算しますほとんどのまともな方法は、型の配列を持つPHP

$arr = array(23,4,13,50,231,532,3); 

$factor = 0.4; 

は私が$factorで割っ$arrのすべての値が乗算され、新しい配列を/生成する必要があります。私はforeachメソッドを知っています。ちょっと考えて、もっとエレガントなアプローチが必要です。

答えて

11

PHP 5.3、高:

the docsとして
$arr_mod = array_map( 
    function($val, $factor) { return $val * $factor; }, 
    $arr, 
    array_fill(0, count($arr), 0.4) 
); 

は言う:

$arr = array(23,4,13,50,231,532,3); 

$arr_mod = array_map(function($val) { return $val * 0.4; }, $arr); 

が行う、動的要因に渡すパラメータの

番号にコールバック関数acceptは、array_map()に渡される配列の数と一致する必要があります。

この単純な例ではあまり意味がありませんが、ハードコーディングされた値を使わずに別の場所でコールバックを独自に定義することができます。

コールバックは、引数としてarray_map()に渡す各配列から対応する値を受け取ります。したがって、$arrのすべての値に異なる係数を適用することも考えられます。

+0

'array_fill()'でうまくいっています。ありがとう – Zlatev

+0

訂正:これは、php5以上ではなく、php5.3以上でなければなりません。匿名関数はPHP 5.3ではなく5で追加されました。 – Dmitri

+0

@Dmitri:はい、私は自分自身に気づきました。既に修正済みです。 – Tomalak

5

あなたは、各配列要素に(掛け算をする)コールバック関数を適用するarray_map機能を使用することができます。

function multiply($n) { 
     $factor = 0.4; 
     return($n * $factor); 
} 

$arr = array_map("multiply", $arr); 

Ideone link

2

注意を真lambadasはあなたが使用できる5.3 前5.3後にあります

array_walk($arr, create_function('&$val', '$val = $val * 0.4;')); 
+0

これは、配列コピーを作成するよりも効率的です。なぜこれが選択された答えではないのだろう... –

0
参照により示唆されるようにarray_map(おそらく私の最初の選択肢)、またはあるarray_walkとパス10因子を動的かつ簡潔な構文で渡すには、より最近の(> 5.3.0、私が思う)バージョンのPHPで以下を使用することができます:
$arr = array(23,4,13,50,231,532,3); 
$factor = 0.5; 

$arr_mod = array_map(
       function($val) use ($factor) { return $val * $factor; }, 
       $arr 
      ); 
関連する問題