在CodeIgniter中循环遍历多维数组

3

如果您有任何建议,请一定要告诉我,因为我完全卡在了这个问题上!需要任何帮助。如果有什么不清楚的地方,请告诉我!

我的模型:

查询#1 - 从会话中检索广告系列ID的列表

public function retrieve_campaign($CompanyId)
    {   
            $this->db->select('*');
            $this->db->from('Campaign');
            $this->db->join('Product', 'Campaign.ProductId=Product.ProductId');
            $this->db->where('Product.CompanyId', $CompanyId); 
            $query = $this->db->get();

            return $query->result_array(); 
    }

查询 #2 -- 每天收集网站点击量

    public function week_data($i, $CampaignId, $StartDate) {
            $query = $this->db->query('SELECT COUNT(*) AS MyCount 
            FROM Record 
            WHERE CampaignId = ' . $CampaignId . ' 
            AND DATE(TimeStamp) = ' . $StartDate . ' + interval ' . $i . ' day');
        return $query;
    }

我的控制器: 正如您所看到的,我设置了会话数据,并将其插入查询 #1。 然后在 foreach 循环中使用该数据查询 #2 七次(每周一次)。 这些数据随后存储在数组 $data['test'] 中。

public function index()
{   
    // Set Session Varaible
    $CompanyId = $this->session->userdata('CompanyId'); 
    $StartDate = "'2014-06-23'";

    // Assign query result to array  to be used in view
    $data['campaigns'] = $this->model_record->retrieve_campaign($CompanyId);

    foreach($data['campaigns'] as $item) {
        for($x = 0;$x > 6;$x++) {
            echo $item['CampaignId'];
            $data['test'] = $this->model_record->week_data($x,$item,$StartDate);
        }
    }

    // Load views, pass query result array
    $this->load->view('templates/header');
    $this->load->view('dashboard/index', $data);
    $this->load->view('templates/footer');
} 

我的看法:我在这里遇到困难——我想循环遍历CampaignId并将它们输出,然后输出与该CampaignId相关联的第二个查询的所有相关数据。

例子:

1)检索CampaignIds,为每周的每一天查询每个CampaignId 7次,然后在视图上打印类似于以下内容的东西:

CampaignId: 1 Web点击数:55,63,32,39,22,33,61

等等...

请给出建议,我已经在这个问题上工作了3天,但是现在卡住了。非常感谢大家!


编辑

非常感谢Scrowler对我的帮助—他帮我完成了每一步。可行的编辑如下:

控制器:

public function index()
{   
    // Set Session Varaible
    $CompanyId = $this->session->userdata('CompanyId'); 
    $StartDate = "'2014-06-23'";

    // Assign query result to array  to be used in view
    $data['campaigns'] = $this->model_record->retrieve_campaign($CompanyId);

    foreach($data['campaigns'] as $item) {
        for($x = 0; $x < 7; $x++) {
            $data['CampaignData'][$item['CampaignId']][] = $this->model_record->week_data($x, $item['CampaignId'], $StartDate);
        }
    }
    // Load views, pass query result array
    $this->load->view('templates/header');
    $this->load->view('dashboard/index', $data);
    $this->load->view('templates/footer');
} 

查看:

<?php 
foreach($CampaignData as $campaign_id => $week_data) {
    echo 'Campaign: ' . $campaign_id . ', web hits: ' . implode(', ', $week_data) . PHP_EOL;
}
?>

1
你能不能把 echo $item['CampaignId']; 放在 for 循环之前,然后在每次迭代中检索到 $data['test'] 后再将结果进行输出呢? - scrowler
很遗憾,我无法在控制器中回显。数据必须放回到 $data[''] 数组中,以便传递到视图。 - Nathan_Sharktek
好的,将其添加到数组中,并使用CampaignId作为键:$data['CampaignData'][$item['CampaignId']][] = $this->model_record->week_data($x, $item, $StartDate); - scrowler
非常感谢scrowler,那真的帮了我很多。我已经更新了我的帖子,关于如何格式化for循环以在视图上显示我的信息,我还不确定。 - Nathan_Sharktek
2个回答

1

您可以在for循环期间将您的周数据添加到一个数组中,由活动ID作为数组键进行标识,然后将其传递给您的视图:

foreach($data['campaigns'] as $item) {
    for($x = 0; $x < 7; $x++) {
        $data['CampaignData'][$item['CampaignId']][] = $this->model_record->week_data($x, $item, $StartDate);
    }
}

然后你可以像这样输出你的数据:

foreach($data['CampaignData'] as $campaign_id => $week_data) {
    echo 'Campaign: ' . $campaign_id . ', web hits: ' . implode(', ', $week_data) . PHP_EOL;
}

你当然可以更好地格式化输出,但这个例子应该会给你想要的结果,例如:

活动:1,网络点击量:55、63、32、39、22、33、61


我无法用语言表达对你们俩的感激之情。这对我来说非常有启发性。不幸的是,尽管我按照你们的建议更改了代码,但是我收到了“foreach()提供了无效参数”的信息和“data未定义”的信息。 - Nathan_Sharktek
你需要更改$data变量以反映CodeIgniter视图中的变量名称(是$CampaignData吗?)我不熟悉CodeIgniter。 - scrowler
成功了!这是我的疏忽 -- 我会更新完整的编辑代码。非常感谢!我想我可能会哭。 - Nathan_Sharktek

0

你的for循环语句看起来不正确。如果你想循环7次,把它改成

for($i = 0; $i <= 6; $i++)

您的最终代码可能应该长这样

foreach($data['campaigns'] as $item) {
    $data[$item['CampaignId']] = array();
    for($x = 0;$x <= 6;$x++) {
        $data[$item['CampaignId']][] = $this->model_record->week_data($x,$item,$StartDate);
    }
}

这将给你 8 次重复 - 将 <= 替换为 < 可获取七天,或者将 $x 从零改为一开始。 - scrowler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接