为什么我的代码使PDO返回嵌套数组?

时间:2014-03-08 22:01:40

标签: php sql arrays pdo multidimensional-array

我确信我一定做错了什么,但我似乎无法在任何地方找到答案(至少在文档和SO中都没有)。我是PHP和SQL的初学者。

我有一个名为“mObject_has_media”的简单表,只有两列“media_idMedia”和“mObject_idmObject”

当我尝试使用此代码查询表时,

public function selectMediaIds (MObject $object) {
    $medias = array ();
    $req = $this -> _db -> query ('SELECT media_idMedia FROM mObject_has_media WHERE mObject_idmObject = ' . $object -> id ());
    while ($data = $req -> fetch (PDO::FETCH_ASSOC)) {
        $medias[] = $data;
    }
    $req -> closeCursor ();
    return $medias;
}

问题是:当我var_dump方法的结果的内容时,我得到:

array (size=2)
  0 => 
    array (size=1)
      'media_idMedia' => string '52' (length=2)
  1 => 
    array (size=1)
      'media_idMedia' => string '53' (length=2)

我想摆脱那些嵌套数组,只是得到类似的东西:

array (size=2)
  0 => 'media_idMedia' => string '52' (length=2)
  1 => 'media_idMedia' => string '53' (length=2)

所以我可以简单地将这个数组运行到一个foreach循环中......我确信这个问题与fetch()方法有关,但是尽管尝试了不同的选项,我还没有能够得到理想的行为。

类似的问题(我认为)在这里被问到:PDO::FETCH_ASSOC Does not return the correct table columns但答案提到了Zend框架,我根本不使用任何框架,这只是vanilla PHP。

2 个答案:

答案 0 :(得分:1)

让我们创建一个多维数组,仅用于测试目的:

$array = array(
    array('foo' => 'value1'),
    array('foo' => 'value2')
);

现在考虑以下代码:

$result = array();

while ($row = array_shift($array)) {
    // $row will contain one nested array at a time
    $result[] = $row;
}

print_r($result);

$row是一个数组,使用语句$result[] = $row;,您将整个数组推送到$result,从而使其成为多维的。

这将输出:

Array
(
    [0] => Array
        (
            [foo] => value1
        )

    [1] => Array
        (
            [foo] => value2
        )

)

现在,请考虑以下代码:

$result = array();

while ($row = array_shift($array)) {
    // $row will contain one nested array at a time
    $result[] = $row['foo'];
}

print_r($result);

使用语句$result[] = $row['foo'];,我们将 $row['foo']推送到$result数组。在循环迭代结束时,$result将包含foo行值的数组。

这将输出:

Array
(
    [0] => value1
    [1] => value2
)

Demo


要修复原始代码,您可以这样修改:

$medias[] = $data['media_idMedia'];

答案 1 :(得分:0)

参数 PDO::FETCH_ASSOC 告诉PDO将结果作为关联数组返回。

PDO :: FETCH_ASSOC将返回一个数组,如代码所示。除了如果有多个具有相同名称的列,该键引用的值将是所有值的数组。具有该列名称的行

我认为这行代码

while ($data = $req -> fetch (PDO::FETCH_ASSOC)){ }
$data = $req -> fetch (PDO::FETCH_ASSOC)
 `$data`, itself is returned as an array.

这意味着您不需要使用$ data

来定义另一个数组

这样的东西
 $req = $this -> _db -> query ('SELECT media_idMedia FROM mObject_has_media WHERE mObject_idmObject = ' . $object -> id ());
    while ($data = $req -> fetch (PDO::FETCH_ASSOC)) {
        $data['media_idMedia']; //for media id.
    }