这个php foreach代码有什么问题? (合并数组)

时间:2012-03-07 16:22:44

标签: php pdo

$db = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);

            $items = 'SELECT items FROM menus';
            $itemLink = 'SELECT itemLink FROM menus';

            $itemQuery = $db->query($items);
            $linkQuery = $db->query($itemLink);

            $fetchItem = $itemQuery->fetch(PDO::FETCH_ASSOC);
            $fetchLink = $linkQuery->fetch(PDO::FETCH_ASSOC);

            $merged = array_merge($fetchItem,$fetchLink);

            foreach($merged as $key=>$value){
                echo "${key} =>  ${value} <br />";
            }

这就是数据库中的样子:

items   |itemLink
----------------------
Kill Bill|Kill Bill link
Preman  |Preman link

所以,预期的输出,或者至少我认为必须是这样:

    items => Kill Bill
    items => Preman
    itemLink => Kill Bill Link 
    itemLink => Preman Link

但代码的结果输出是:

items => Kill Bill
itemLink => Kill Bill Link 

它缺少其他项目和itemLink

那么,我如何实现我想要的输出呢?

2 个答案:

答案 0 :(得分:2)

        $fetchItem = $itemQuery->fetch(PDO::FETCH_ASSOC);
        $fetchLink = $linkQuery->fetch(PDO::FETCH_ASSOC);

这只获取每个结果集的第一行。您需要fetchAll

        $fetchItem = $itemQuery->fetchAll(PDO::FETCH_ASSOC);
        $fetchLink = $linkQuery->fetchAll(PDO::FETCH_ASSOC);

并调整其余代码。

        foreach($merged as $entry) {
          foreach( $entry as $key => $value ) {
            echo "${key} =>  ${value} <br />";
          }
        }

修改 fetch的调用仅检索结果集的第一行,而fetchAll将完整的结果集解析为数组。所以对象后来看起来像这样:

Array(
  [0] => { 'items' => 'Kill Bill' },
  [1] => { 'items' => 'Preman' }
)
Array(
  [0] => { 'itemLink' => 'Kill Bill' },
  [1] => { 'itemLink' => 'Preman' }
)

array_merge将两个数组连接到以下内容:

Array(
  [0] => { 'items' => 'Kill Bill' },
  [1] => { 'items' => 'Preman' },
  [2] => { 'itemLink' => 'Kill Bill' },
  [3] => { 'itemLink' => 'Preman' }
)

所以我们现在有了一个二维数组。要遍历这些值,我们首先需要选择每个$entry,这可以在外部foreach中完成,然后可以访问内部foreach中的键/值结构。

正如其他评论所指出的:如果您想保留itemsitemLink之间的联系,您应该首先将查询更改为

SELECT items, itemLink FROM menus

答案 1 :(得分:0)

您可以使用简单的array_combine()功能来完成您现在要执行的操作。

$merged = array_combine($fetchItem, $fetchLink);

这将使$fetchItem中的所有项目成为$fetchLink项目的关键。