2012-12-03 26 views
0

我需要在一個CSV文件中寫入一個數組,其中不能更改列順序。但是我想將列標題縮小到最多64個字符的長度。爲了使問題更普遍的,我們先來一個簡單的例子:在PHP中,如何重命名數組密鑰而不移動它?

$array = array(
    'A te' => 'foo A', 
    'Q test' => 'foo Q', 
    'Z test' => 'foo Z', 
); 

var_dump($array); 

給:

array (size=3) 
    'A te' => string 'foo A' (length=5) 
    'Q test' => string 'foo Q' (length=5) 
    'Z test' => string 'foo Z' (length=5) 

現在,我要重命名的「Q測試」鍵「Q工商業污水附加費」。如果我做的:

$swap = $array["Q test"]; 
unset($array["Q test"]); 
$array["Q tes"] = $swap; 
var_dump($array); 

顯示:

array (size=3) 
    'A te' => string 'foo A' (length=5) 
    'Z test' => string 'foo Z' (length=5) 
    'Q tes' => string 'foo Q' (length=5) 

列的位置變了,這不是我所期待的。

$keys = array_keys($array); 
$values = array_values($array); 
$count = count($keys); 
for ($i = 0; ($i < $count); $i++) 
{ 
    if (mb_strlen($keys[$i]) > 5) 
    { 
     $keys[$i] = mb_substr($keys[$i], 0, 5); 
    } 
} 
$array = array_combine($keys, $values); 

var_dump($array); 

輸出:

我使用(這裏,減少鍵5個字符)解決我的問題

array (size=3) 
    'A te' => string 'foo A' (length=5) 
    'Q tes' => string 'foo Q' (length=5) 
    'Z tes' => string 'foo Z' (length=5) 

但是這個看上去很的資源,吞噬......我確實需要在我的每一行上執行這樣的代碼,我有10k到100k行。

有沒有簡單的方法來重命名數組鍵而不移動它們?

+0

看一看array_map,結合使用array_keys。但最終,它可能與你自己的解決方案一樣。 – GarethL

+0

爲什麼不直接在輸出時截斷標題,而不是改變數組?你的問題沒有說清楚爲什麼你需要縮短陣列的密鑰(這可能導致重疊密鑰和數據丟失)。 – salathe

回答

2

試試這個,這應該是簡單的,

foreach($array as $k=>$v){ 
    if($k=='Q test'){ 
     $new_arr['Q tes'] = $array['Q test']; 
    }else{ 
     $new_arr[$k] = $v; 
    } 
} 

print_r($new_arr); //set $array = $new_arr; to overwrite all values 
+0

嗯,看起來不錯,我專注於關鍵替換,我沒有想過簡單地創建一個新的數組。 –