2016-09-09 7 views
2

Ich kann nicht durch meinen Weg denken. Ich lerne immer noch Arrays, also geh einfach zu mir. Ich benutze Codeigniter.MVC multi-dim Array Anzeige in Sicht

Ich habe 3 Tabs (1 Monat, 2 Monate, 3 Monate) in meinem Mark-Up.

Jede Registerkarte zeigt 3 Preisfelder (3 Ebenen - Basis = 1, Standard = 2, Funktion = 3).

Ich brauche insgesamt 9 Preise anzuzeigen, zog von 1 Nachschau:

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

In der Datenbank, wie es ist dieser

enter image description here

Soll ich es versuchen, von einem zu tun Nachschlagen, wie in meinem Modell gezeigt, oder sollte ich mehrere Look-ups machen, oder sollte ich nur diese Nachschlagen in den Controller-Einstellungen vars, bereit in der Ansicht anzuzeigen oder einfach alles in der Ansicht tun? Und wie? Die einzige denkt an 3x foreach-Schleife, wo ich in der Schleife sagen:

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

Ich mag den besten Weg, wissen, dies zu tun, sondern auch, wie das Array von einem Look-up zu tun, weil ich denke, Ich muss wirklich den Kopf um Arrays richtig bekommen. Thanks :)

- EDIT zu zeigen, was ich mit unten gelandet -

In der Steuerung, eine Art von array_chunk inspiriert aber mehr manuelle und für die Tabelle zu ermöglichen, zu erweitern ist Einstellen Array-Schlüssel, die ich auf in pHP-Handbuch nachlesen:

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

in der Ansicht Dann einfach foreach für einen Monat benutze ich kann:

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

Vielen Dank an alle für ihre Antworten, einige interessante Möglichkeiten, um ihn herum. Ich aktualisiere meinen Beitrag, um zu sagen, was ich getan habe. Nicht sicher, ob es aus irgendeinem Grund ein schlechter Weg ist, aber es scheint der kürzeste und sauberste. Array_chunk schien auch sauber zu sein, aber nicht wirklich erweiterbar, obwohl ich nicht glaube, dass mehr hinzugefügt wird, man weiß es nie. – tobzzz

+0

cool danke für das Posten. – cartalot

Antwort

0

Es ist so ein winziger Datensatz, dass Sie auf jeden Fall eine einzige Suche durchführen sollten. Es wäre sinnvoller, das Array in drei Arrays in Ihrem Controller zu sortieren, da es Ihre Ansicht viel sauberer macht und Ihnen erlaubt, Standardwerte festzulegen, falls keine Daten vorhanden sind (etwa Level 1 für 3 Monate entfernt). Sie werden immer drei Foreach-Schleifen benötigen, es sei denn, Sie erstellen die gesamte Tabelle auf einmal, setzen Brüche und neue Spaltenüberschriften, wenn sich der Füllstandsanzeiger ändert.

Es gibt keine "beste" Möglichkeit, dies zu tun, es hängt von der Komplexität des Layouts, der zukünftigen Datenentwicklung und Ihren Anforderungen ab. In der Regel minimieren Sie jedoch die Anzahl der Abfragen und halten die Datenbearbeitung in Ihren Ansichten auf ein Minimum beschränkt. Im Idealfall werden Sie drei Arrays haben, eines für jede Spalte, die zu Ihrer Ansicht gesendet werden.

1

Ich habe dies nicht getestet, also könnte einen dummen Fehler gemacht haben - aber im Grunde können Sie durch jedes Ihrer Produkte foreach - ein Array erstellen - und dann dieses Array in Ihrer Sicht verwenden.

// 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 

so dann in Ihrem Controller - sicher etwas machen kam aus dem Modell zurück, um es zu Daten zuweisen, dann Daten zu Ihrer Ansicht passieren

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

und dann Ihrer Ansicht nach könnten Sie oder einfach nur foreach Echo jeden Preis aus, wenn er einem Layout folgen muss.

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

und merken Sie sich Ihre beste Freundin, wenn Arrays tun print_r in pre-Tags so wie

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

Meinungen - seine feine Sachen in der Steuerung und die Ansicht zu bauen, während Sie entwickeln und bauen aus . aber gewöhnen Sie sich an, Ihre Modelle umzuformen. Halten Sie Ihre Controller so sauber und dünn wie möglich. Wenn Ihre Ansichten komplizierte Datenstrukturen benötigen, erstellen Sie sie zuerst in einem Modell. Wenn etwas schief geht, kann Ihr Controller entscheiden, was zu tun ist. UND du musst deine Ansicht nicht einchecken, wenn $ prices gesetzt und gültig ist, weil du es bereits getan hast. Dies minimiert, wo Dinge schief gehen können.

1

Hier ist eine ziemlich einfache Möglichkeit, die Db-Rückgabe in separate Arrays zu sortieren und sie dann anzuzeigen. @Caralot hat meinen Donner gestohlen, also habe ich diese Alternative gefunden.

Verwenden Sie Ihr aktuelles Modell return $this->db->get('prices')->result_array(); und ordnen Sie es $ data zu.

$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>'; 
} 

Wenn Ihre Tabelle weniger bestellt wurde als das, was Sie zeigen, wäre es notwendig, einen $this->db->order_by('level', 'ASC'); Aufruf der Abfrage hinzuzufügen.

+0

Hier ist etwas Donner, es ist ok, wir können es teilen :-) Also ich denke, ein Vorteil Ihrer Methode ist, dass Sie leicht Zugang zu anderen Feldern haben könnten, wie zum Beispiel Quantität, weil Sie die ganze Reihe bekommen. – cartalot

0

In Ihrem Controller,

$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); 

aus Ihrer Sicht das heißt myview in meinem Fall

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



?> 
+0

Das ist interessant - aber wie willst du das zum View bringen? – cartalot

+0

Sie haben die Arrays bereits festgelegt und sie an die Ansicht übergeben. Ich könnte also falsch liegen, aber ich denke, dass Sie überprüfen möchten, ob sie leer oder nicht in der Ansicht sind. – cartalot

+0

Sie haben Recht, ich habe isset() statt leer() für Array in Sicht verwendet. –