2013-07-03 23 views
2

使用規範PHPDoc的例子,這樣的代碼:如何使用array_map指定鍵?

<?php 
function cube($n) 
{ 
    return($n * $n * $n); 
} 

$a = array(3, 4, 5); 
$b = array_map("cube", $a); 
print_r($b); 
?> 

輸出

陣列

(
    [0] => 27 
    [1] => 64 
    [2] => 125 
) 

但我真的希望它的輸出是沿着這些路線的東西: 陣列

(
    [3] => 27 
    [4] => 64 
    [5] => 125 
) 

T hat是,我想array_map使用與原始數組中相同的鍵。有沒有辦法做到這一點?謝謝!

回答

2

使用array_combine()

$b = array_combine($a, array_map("cube", $a)); 

您可以從this demo看到它產生:

Array 
(
    [3] => 27 
    [4] => 64 
    [5] => 125 
) 
+0

真棒,謝謝! – sg5523

1

不使用array_map,它明確地映射只values。但是,這會做:

array_combine($a, array_map('cube', $a)) 
1

而不是使用array_map它返回一個修改過的數組,你可以使用array_walk可以修改給定數組的。請注意,array_walk需要使用回調引用,如果你打算改變他們接受它的參數

<?php  
$cube = function(&$x) { 
    // Modify $x by reference 
    $x = pow($x, 3); 
}; 

$data = array(
    3 => 3, 
    4 => 4, 
    5 => 5 
); 

array_walk($data, $cube); 

print_r($data); 

這將打印

Array 
(
    [3] => 27 
    [4] => 64 
    [5] => 125 
) 
+0

雖然這並不會重寫密鑰...... – Orangepill

+1

@Orangepill我誤解了海報問題中的一個關鍵點。我認爲'array_map'是用任意鍵返回一個數組,但事實並非如此。其他答案更合適。 – jcbwlkr

1

雖然您不能使用array_map改寫你可以使用array_reduce鍵與閉合(PHP 5.3+)

<?php 
function cube($n){ 
    return $n*$n*$n; 
} 

$data = array(3,4,5); 
$function = "cube"; 
$res = array_reduce($data, function(&$result = array(), $item) use($function){ 

    if (!is_array($result)){ 
    $result = array(); 
    }; 
    $result[$item] = $function($item); 
    return $result; 
}); 

print_r($res); 

輸出是

Array 
(
    [3] => 27 
    [4] => 64 
    [5] => 125 
)