2017-08-05 12 views
-1

私はこのような配列を持っています:['.1', '.2', '1.1', '2.0'](それ以上の値があります)。PHP - インデックス配列の値から派生した連想配列の各値

PHPでは、インデックス付き配列を引数として渡すことができ、連想配列のキーが元の配列の値であり、連想配列の各値配列はそのキー(書式化関数など)から派生していますか?

インデックス付き配列の値を連想配列の新しい値に変換する引数として、匿名コールバック関数を渡すことができると思います。私の場合は

、私が受け取ることを期待しています:

['.1' => '10%', '.2' => '20%', '1.1' => '110%', '2.0' => '200%']

(。この連想配列は、その後、LaravelビューでForm::select()に使用されます)

私は長い時間を費やしています調査中array_walkarray_maparray_filterarray_combinecall_user_func_arrayなどですが、私はそれを理解していません。

+3

申し訳ありませんが、浮動小数点キーは配列には使用できません。 –

+0

@u_mulder、ありがとう、私はキーを修正した。私の疑問の根本的なアイデアはまだ残っています。私はキーを修正したので私の質問を見てください。ありがとう! – Ryan

+1

これらの 'array_walk'を使うことができますが、クロージャの' use'部分を使わなければなりません。このQ&Aを参照してください。https://stackoverflow.com/questions/13271015/changing-array-keys-in-array-walk-function – ArtisticPhoenix

答えて

2

私はコメントで述べたように、あなたは、配列の散歩を使用することができます奇数/興味深い何

$result = array(); 
$array = [0.1, 0.2, 1.1, 2.0, 2.5]; 

array_walk($array, function (&$value) use (&$result) { 
    $result[(string)$value] = ($value * 100) . '%'; 
}); 
var_dump($result); 

出力

array(5) { 
    ["0.1"]=> string(3) "10%" 
    ["0.2"]=> string(3) "20%" 
    ["1.1"]=> string(4) "110%" 
    [2]=> string(4) "200%" /// <-- int 
    ["2.5"]=> string(4) "250%" 
} 

私は注目です2は文字列ではありません。とにかく、小数点以下1桁が必要な場合は、代わりにnumber_formatでこのバージョンを使用できます。

$result = array(); 
$array = [0.1, 0.2, 1.1, 2.0, 2.5]; 

array_walk($array, function (&$value) use (&$result) { 
    $result[number_format($value,1)] = ($value * 100) . '%'; 
}); 
var_dump($result); 

出力

array(5) { 
    ["0.1"]=> 
    string(3) "10%" 
    ["0.2"]=> 
    string(3) "20%" 
    ["1.1"]=> 
    string(4) "110%" 
    ["2.0"]=> 
    string(4) "200%" 
    ["2.5"]=> 
    string(4) "250%" 
} 

がより多くの小数点以下の桁数があるか、彼らが可変である場合は、小数点以下の桁数をカウントし、私は、少なくとも2の考えることができるnumber_formatへの第2の入力としてことを使用することができますそれを行う方法。

あなたは

まずここでそれらをテストすることができます。

http://sandbox.onlinephpfunctions.com/code/30ec8bdc191095ac92a681b3f8fc964c66360c86

第二:

http://sandbox.onlinephpfunctions.com/code/e02d45e6d02e79a2440110b7ffe6df93e76920d3

ます場合、私はちょうど、小数点以下の事を考えていましたワ彼らは少なくとも1つの小数を持っていることを保証するために、しかしいくつかは、あなたがそれをこのようにすることができますより多くを持つことができます。

array_walk($array, function (&$value) use (&$result) { 
    $key = (string)$value; 
    if(strlen($key) == 1) 
     $key = number_format($key, 1); 

    $result[$key] = ($value * 100) . '%'; 
}); 

あなたは、単にフロート「2.1」の文字列表現に変換することができたものでnumber_formatを呼び出さないので、これはまた、それより高速なマイクロ秒の数分のなるかもしれません。しかし、小数点以下1桁があるときに後続の0を切り捨てるとしても、「1.10」は「1.1」になりますが、少なくともそれらはすべて浮動小数点になります。

あなたは、私がこれを説明するために、「1.101」と「1.10」のような、値の数を変更し、ここで

http://sandbox.onlinephpfunctions.com/code/e836076f7ee6c2e684d4ccca016101b288649f29

(注)この1を見ることができます。

+0

シンプルに '2'に変換できるので、 –

+0

私はそれを実現します。それでも私が '(文字列)'と言うと、intを取得すべきではありません。 – ArtisticPhoenix

+0

私はそれを明確にすべきです、ホエイは '2.0'を' 2'に変えますが、まだそれを文字列にキャストしておくべきでしょうか? '2'の代わりに' '2'' – ArtisticPhoenix

2

array_reduceとの簡単な例:

$a = [0.1, 0.2, 1.1, 2.0, 2.5]; 
$new_a = array_reduce(
    $a, 
    function ($t, $v) { $t[(string)$v] = (100 * $v) . '%'; return $t; }, 
    [] 
); 
echo'<pre>',print_r($new_a),'</pre>'; 
0
$keys = ['.1', '.2', '1.1', '2.0']; 
$values = []; 
foreach ($keys as $key) { 
    $values[] = sprintf('%s%%', (float)$key * 100); 
} 
$data = array_combine($keys, $values); 
var_dump($data); 
関連する問題