【问题标题】:PHP - PDO fetch resultset with column as index and column as value [duplicate]PHP - PDO 获取结果集,列作为索引,列作为值[重复]
【发布时间】:2014-03-23 22:54:07
【问题描述】:

您好,我有一个结构如下的表

+-------------+------+
| date        | price|
+-------------+------+
| 2014-02-19  |   34 |
| 2014-02-20  |   30 |
| 2014-02-21  |   28 |
+-------------+------+

目前 PDO::FETCH_ASSOC 返回一个关联数组,格式如下

array(
  0=> array(
    "date" =>  2014-02-19 ,
    "price" => 34
),
 1=> array(
    "date" =>  2014-02-20 ,
    "price" => 30
),
 2=> array(
    "date" =>  2014-02-21 , 
    "price"=> 28
 )

)

顺便说一句,这没问题,但我一直在寻找一种方法将值作为键 => 值对返回,键是日期,值是价格。这样我就可以使用日期作为键快速访问价格值,从而大大减少计算量,因为我必须处理数百万行,并且在循环中访问每个值只会导致程序进一步减速。

这就是我想要返回的 PDO::fetchALL()

array(
"2014-02-19" => 34,
"2014-02-20" => 30,
"2014-02-21" => 28
)

我的意思是我可以使用 foreach 循环轻松构建它,但在我的情况下这是不可能的,因为它会导致性能大幅下降。因此,如果有人能指出我正确的方向,那将非常有帮助。我将不胜感激任何形式的帮助或提示。

谢谢, 马克斯

【问题讨论】:

  • 你总是可以用 while 代替 foreach
  • 当然可以,但是它会降低我目前使用 foreach() 获得的性能损失吗?
  • 取决于您想象的性能。
  • 程序中已经有 4 个外部循环,这个数组计算发生在最里面的循环中
  • 那又怎样?您在此处看到的某些“性能影响”是什么?

标签: php mysql pdo


【解决方案1】:

我认为没有任何内置功能可以做到这一点。您可以使用普通的fetch() 循环来做到这一点:

$results = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $results[$row['date']] = $row['price'];
}

【讨论】:

  • 感谢您的回复,我感觉没有任何内置方法可以做到这一点。但话又说回来,我认为可能有一些标志,如 PDO::FETCH_NAMED 或 PDO::FETCH_NUM 可用于实现我不知道的这一点。所以我在这里发布了我的问题。
  • 并且由于我的程序的主事件循环已经有 4 个循环,这将复杂性增加到 O(NNN*N),所以我不想要另一个循环以进一步增加复杂性:-)
  • 确保所有这些嵌套循环都是必要的。如果您正在执行嵌套查询,它们通常可以替换为使用JOIN 的单个查询,以及组合相关行的fetch 循环中的逻辑。
  • 不,我没有使用嵌套查询。该程序计算 134 个不同对象的子属性,每个对象大约有 5000 个子属性,查询在每个子属性内运行,每个子属性还有另一组次要属性要计算。
  • 无论如何我都在使用你的方法,因为这似乎是目前最合乎逻辑的。
【解决方案2】:

试试foreach ($sql_stmt as $row)...它可以轻松处理您的所有结果集...

根据您的系统更改数据库名称、用户 ID、表名等

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbConnection= new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);

$sql_stmt = $dbConnection->prepare($sql_query="select date,price from table;");

$sql_stmt->execute();
foreach ($sql_stmt as $row) {
$date_col=$row['date']; 
$price_col=$row['price']; 
print $date_col;
print $price_col;
}

如果您想将值存储在数组中,请使用,如下所示,在同一个 foreach 循环中(声明并增加 $i)

$date_col[$i]=$row['date']; 
$price_col[$i]=$row['price']; 

【讨论】:

  • 恐怕你没有得到问题。
  • 感谢您的回复。是的,这不是我想要的,因为我已经提到我可以轻松地做到这一点,但我正在寻找一些有效的方法来将两列映射为索引和值。
【解决方案3】:

我认为可以通过 fetch 选项来完成。

$sth = $dbh->prepare("SELECT date, price FROM some_table");
$sth->execute();


$sth->fetchAll(PDO::FETCH_KEY_PAIR);

仅当获取的数据是一对值时才有效。

【讨论】:

  • 另外,PDO::FETCH_GROUP|PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC 可用于更多列。见this edit
猜你喜欢
  • 2012-10-01
  • 1970-01-01
  • 2013-08-23
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多