【问题标题】:Is it possible to keep unique index in result array using PHP PDO::FETCH_UNIQUE?是否可以使用 PHP PDO::FETCH_UNIQUE 在结果数组中保留唯一索引?
【发布时间】:2017-10-04 16:26:07
【问题描述】:

我正在使用以下带有 PDO::FETCH_UNIQUE 标志的 PDO 语句来使结果数组按唯一行 ID 进行索引。

<?php
    $statement = $conn->prepare("
        SELECT
            unique_id, field_1, field_2, field_3
        FROM
            table
        WHERE
                field_1 = 'foo'
            AND field_2 = ?
        ORDER BY
            field_3
    ");

    if($statement->execute(array($field_2_value)))
    {
        $resultArray = $statement->fetchAll(PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE);
    }
?>

$resultArray:

Array
(
    [123] => Array
        (
            [field_1] => foo
            [field_2] => someVal
            [field_3] => bar
        )
    [234] => Array
        (
            [field_1] => foo
            [field_2] => someVal
            [field_3] => car
        )
    [345] => Array
        (
            [field_1] => foo
            [field_2] => someVal
            [field_3] => dog
        )
)

有没有办法让两个数组索引保持原样,并在行数据中保留唯一的行 ID,如下所示:

 Array
(
    [123] => Array
        (
            [unique_id] => 123
            [field_1] => foo
            [field_2] => someVal
            [field_3] => bar
        )
    [234] => Array
        (
            [unique_id] => 234
            [field_1] => foo
            [field_2] => someVal
            [field_3] => car
        )
    [345] => Array
        (
            [unique_id] => 345
            [field_1] => foo
            [field_2] => someVal
            [field_3] => dog
        )
)

我意识到我可以使用辅助循环来做到这一点,但如果这是 fetchAll() 中的一个选项,它会感觉更简洁。

【问题讨论】:

  • 您是否正在使用 foreach 循环并寻找一种方法来利用每个 key 以及每个 value
  • @SamOnela 是的,我目前正在重写一个遗留函数,从该函数中生成的数组在整个代码库中以多种不同方式使用,为了保持兼容性,我需要保留键和值.

标签: php mysql arrays pdo associative-array


【解决方案1】:

有没有办法让两个数组索引保持原样并在行数据中保留唯一的行 ID[...]?

据我所知,没有。但是,foreach 支持两种语法:

foreach (array_expression as $value)
    statement
foreach (array_expression as $key => $value)
    statement

第一种形式循环遍历由array_expression 给出的数组。在每次迭代中,当前元素的值都分配给 $value,内部数组指针前移 1(因此在下一次迭代中,您将查看下一个元素)。

第二种形式会在每次迭代时将当前元素的键额外分配给$key变量。 1

所以使用第二种语法:

foreach($resultArray as $key => $values) {
    //$key is contains the unique_id

    //$values contains the other fields
    //e.g. field_1, field_2, field_3
}

请参阅this playground example 中的演示。


1http://php.net/manual/en/control-structures.foreach.php

【讨论】:

  • 是的,我意识到我可以使用 as $key =&gt; $values 语法,但我正在将此数组提供给一些将查找 unique_id 键的遗留代码,我不想破坏它。
【解决方案2】:

是的,这是完全可能的,因为您总是可以在字段列表中添加一个额外的字段。

$statement = $conn->prepare("
    SELECT
        unique_id uid, unique_id, field_1, field_2, field_3
    FROM
        table
    WHERE
            field_1 = 'foo'
        AND field_2 = ?
    ORDER BY
        field_3
");

并在值中包含您的 unique_id。

但是,我认为这不是很有必要,因为您始终可以从其他答案中提到的 foreach 获取索引。

【讨论】:

  • 这当然是朝着正确方向迈出的一步,谢谢,但是有没有办法保持名为“unique_id”而不是“uid”的键?我意识到我可以使用 as $key =&gt; $values 语法,但我正在将此数组提供给一些将查找“unique_id 键”的遗留代码,我不想破坏它。
  • 你试过了吗?为什么你认为会有uid之类的东西?
猜你喜欢
  • 2011-12-16
  • 2010-09-21
  • 2011-09-13
  • 1970-01-01
  • 2021-05-05
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多