在PHP

2013-08-19 79 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 
     ) 

) 
*/