来自 SQL 查询的数组推送行

Array push rows from SQL query

我正在尝试将 SQL 查询中的行(结果)保存到 csv 文件中。 我正在使用数组推送来将结果放入列表中。后来我把这个列表中的数据放到我的 csv 文件中。

我的代码:

    while ($row = $query->fetch_assoc()) 
{
    echo sprintf( $row['campaign']);
    array_push($list, $row['campaign']);

}

结果在那里,因为 sprintf 有效。问题在于 array_push 的语法。我什至试过了:

array_push($list, array(''.$row['campaign']);

我收到一个错误:

fputcsv() expects parameter 2 to be array

完整代码在这里:

    $list = array 
    (
        array('old_campaign_name', 'new_campaign_name') 
    );

// table 1
$sql = ('select distinct(campaign) as campaign from '.$table1.'');

// Run the query
$query = $Db->query($sql);

// Check for SQL errors
if ($Db->error) 
{
    return ($Db->error);
}

// Put data in the list

while ($row = $query->fetch_assoc()) 
{
    echo sprintf( $row['campaign']);
    array_push($list,$row['campaign'],'');

}

$fp = fopen($location, 'w');

foreach ($list as $fields) 
{
    fputcsv($fp, $fields);
}

fclose($fp);

最初创建$list数组时,它是一个包含一个数组的数组。但是,当您从查询结果中向它添加更多值时,您是在将字符串而不是数组推到它的末尾。实际上,您将制作类似

的内容
$list = array (
    array('old_campaign_name', 'new_campaign_name'),
    'first campaign',
    'second campaign',
    'etc.',
    ...
);

因此,当您遍历 $list 时,第一个值应该与 fputcsv 一起使用,因为它是一个数组,但任何后续值都将是字符串而不是数组,并且会导致您看到的错误。

您应该可以像这样填写 $list

while ($row = $query->fetch_assoc()) {
    $list[] = $row;
}

$list[] = $row 不会覆盖之前在 $list 中的值。来自 the PHP documentation for array_push:

Note: If you use array_push() to add one element to the array it's better to use $array[] = because in that way there is no overhead of calling a function.

如错误所述,fputcsv 期望您放入的每一行都是一个数组,因此它可以用逗号分隔元素来写出它。 $list 应该是一个二维数组,所以你需要在构建它的时候将一个数组压入它上面。

while ($row = $query->fetch_assoc() {
    $list[] = array($row['campaign']);
}

顺便说一句,$list[] = x 等同于 array_push($list, x)

它是这样工作的:

while ($row = $query->fetch_assoc()) 
{
    // array_push($list,$row['campaign'],'');
    array_push($list,array($row['campaign'], ''));

}