【问题标题】:MVC multi-dim array displaying in viewMVC 多维度数组显示在视图中
【发布时间】:2016-09-09 16:20:20
【问题描述】:

我想不通这个。我还在学习数组,所以请放轻松。我正在使用 codeigniter。

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

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

我需要显示 9 个价格,从 1 次查找中提取:

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

在数据库中是这样的

我应该尝试从我的模型中所示的一次查找中执行此操作,还是应该进行多次查找,或者我应该只是在控制器设置变量中管理该查找,准备显示视图或只是在视图中做所有事情?如何?唯一想到的 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>';
}

【问题讨论】:

  • 感谢大家的回答,以及一些有趣的解决方法。我正在更新我的帖子,说我最终做了什么。不确定是否出于任何原因这是一种不好的方式,但它似乎是最短和最整洁的。 Array_chunk 看起来也很整洁,但不是真正可扩展的,虽然我不认为会添加更多,你永远不知道。
  • 非常感谢您发布此内容。

标签: php arrays codeigniter


【解决方案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); 
   }  

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

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

记住你最好的朋友在做数组时是用 pre 标签包裹的 print_r 就像

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

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

【讨论】:

    【解决方案2】:

    这是一种非常简单的方法,可以将 db 返回排序到单独的数组中,然后显示它们。 @caralot 抢了我的风头,所以我想出了这个替代方案。

    使用您当前的模型 return $this-&gt;db-&gt;get('prices')-&gt;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-&gt;db-&gt;order_by('level', 'ASC'); 调用。

    【讨论】:

    • 这里有一些雷声,我们可以分享 :-) 所以我想你的方法的一个优点是如果需要你可以很容易地访问其他字段,比如数量等,因为你得到了整行。
    【解决方案3】:

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

    没有“最佳”方法可以做到这一点,这完全取决于布局的复杂性、未来的数据开发和您的要求。通常,尽管您尽量减少查询的数量,并在您的视图中将数据操作保持在最低限度。因此,理想情况下,您将拥有三个数组,每列一个,发送到您的视图。

    【讨论】:

      【解决方案4】:

      在您的控制器中,

          $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>";
        }
      }
      
      
      
      ?>
      

      【讨论】:

      • 这很有趣 - 但你要如何把它放到视图中?
      • 您已经设置了数组并将它们传递给视图。所以我可能是错的,但我认为你想检查它们是否在视图中是空的。
      • 你是对的,我使用 isset() 而不是 empty() 作为视图中的数组。
      猜你喜欢
      • 2012-06-26
      • 2019-02-19
      • 2021-02-20
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多