在视图

时间:2016-09-09 16:20:20

标签: php arrays codeigniter

我无法通过这个思考。我还在学习数组,所以对我很轻松。我使用的是codeigniter。

我的标记中有3个标签(1个月,2个月,3个月)。

每个标签显示3个价格框(3个级别 - 基本= 1,标准= 2,特色= 3)。

我需要整体显示9个价格,从1个查询中提取:

return $this->db->get('prices')->result_array();

在数据库中,它就像这样

enter image description here

我应该尝试从我的模型中显示的一个查找中执行此操作,还是应该进行多次查找,或者我应该只是在控制器设置变量中管理该查找,准备显示在视图或只是在视图中执行所有操作?如何?只考虑3x foreach循环,我在循环内部说:

if($prices['months']==3) echo $prices['level'].' is '.$prices['amount'].'<br>';

我想知道最好的方法,但也想知道如何通过一次查找来完成数组,因为我认为我真的需要正确地理解数组。谢谢:))

- 编辑以显示我最终使用的内容 -

在控制器中,有点受array_chunk启发,但更多是手动的,并允许表扩展,是设置数组键,我在php手册中读到:

foreach ($prices as $price_row) {
    $data['prices'][$price_row['months']][] = $price_row;
}

然后在视图中我可以使用foreach一个月:

foreach ($prices[1] as $p) {
    echo level_name($p['level']).' = '.$p['amount'].'<br>';
}

4 个答案:

答案 0 :(得分:1)

我没有对此进行测试,所以可能会犯一个愚蠢的错误 - 但基本上你可以预先通过你的每个产品 - 制作一个数组 - 然后在你的视图中使用该数组。

    // in your model Note I am returning an object not an array 
    // and always check to make sure something got returned 
    if( ! $products = $this->db->get('prices')->result() )
    {
       return false: 
    } 
    else
    {     
    $prices = array(); 

    foreach($products as $product)
    {
       // append the months number to the word 'months' to make it clear
       $month =  $product->months . 'month' ; 

       // same with level 
       $level =  'level' . $product->level ; 

       // build the array
       $prices[$month][$level] = $product->amount ; 

    }//foreach

    return $prices ; 

   }//else

然后在您的控制器中 - 确保从模型中返回某些内容,将其分配给数据,然后将数据传递到您的视图

   if( ! $data['prices'] = $this->somemodelname->returnPrices() )
   {
       $this->showError() ; 
   }
   else
   {
       $this->load->view('yourviewname', $data); 
   }  

然后在您的视图中,如果需要遵循某些布局,您可以预先或只是回显每个价格。

 echo '1 month level 1 $' . $prices['1month']['level1'] ; 

并且在做数组时记住你最好的朋友是print_r包装在pre标签中,就像

一样
  echo 'start prices <br> <pre>' ;
    print_r($prices) ;
   echo '</pre>' ;

意见 - 在开发和构建时,可以在控制器和视图中构建内容。但要养成重构模型的习惯。保持控制器尽可能干净和薄。如果您的视图需要复杂的数据结构 - 首先在模型中构建它们。这样一来,如果出现问题 - 你的控制器可以决定做什么。如果$ price已设置且有效,您无需检查您的视图,因为您已经完成了。这可以最大限度地减少出错的地方。

答案 1 :(得分:1)

这是一种非常简单的方法,可以将db返回到单独的数组中,然后显示它们。 @caralot偷走了我的雷声,所以我提出了这个替代方案。

使用您当前的模型return $this->db->get('prices')->result_array();并将其分配给$ data。

$data = $this->db->functionName();
//You should check $data validity but I'm skipping that
$month1 = [];
$month2 = [];
$month3 = [];
foreach($data as $row)
{
    if($row['months'] === '1')
    {
        $month1[] = $row;
    }
    elseif($row['months'] === '2')
    {
        $month2[] = $row;
    }
    else
    {
        $month3[] = $row;
    }
}
echo "Month 1<br>";
foreach($month1 as $month){
     echo "Level ". $month['level'].' is '.$month['amount'].'<br>';
}
echo "Month 2<br>";
foreach($month2 as $month){
     echo "Level ".$month['level'].' is '.$month['amount'].'<br>';
}
echo "Month 3<br>";
foreach($month3 as $month){
     echo "Level ".$month['level'].' is '.$month['amount'].'<br>';
}

如果您的表格的排序低于您显示的内容,则需要在查询中添加$this->db->order_by('level', 'ASC');次调用。

答案 2 :(得分:0)

这是一个非常小的数据集,您绝对应该进行单一查找。将数组排序到控制器中的三个数组会更有意义,因为它会使您的视图更清晰,并且如果您需要,如果没有数据(例如3个月的级别1被删除),则允许您设置默认值。除非你一次性构建整个表,在水平指示器改变时设置中断和新的列标题,否则你总是需要三个foreach循环。

没有'最好'的方法可以做到这一点,所有情况都取决于布局的复杂性,未来的数据开发和您的要求。通常,尽量减少查询次数,并在视图中将数据操作保持在最低限度。理想情况下,您将有三个阵列,每列一个,发送到您的视图。

答案 3 :(得分:0)

在你的控制器中,

    $result = $this->db->query("SELECT * from prices");
    $result=$result->result();
    $tab1=array();
    $tab2=array();
    $tab3=array();
    foreach ($result as $res) {
        switch($res->months)
        {
            case 1: array_push($tab1, $res);
            break;
            case 2: array_push($tab2, $res);
            break;
            case 3: array_push($tab3, $res);
            break;
        }
    }
    //var_dump($tab3); //array tab1 for month1, array tab2 for month2, array tab3 for month3
   $data['tab1']=$tab1;
   $data['tab2']=$tab2;
   $data['tab3']=$tab3;
   $data['include']=$this->load->view('myview', $data);  

在你看来,即我的观点,

<?php
if(!empty($tab1))
{
    echo "Tab 1"."<br>";
    foreach($tab1 as $tb)
    {

      echo "For level ".$tb->level." price is ".$tb->amount."<br>";
  }
}
if(!empty($tab2))
{
    echo "Tab 2"."<br>";
    foreach($tab2 as $tb)
    {

      echo "For level ".$tb->level." price is ".$tb->amount."<br>";
  }
}
if(!empty($tab3))
{
    echo "Tab 3"."<br>";
    foreach($tab3 as $tb)
    {

      echo "For level ".$tb->level." price is ".$tb->amount."<br>";
  }
}



?>