2015-05-29 91 views
3

我创建它返回一个JSON文件,HTML文件,我填补了从data.php文件中的数据网格中data.php文件。 我需要这是在以下形式的关联数组:PHP填补了一个关联数组

[ 
{"CompanyName":"Alfreds Futterkiste","ContactName":"Maria Anders","ContactTitle":"Sales Representative"}, 
{"CompanyName":"Ana Trujillo Emparedados y helados","ContactName":"Ana Trujillo","ContactTitle":"Owner"}, 
{"CompanyName":"Antonio Moreno Taquera","ContactName":"Antonio Moreno","ContactTitle":"Owner"} 
] 

现在的问题是,我想这data.php是某种通用的,这意味着我不知道COLUMNNAMES也不是的列的数量。 我完成这项工作的唯一方法是使用switch语句,但这并不理想(因为我可以创建多个案例,但如果表中有多个列,该怎么办)也不是很优雅。

我敢打赌,这是可以做到更好,任何想法?

我尝试使用array_push(),但不具有关联数组。

// get columnnames 
for ($i = 0; $i < $result->columnCount(); $i++) { 
    $col = $result->getColumnMeta($i); 
    $columns[] = $col['name']; 
} 

// fill up array 
while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
    switch (count($columns);) { 
     case 1 : 
      $records[] = array($columns[0] => $row[$columns[0]]); 
      break; 
     case 2 : 
      $records[] = array($columns[0] => $row[$columns[0]], $columns[1] => $row[$columns[1]]); 
      break; 
     case 3 : 
      $records[] = array($columns[0] => $row[$columns[0]], $columns[1] => $row[$columns[1]], $columns[2] => $row[$columns[2]]); 
      break; 
     case ... // and so on 
} 
} 

// send data to client 
echo json_encode($records); 
+3

如果我理解这个代码的逻辑,我相信它可以全部简化为只使用'fetchAll()',就像'$ records'一样= $ result-> fetchAll(PDO :: FETCH_ASSOC); echo json_encode($ records);'http://php.net/manual/en/pdostatement.fetchall.php因为'fetchAll()'将检索所有记录的2D关联数组,无论列数是多少。 –

+0

你可以使用循环来做到这一点。 – frz3993

+0

感谢迈克尔,在这种情况下甚至不需要循环。好的解决方案 –

回答

0

变化这一个

$arr_tmp = array(); 
 
for($i = 0; $i < count($columns); $i++) 
 
{ 
 
\t $arr_tmp[$columns[$i]] = $row[$columns[$i]] 
 
} 
 
$records []= $arr_tmp;

+1

伟大的解决方案Abdo!奇迹般有效。只是想念一个“;”在$ arr_tmp [$ columns [$ i]] = $ row [$ columns [$ i]] –

+0

的末尾,是的,我忘记了';' :D thx –

0

开关的代码段你可以遍历列:

while ($row = $result->fetch(PDO::FETCH_ASSOC)) { 
    $values = array(); 
    foreach ($columns as $column) { 
     values[$column] = $row[$column]; 
    } 
    records[] = $values; 
} 
+0

我比Abdo更喜欢你的答案,尽管它们基本相同,但你使用的foreach循环更具可读性。谢谢 !使其工作在值[$ column]和records []之前添加$。 –