2017-08-05 35 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);