2015-04-01 3 views
0

Я пытаюсь использовать PHP для логического хранения всех этих данных в вложенных ассоциативных массивах, а затем всякий раз, когда я просматриваю данные или должен ссылаться на данные, я хотел бы обратиться к указателю массива а не делать новые запросы каждый раз.Настройка PHP Query во вложенный массив

Например:

Мой запрос

$query = $db->query(" 
SELECT 
    c.id campaign_id, 
    c.campaign_title, 
    c.start_date campaign_start_date, 
    c.end_date campaign_end_date, 
    cat.id category_id, 
    cat.category_title, 
    n.id nominee_id, 
    n.title nominee_title, 
    u.id voter_id, 
    u.fullname voter_name 
FROM 
    campaign c 
LEFT JOIN categories cat ON cat.campaign_id = c.id 
LEFT JOIN category_nominees cn ON cn.category_id = cat.id 
LEFT JOIN nominees n ON n.id = cn.nominee_id 
LEFT JOIN category_votes cv ON cv.campaign_id = c.id 
AND cv.category_id = cat.id 
AND cv.nominee_id = n.id 
LEFT JOIN users u on u.id = cv.user_id 
WHERE 
    c.active = 1 
ORDER BY 
    u.fullname, 
    c.campaign_title, 
    cat.category_order, 
    cat.category_title, 
    cn.nominee_order, 
    n.title 
") or die(mysqli_error()); 

и им пытаются создать вложенную массив как

$array = array() ; 

while($row = mysqli_fetch_assoc($query)) { 

    $array[$row['campaign_id']] = $row['campaign_id']; 
    $array[$row['campaign_id']]['campaign_title'] = $row['campaign_title']; 
    $array[$row['campaign_id']]['campaign_start_date'] = $row['campaign_start_date']; 
    $array[$row['campaign_id']]['campaign_end_date'] = $row['campaign_end_date']; 
    $array[$row['campaign_id']]['campaign_title'] = $row['campaign_title']; 
    $array[$row['campaign_id']]['category_id'] = $row['category_id']; 
    $array[$row['campaign_id']]['category_id']['category_title'] = $row['category_title']; 
} 

Поэтому, когда я указываю:

$array[2][3]['category_title'] 

Он напечатает категория заголовок

Есть ли у вас идеи? Я буквально был в нем месяцами и не могу понять.

+1

Sry, но я не понимаю вообще, что вы делаете. Не могли бы вы показать нам короткий пример результирующего массива, который вы хотите? – Unex

+0

Вы уверены, что SQL-запрос вовлечен в проблему, или это просто доступ к значениям в массивах? – mins

ответ

1

Используйте следующее:

while ($row = mysqli_fetch_assoc($query)) { 
    if (!isset($row['campaign_id'])) { 
     $array[$row['campaign_id']] = $row; 
    } 
    if (!isset($array[$row['campaign_id']]['categories'])) { 
     $array[$row['campaign_id']]['categories'] = array(); 
    } 
    $array[$row['campaign_id']]['categories'][$row['category_id']] = array('category_id' => $row['category_id'], 'category_title' => $row['category_title']); 
    } 
} 

$row уже ассоциативный массив, вам не нужно присвоить каждый элемент отдельно. Вам нужно только иметь дело с информацией о категории, которая должна быть помещена в вложенный ассоциативный массив, который я назвал categories. Таким образом, вы бы получить доступ к нему, как

$array[0]['categories'][1]['category_title'] 

Вы можете цикл по всем категориям с:

foreach ($array[$campaign]['categories'] as $cat) { 
    echo "Category ID: {$cat['category_id']} Title: {$cat['category_title']}<br>"; 
} 
+0

Большое спасибо! Было бы хорошо, если бы вместо isset мы сделали! Array_key_exists? Разве это не лучший выбор? – lancey

+1

Вы можете использовать это, если хотите. Я предпочитаю 'isset()', так как это terser и легче читать IMHO. – Barmar

+0

Как бы вы сделали цикл foreach, чтобы показать название каждой категории? – lancey