2009-05-30 76 views
3

我有一個數組,有鍵和值。對於例如:如何將關聯數組平鋪爲只包含PHP值的數組?

Array (
    [name] => aalaap 
    [age] => 29 
    [location] => mumbai 
) 

我想從這個鍵轉換爲值,但我希望值在按鍵後apear。對於如:

Array (
    [0] => name 
    [1] => aalaap 
    [2] => age 
    [3] => 29 
    [4] => location 
    [5] => mumbai 
) 

我可以很容易地編寫一個迭代函數,將做到這...用於如:

array_flatten($arr) { 
    foreach ($arr as $arrkey => $arrval) { 
     $arr_new[] = $arrkey; 
     $arr_new[] = $arrval; 
    } 
    return $arr_new; 
} 

...但我試圖找出是否有任何這可以使用array_combine,array_keys,array_values和/或array_merge,最好在一個,所以我不需要使用自定義函數。

有嗎?

+0

我想知道爲什麼PHP在全局命名空間「array_flatten」中沒有函數。 – jbasko 2009-05-30 07:14:51

+0

你認爲這在本地值得包含在PHP中嗎? – aalaap 2009-05-30 07:53:27

回答

5

自己的解決方案也許是最簡潔的解決方案,所以它轉換爲「的一行」

$array = array('name' => 'aalaap','age' => 29, 'location' => 'mumbai'); 
$answer = array(); 

array_walk($array, create_function('$val,$key', 'global $answer; $answer[]=$key; $answer[]=$val;')); 

var_dump($answer); 

這可以避免不必要的和昂貴的陣列副本或排序。

另外,失去了全球:

array_walk($array, create_function('$val,$key,$result', '$result[]=$key; $result[]=$val;'), &$answer); 
3

我不認爲這是可能的 - 用內置的功能,你會用所有的鑰匙,那麼所有的值結束:

$a = array('a' => 'A', 'b' => 'B', 'c' => 'C'); 

$a = array_merge(array_keys($a), array_values($a)); 
print_r($a); 

你將不得不使用一個循環像這樣:

$b = array(); 
foreach ($a as $key => $value) 
{ 
    $b[] = $key; 
    $b[] = $value; 
} 
2

可能的,但我不認爲這是更具可讀性任何更快。這將與PHP的一個鮮爲人知的功能工作 - array addition

$array = array('name' => 'aalaap', 'age' => 29, 'location' => 'mumbai'); 

# Separate keys and values into distinct arrays 
$keys = array_keys($array); 
$values = array_values($array); 

# Generate 2 new array containing indexes for the 2 arrays which contain 
# only odd/even numbers: 
$keysKeys = range(0, count($keys) * 2 - 1, 2); 
$valuesKeys = range(1, count($keys) * 2, 2); 

# Combine the keys with the values and add the results: 
$array = array_combine($keysKeys, $keys) + array_combine($valuesKeys, $values); 

# Sort the resulting array, otherwise the numbering will be broken 
# (1,3,5,2,4,6) 
ksort($array); 

# Result: 
var_dump($array); 
array(6) { 
    [0]=> 
     string(4) "name" 
    [1]=> 
     string(6) "aalaap" 
    [2]=> 
     string(3) "age" 
    [3]=> 
     int(29) 
    [4]=> 
     string(8) "location" 
    [5]=> 
     string(6) "mumbai" 
} 
+0

這對於已經可以在兩行中完成的事情來說代碼太多了! – aalaap 2009-05-31 11:44:05

3

PHP 5.3+版本只是朱爾斯的回答,有點更具可讀性:

array_walk($array, function($val, $key) use (&$answer) { 
    $answer[] = $key; 
    $answer[] = $val; 
}); 
0

可以使用一個array_reduce親近。

array_reduce(array_keys($arr), function($carry, $key)use($arr){ 
    $carry[] = $key; 
    $carry[] = $arr[$key]; 
    return $carry; 
}, array()); 
相關問題