2017-08-05 64 views
-1

我有这样一个数组:['.1', '.2', '1.1', '2.0'](但它有更多的值)。PHP - 从索引数组的值导出的关联数组的每个值

在PHP中,是否有一个函数允许我将一个索引数组作为参数并返回一个关联数组,其中关联数组的键是原始数组的值,而关联的每个值数组是从其关键字派生而来(例如通过格式化函数)?

我想我可以传递一个匿名回调函数作为参数,以将索引数组的值转换为关联数组的新值。

就我而言,我希望能得到:(该关联数组,然后将在Form::select()在Laravel视图中使用)

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

我花了很长一段时间研究array_walk,array_map,array_filter,array_combine,call_user_func_array,和其他人,但我还没有弄清楚。

+3

对不起,但浮动键不允许在数组中。 –

+0

@u_mulder,谢谢,我固定了钥匙。我的问题的核心思想仍然存在。现在请看我的问题,我已经修好了钥匙。谢谢! – Ryan

+1

你可以使用那些'array_walk',但是你必须使用闭包的'use'部分。看到这个问答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不是一个字符串。无论如何,如果他们需要一位小数(并且只有一个),那么您可以使用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

我只是想小数的事情,如果你WA nt以确保他们至少有一位小数,但有些可能有更多,那么你可以这样做。

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。然而,即使这会削减拖尾0,当有多个小数位时,“1.10”变为“1.1”,但至少可以让它们全部浮动。

您可以在这里看到

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

注意这一个我修改了几个值,如“1.101”和“1.10”来说明这一点。

+0

因为它可以简单地转换为'2' –

+0

是啊,我意识到这一点。如果我说'(string)'我不应该得到一个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);