我有一个这样的数组:['.1', '.2', '1.1', '2.0']
(但它有更多的值)。
在PHP中,是否有一个函数允许我将索引数组作为参数传递并返回一个关联数组,其中关联数组的键是原始数组的值,以及每个值的值关联数组是从其键派生的(例如通过格式化函数)?
我想我能够将匿名回调函数作为参数传递,将索引数组的值转换为关联数组的新值。
就我而言,我希望收到:
['.1' => '10%', '.2' => '20%', '1.1' => '110%', '2.0' => '200%']
(此关联数组将在Laravel视图中的Form::select()
中使用。)
我花了很长时间研究array_walk,array_map,array_filter,array_combine,call_user_func_array和其他人,但我还没有想通了。
答案 0 :(得分: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>';
答案 1 :(得分: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不是一个字符串。无论如何,如果他们需要一个十进制(并且只有一个),你可以使用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%"
}
如果有更多的小数位或它们是可变的,你可以计算小数点后的数字,并将其用作number_format
的第二个输入我可以想到至少2种方法来做到这一点。
你可以在这里测试它们
<强>首先强>
http://sandbox.onlinephpfunctions.com/code/30ec8bdc191095ac92a681b3f8fc964c66360c86
<强>第二强>
http://sandbox.onlinephpfunctions.com/code/e02d45e6d02e79a2440110b7ffe6df93e76920d3
我只是考虑小数的问题,如果你想确保它们至少有一个小数,但有些可能有更多,那么你就可以这样做。
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.10”变为“1.1”时会减少尾随0,但至少它会使它们全部浮动。
你可以在这里看到这个
http://sandbox.onlinephpfunctions.com/code/e836076f7ee6c2e684d4ccca016101b288649f29
注意我修改了一些值,例如“1.101”和“1.10”来说明这一点。
答案 2 :(得分: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);