2010-12-29 18 views
0

muss ich mit fünf Artikel pro div (und die verbleibenden Elemente in der letzten div) aus Zufallszahl von $ totalItems Zufallszahl von divs erzeugen und auch nicht alle Einzelteile $ erfüllen OKItems ... Hoffentlich erklärt der Code besser als ich.Zufallszahl von divs mit Zufallszahl von Elementen mit PHP

Mein Problem ist, dass dieses Skript leere Divs mit keinem Inhalt in ihnen generiert.

<?php 

    $OKItems = 0; 
    $totalItems = rand(2,30); 

    for ($i = 0; $i < $totalItems; $i++) { 
    echo ($OKItems == 0 || $OKItems % 5 == 0) ? 'div open<br />' : ''; 

    $testValue = rand(0, 1); 
    if ($testValue != 0) { 
     echo '1'; 
     $OKItems++; 
    } 

    echo ($OKItems % 5 == 0 || $i+1 == $totalItems) ? '<br />div close<br />' : ''; 
    } 

?> 

Dies ist, was ich bekommen könnte:

div open 

div close 
div open 
11111 
div close 
div open 

div close 
div open 

div close 
div open 
11 
div close 

Und das ist, was ich in diesem Fall gewünscht haben:

div open 
11111 
div close 
div open 
11 
div close 
+0

Bitte wählen Sie eine der gegebenen Antworten und akzeptieren Sie sie –

Antwort

1
<?php 

const N = 5; 
$totalItems = rand(2,30); 

$items = array() ; 
for ($i = 0; $i < $totalItems; $i++) { 
    $testValue = rand(0, 1); 
    if ($testValue != 0) { 
     $items[] = 1 ; 
    } 

    if(N == sizeof($items) || (($i == $totalItems - 1) && 0 < sizeof($items)) ) { 
     echo "<div>" . join(",", $items) . "</div>"; 
     $items = array() ; 
    } 
} 
+0

@ St.Woland - die 'const' sieht nicht wie ein Mitglied aus dem Kreis der PHP ... – ajreal

+0

@ajreal Ich habe den Code getestet, und Sie sollten es auch tun, bevor Sie Kommentare schreiben. Sie können 'error_reporting (E_ALL)' nach '

+0

@ St.Woland - 'const' nur für Klasse, nicht in prozeduraler Hinsicht – ajreal

0
<?php 
$OKItems = 0; 
$totalItems = rand(2,30); 

for ($i = 0; $i < $totalItems; $i++) { 
    echo ($OKItems == 0 || $OKItems % 5 == 0) ? 'div open<br>' : ''; 

    $testValue = rand(0, 1); 
    if ($testValue != 0) { 
    echo '1'; 
    $OKItems++; 
    } 

    if($OKItems % 5 == 0 || $i+1 == $totalItems) { 
     echo '<br>div close<br>'; 
     $OKItems = 0; 
    } 
} 

?> 

Das Arbeits werden sollte;)

Ich habe Ihre Check-Zeile für eine IF Fu geändert nction, die auch Ihre $ OKItems zurücksetzt. Das Problem, das Sie hatte (glaube ich) war, dass Sie eine 0 als Zufallswert bekam und dass $ OKitems auf 5.

+0

Getested dies kurz und das machte auch leere divs. Danke trotzdem - zumindest wurde mein Problem gelöst. :) – Damiqib

1

halten würde ich denken, dass Sie ein bisschen mehr Struktur, um Ihren Code benötigen.

Mein Ansatz wäre, es zu brechen in mehrere Stufen nach oben, im Gegensatz zu versuchen, die gesamte Logik in der Schleife zu tun, die Daten ausgibt.

Was würde ich vorschlagen:

  1. Entscheiden Sie, wie viele Elemente
  2. -Test jedes Element getestet werden und nur diejenigen, kopiert, die
  3. Partition diese neue Array in ein neues Array übergeben wird in Sätze von 5
  4. Output jede Partition als div

-Code (ungetestet):

// Decide how many items to test 
$totalItems = rand(2,30); 

// Test these items and add them to an accepted array 
$items = Array(); 
for ($i = 0; $i < $totalItems; $i++) { 
    $testValue = rand(0, 1); 
    if ($testValue != 0) { $items[] = "1" } 
} 

//Partition them into sections 
$partitions = array_chunk($items,5); 

//Output as divs 
foreach($partitions as $partition): 
    echo 'div open <br />'; 
    foreach($partition as $item): 
     echo $item . "<br />"; 
    endforeach; 
    echo 'div close <br />'; 
endforeach; 

Wenn Sie den Code in logische Schritte aufgeteilt, es viel leichter zu pflegen und zu debuggen wird.

+1

Vielen Dank für eine nette Antwort. Dies hätte funktioniert, aber @ St.Woland hat eine Lösung gefunden, die einfacher in meinen aktuellen Code implementiert werden konnte. – Damiqib