使用列的值作为使用PDO的结果中的索引

时间:2012-10-11 07:03:23

标签: php sql arrays pdo

我有一个名为'brands'的SQL表,其中包含列id,name,url。 在该表中,我有这个数据集:

1, Solidfloor, solidfloor;
2, Quickstep, quickstep;
4, Cleanfloor, cleanfloor;
5, Blue Dolphin, blue-dolphin;
6, Krono, krono;
8, Meister, meister;

我现在正在取出它们并且我得到一个很好的数组作为回报,但是,我需要数组的索引不是递增的数字,而是该特定行的id。我当然可以遍历结果集,但是有更简洁的方法吗?

2 个答案:

答案 0 :(得分:16)

尽管PHP手册中的PDO::FETCH_UNIQUE描述尚不清楚,但实际上它是exact parameter you actually need

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE);

首先给你一个由SELECT子句中列出的字段索引的数组(当使用*时,然后在表定义中使用第一个字段,在你的情况下应该是id)。

请注意,默认情况下,只使用PDO::FETCH_UNIQUE会为您生成带有加倍值的行。您可以为此调用添加首选行模式,或者 - 更好的是,在构造函数中为所有PDO调用设置一次,或者通过setAttribute()设置一次。下面的输出显示为PDO::FETCH_ASSOC设置为默认提取模式。

  1 => array (
    'name' => 'Solidfloor',
    'url' => 'solidfloor',
  ),
  2 => array (
    'name' => 'Quickstep',
    'url' => 'quickstep',
  ),
  4 => array (
    'name' => 'Cleanfloor',
    'url' => 'cleanfloor',
  ),
)

答案 1 :(得分:14)

获取为关联

手册: http://php.net/manual/en/pdostatement.fetchall.php

fetch_style

  

控制返回数组的内容,如PDOStatement :: fetch()中所述。默认值为PDO :: ATTR_DEFAULT_FETCH_MODE(默认为PDO :: FETCH_BOTH)

     

要从结果集返回包含单个列的所有值的数组,请指定PDO :: FETCH_COLUMN。您可以使用column-index参数指定所需的列。

     

仅从结果集中获取单个列的唯一值,使用PDO :: FETCH_UNIQUE按位OR OR PDO :: FETCH_COLUMN。

     

返回按指定列的值分组的关联数组,按位ORO PDO :: FETCH_COLUMN与PDO :: FETCH_GROUP。

最后一点是关键。它似乎没有完全记录(我可以找到),但是您可以将PDO :: FETCH_ASSOC与PDO :: FETCH_GROUP结合使用,而不是PDO :: FETCH_COLUMN,以实现所需的结果:

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)

所以,鉴于以上数据:

$stmt = $PDO_obj->prepare('select * from brands');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
d($result);

结果:

array (6) [
    '1' => array (1) [
        array (2) [
            'name' => string (10) "Solidfloor"
            'url' => string (10) "solidfloor"
        ]
    ]
    '2' => array (1) [
        array (2) [
            'name' => string (9) "Quickstep"
            'url' => string (9) "quickstep"
        ]
    ]
    '4' => array (1) [
        array (2) [
            'name' => string (10) "Cleanfloor"
            'url' => string (10) "cleanfloor"
        ]
    ]
    '5' => array (1) [
        array (2) [
            'name' => string (12) "Blue Dolphin"
            'url' => string (12) "blue-dolphin"
        ]
    ]
    '6' => array (1) [
        array (2) [
            'name' => string (5) "Krono"
            'url' => string (5) "krono"
        ]
    ]
    '8' => array (1) [
        array (2) [
            'name' => string (7) "Meister"
            'url' => string (7) "meister"
        ]
    ]
]

(d()只是来自kint库的一个方便的调试函数,如var_dump()或print_r())

请注意,用于索引数组的列始终是结果中的第一列,因此您可以修改select语句以选择所需的列。另请注意,索引列将从每行的数组中删除;为了解决这个问题,您可以将列添加两次到您的select语句(即select id, brands.* from brands等)。

此处记录了更多参数:http://php.net/manual/en/pdostatement.fetch.php,与PDO :: FETCH_UNIQUE类似,以确保每个索引仅使用一次。