2016-05-06 20 views
1

Also, ich habe ein zweidimensionales Array:Dynamische Zählung basierend auf dem Wert

$fruits = array 
    (
    array('fruit' => 'Apple', 'rating' => '2'), 
    array('fruit' => 'Pear', 'rating' => '3'), 
    array('fruit' => 'Peach', 'rating' => '2'), 
    array('fruit' => 'Strawberry', 'rating' => '2') 
); 

Ich brauche einen ausdrücklichen Auftrag zu bekommen. In dem obigen Beispiel möchte ich daher eine table anzeigen, die drei col s -> fruit, rating und rank enthält. Wenn es eine Gleichheit in den Bewertungen gibt, dann möchte ich radio buttons in der dritten Spalte mit den möglichen Rängen haben. Das ist, was ich meine:

enter image description here

Bisher habe ich das unten Stück Code habe, die nur in der Lage zu sagen, ob es eine andere Frucht mit dem gleichen Rating ist, und wenn ja, es zeigt Radios 1 bis 4 . Dies ist eine sehr unfreundliche Lösung. Also wie kann ich es leicht aufbauen unter Berücksichtigung der Tatsache, dass die Bewertung alles sein kann. Für z.B. 2-2-3-3 in diesem Fall brauche ich Radios 1-2,1-2 und 3-4,3-4.

PHP:

echo "<table><tr><td>fruit</td><td>rating</td><td>rank</td></tr>"; 
for($i = 0; $i < count($fruits); ++$i) { 
    echo "<tr><td>".$fruits[$i]['fruit']."</td><td>".$fruits[$i]['rating']."</td><td>";  
    for($j = 0; $j < count($fruits); ++$j) { 
     if($i != $j) { 
      if($fruits[$i]['rating'] == $fruits[$j]['rating']) { 
       echo "<input type=\"radio\" name=\"".$fruits[$i]['fruit']."\" value=\"1\">1 
       <input type=\"radio\" name=\"".$fruits[$i]['fruit']."\" value=\"2\">2 
       <input type=\"radio\" name=\"".$fruits[$i]['fruit']."\" value=\"3\">3 
       <input type=\"radio\" name=\"".$fruits[$i]['fruit']."\" value=\"4\">4" 
       break; 
      } 
      else if ($j == 3) 
      { 
       echo "<b>".($i+1)."</b></td></tr>"; 
      } 
     } 
     else if ($j==3) 
     { 
      echo "<b>".($i+1)."</b></td></tr>"; 
     } 
    } 
} 
echo "</table>"; 

Grundsätzlich muss ich pro Bewertung eine Zählung haben für alle Fälle gibt es eine Gleichheit ist.

P. S .: Das Array ist bereits DESC basierend auf den Bewertungen sortiert, deshalb ($i+1) Werke in meinem Code.

Antwort

1

Da Sie bereits ein vorsortiertes Array haben, müssen Sie Bereiche finden.

Sobald Sie den Bereich haben, können Sie diese Reihe von Zeilen ausgeben.

Hier ist ein Beispiel:

echo "<table><tr><td>fruit</td><td>rating</td><td>rank</td></tr>"; 
$total = count($fruits); 
for($i=0; $i<$total; $i=$range_end+1) { 
    $range_start = $i; 
    while($i+1 < $total && $fruits[$i]['rating'] == $fruits[$i+1]['rating']) { 
     $i++; 
    } 
    $range_end = $i; 

    $range = array_slice($fruits, $range_start, $range_end-$range_start+1); 
    foreach($range as $fruit) { 
     echo "<tr>" 
      ."<td>".$fruit['fruit']."</td>" 
      ."<td>".$fruit['rating']."</td>" 
      ."<td>"; 
     if($range_start == $range_end) { 
      echo $fruit['rating']; 
     } 
     else { 
      for($j=$range_start; $j<=$range_end; $j++) { 
       echo '<input type="radio" name="'.$fruit['fruit'].'" value="'.$j.'">'.$j; 
      } 
     } 
     echo "</td>" 
     ."</tr>"; 
    } 
} 
echo "</table>"; 

Notiere die etwas unkonventionelle for $i Schleife. Was passiert hier ist, dass wir die Schleife bei 0 beginnen, die Position notieren, in der wir uns befinden, in $range_start, dann vorrücken, bis die Bewertung der nächsten Frucht anders ist. An diesem Punkt haben wir $range_end, die die gleiche wie $range_start sein können, wenn es keine Früchte mit der gleichen Bewertung gibt. Dann extrahieren wir den Bereich aus dem Array $fruits und geben ihn aus. Sobald dies geschehen ist, wird die Schleife einen Punkt nach dem Ende des Bereichs fortgesetzt, den wir gerade gemacht haben.

+0

ist fast perfekt. Alles, was ich ersetzte, ist 'echo $ fruit ['rating'];' wenn es das einzige in der Reihe ist, das echo ($ i + 1); 'so dass es nicht die 'Bewertung', sondern die richtige 'Rangfolge zeigt '. – fishmong3r

0

Hier ist, was würde ich vorschlagen:

$fruits = array(
    array('fruit' => 'Apple', 'rating' => '2'), 
    array('fruit' => 'Pear', 'rating' => '3'), 
    array('fruit' => 'Peach', 'rating' => '2'), 
    array('fruit' => 'Strawberry', 'rating' => '2') 
); 

// get unique ratings, in descending order 
$ratings = array_unique(array_column($fruits, 'rating')); 
sort($ratings); 
$ratings = array_fill_keys(array_reverse($ratings), array()); 

// put fruits in their respective rating buckets: 
foreach($fruits as $fruit) { 
    $ratings[$fruit['rating']][] = $fruit['fruit']; 
} 

// Generate the HTML table 
$html = "<table border=1><tr><th>fruit</th><th>rating</th><th>rank</th></tr>"; 
$rank = 1; 
foreach($ratings as $rating => $fruits) { 
    foreach($fruits as $fruit) { 
     if (count($fruits) === 1) { 
      $rankHtml = "<b>$rank</b>"; 
     } else { 
      $rankHtml = ""; 
      for ($i = $rank; $i < $rank + count($fruits); $i++) { 
       $rankHtml .= "<input type='radio' name='$fruit' value='$i'>$i"; 
      } 
     } 
     $html .= "<tr><td>$fruit</td><td>$rating</td><td>$rankHtml</td></tr>\n"; 
    } 
    $rank += count($fruits); 
} 
$html .= "</table>"; 

echo $html; 

Wie Sie sehen Ich mag die Logik von dem Ausgang zu trennen. Die einzige echo ist am Ende.

Das Hauptmerkmal dieser Methode ist die Zwischenstruktur, bei der die Obstnamen in Abhängigkeit ihrer gemeinsamen Bewertung in separate Arrays gruppiert werden. Dies führt, glaube ich, zu einem besseren Code.

0

Schauen Sie sich usort() an. Dies kann Ihr Array basierend auf einer benutzerdefinierten Funktion neu ordnen (oder klonen).

usort

+0

Ich brauche den Benutzer, um die Bestellung zu teilen, wenn die Bewertung gleich ist. Das Array ist bereits sortiert, wie ich in meiner Frage erwähnt habe. – fishmong3r

Verwandte Themen