【问题标题】:PHP fill up an associative arrayPHP 填充一个关联数组
【发布时间】:2015-05-29 12:55:41
【问题描述】:

我正在创建一个 data.php 文件,它将一个 json 文件返回到一个 html 文件,在该文件中我用 data.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 是通用的,这意味着我不知道列名也不知道列的数量。 我完成这项工作的唯一方法是使用 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);

【问题讨论】:

  • 如果我理解这段代码的逻辑,我相信它可以被简化为只使用fetchAll(),如$records = $result-&gt;fetchAll(PDO::FETCH_ASSOC); echo json_encode($records); php.net/manual/en/pdostatement.fetchall.php 因为fetchAll() 将检索一个二维关联数组的所有记录,无论列数如何。
  • 你可以使用循环来做到这一点。
  • 谢谢迈克尔,在这种情况下甚至不需要循环。很好的解决方案。

标签: php associative-array associative array-push


【解决方案1】:

用这个改变开关代码段

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

【讨论】:

  • 伟大的解决方案 Abdo !奇迹般有效。只是少了一个“;”在 $arr_tmp[$columns[$i]] = $row[$columns[$i]] 的末尾
【解决方案2】:

您可以遍历列:

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

【讨论】:

  • 我比 Abdo 更喜欢您的回答,虽然它们基本相同,但您使用的 foreach 循环更具可读性。谢谢 !为了使它起作用,在 values[$column] 和 records[] 之前添加 $。
猜你喜欢
  • 2017-06-06
  • 2013-11-26
  • 2015-07-26
  • 2012-12-20
  • 2019-10-28
  • 2019-10-16
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多