Что не так с этим php foreach кодом?(объединенный массив) - PullRequest
0 голосов
/ 07 марта 2012
$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 

Не хватает других предметов и предметов. Ссылка

Итак, как мне получить желаемый результат?

Ответы [ 2 ]

2 голосов
/ 07 марта 2012
        $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.

, как указано вдругой комментарий: Если вы хотите сохранить связь между items и itemLink, вам следует сначала изменить запрос на

SELECT items, itemLink FROM menus
0 голосов
/ 07 марта 2012

Вы можете использовать простую функцию array_combine () , чтобы делать то, что вы пытаетесь сделать сейчас.

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

Это сделает весь элемент из $fetchItem в качестве ключей кпредмет из $fetchLink.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...