在PHP

2013-08-19 77 views
1
多維數組命名鍵

我使用下面的方法來自我組織成一個多維數組的CSV文件數據:在PHP

$handle = fopen("bankdata.csv", "r"); 

while(($data = fgetcsv($handle, 0 ,",")) !==FALSE) { 

    $transactions[] = $data; 

} 

數組現在看起來是這樣的:

Array 
(
[0] => Array 
    (
     [0] => 2000 
     [1] => paycheck 
     [2] => credit 
    ) 

[1] => Array 
    (
     [0] => 75 
     [1] => grocery 
     [2] => debit 
    ) 

[2] => Array 
    (
     [0] => 45 
     [1] => gas 
     [2] => debit 
    ) 

[3] => Array 
    (
     [0] => 900 
     [1] => investments 
     [2] => credit 
    ) 

[4] => Array 
    (
     [0] => 1500 
     [1] => bonus 
     [2] => credit 
    ) 

現在我想命名每個嵌套數組中的鍵。我以爲我會創建與等量嵌套數組的一個新的多維數組,它們的值是按鍵的預期的名稱我想補充到原來的數組,然後做「array_combine」:

$names = array('amount','source','type'); 

$run = 1; 

while($run < 6){ 
    $run = $run +1; 
    $names2[] = $names; 
} 

$combine = array_combine($names2, $transactions); 

回答

1

你可以使用陣列組合:

$keynames=array('amount','source','type'); 
foreach ($transactions as $i=>$row) { 
    $transactions[$i]=>array_combine($keynames, $row); 
} 

解決問題的正確途徑是不將數據讀取到一個數組,然後改造它 - 當你讀它改造它

while(($data = fgetcsv($handle, 0 ,",")) !==FALSE) { 
    $transactions[]=array_combine($keynames, $data); 
} 

順便說一句PHP不會做多維數組 - 它們是嵌套的。儘管它在手冊中說過,但它們只有可模擬多維數組。

+0

您的解決方案可能比我的,更高效的要好得多了。 – MisterBla

+0

完美謝謝。順便說一句,「模擬」和真實的東西之間有什麼區別? – Noam

+0

仿真?對於大多數意圖和目的,它將表現得像一個多維數組,但稀疏數組將使用較少的空間 - 不限於任何預定義的維度,而未設置的值的行爲與空值不同。 – symcbean

1

嘗試以下操作:

$arr = array(
    array(2000, 'paycheck', 'credit'), 
    array(75, 'grocery', 'debit'), 
    array(45, 'gas', 'debit'), 
    array(900, 'investments', 'credit'), 
    array(1500, 'bonus', 'credit') 
); 

$keys = array('amount','source','type'); 

// $a will make a reference to the array within $arr 
// and override the array 
foreach($arr as &$a) 
{ 
    // Override the array keys 
    $a = array_combine($keys, $a); 
} 

/* Output: 
Array 
(
    [0] => Array 
     (
      [amount] => 2000 
      [source] => paycheck 
      [type] => credit 
     ) 

    [1] => Array 
     (
      [amount] => 75 
      [source] => grocery 
      [type] => debit 
     ) 

    [2] => Array 
     (
      [amount] => 45 
      [source] => gas 
      [type] => debit 
     ) 

    [3] => Array 
     (
      [amount] => 900 
      [source] => investments 
      [type] => credit 
     ) 

    [4] => Array 
     (
      [amount] => 1500 
      [source] => bonus 
      [type] => credit 
     ) 

) 
*/