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

Far*_*ire 15 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;
Run Code Online (Sandbox Code Playgroud)

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

You*_*nse 17

尽管PDO::FETCH_UNIQUEPHP手册中的描述还不清楚,但实际上它确实是您需要参数.

$data = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_UNIQUE);
Run Code Online (Sandbox Code Playgroud)

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

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

  1 => array (
    'name' => 'Solidfloor',
    'url' => 'solidfloor',
  ),
  2 => array (
    'name' => 'Quickstep',
    'url' => 'quickstep',
  ),
  4 => array (
    'name' => 'Cleanfloor',
    'url' => 'cleanfloor',
  ),
)
Run Code Online (Sandbox Code Playgroud)


Thi*_*e Z 14

获取为assoc

手册: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_COLUMN,你可以用PDO :: FETCH_GROUP结合PDO :: FETCH_ASSOC以达到预期的效果:

$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)
Run Code Online (Sandbox Code Playgroud)

所以,鉴于以上数据:

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

结果是:

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"
        ]
    ]
]
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • $ st-> fetchAll(PDO :: FETCH_ASSOC | PDO :: FETCH_GROUP); 这完成了工作,谢谢你的帮助! (4认同)