2016-04-17 7 views
0

Ich habe das mysql resultiert aus einer alten SO Frage, wie die folgenden Array simuliert:Wie drucken Sie die wiederholten Zeilen korrekt?

<?php 
$arr = array(
      array(
      'title'=>'Test', 
      'name'=>'ABC', 
      'cat_desc'=>'ABC_DESC', 
      'parent'=>0, 
      'parent_menu'=>1 
      ), 
      array(
      'title'=>'Test2', 
      'name'=>'DEF', 
      'cat_desc'=>'DEF_DESC', 
      'parent'=>0, 
      'parent_menu'=>2 
      ), 
      array(
      'title'=>'Test2', 
      'name'=>'GHI', 
      'cat_desc'=>'GHI_DESC', 
      'parent'=>1, 
      'parent_menu'=>0 
      ), 
      array(
      'title'=>null, 
      'name'=>'JKL', 
      'cat_desc'=>'JKL_DESC', 
      'parent'=>2, 
      'parent_menu'=>0 
      ) 
    ); 
    //print_r($arr); 
    ?> 

Jetzt frage ich mich, wenn ich das Ergebnis in diesem Format gedruckt werden kann:

<table> 
    <tr> 
     <th>Name</th> 
     <th>Description</th> 
    </tr> 

     <tr>    
     <td> Menu Title Test </td> 
     <td> Main Category ABC</td> 
     </tr> 
     <tr> 
      <td>GHI</td> 
      <td>GHI_DESC</td> 
     </tr> 
     <tr>    
     <td> Menu Title Test2 </td> 
     <td> Main Category DEF</td> 
     </tr> 
     <tr> 
      <td>JKL</td> 
      <td>JKL_DESC</td> 
     </tr> 
    </table> 

ich folgenden versuche php zu drucken, aber es nicht geben konnte das erwartete Ergebnis:

<table> 
    <tr> 
     <th>Name</th> 
     <th>Description</th> 
    </tr> 
    <?php 
    $r = 0; 
    while(list($key, $val)=each($arr)) { 
    if($val['parent']==0):    
    if($r % 1==0): ?>      
     <tr>    
     <td> Menu Title <?php echo $val['title'];?> </td> 
     <td> Main Category <?php echo $val['name'];?></td> 
     </tr> 
    <?php endif;   
    endif;       
    if($val['parent']!=0){ ?> 
     <tr> 
      <td><?php echo $val['name'];?></td> 
      <td><?php echo $val['cat_desc'];?></td> 
     </tr> 
<?php 
    } 
    $r++; 
} ?> 
    </table> 

Ihre Hilfe und Anregung ist sehr willkommen.

Antwort

2

Ich finde es schwierig herauszufinden, was Sie genau von Ihrer Array-Struktur wollen. Aber ich habe bemerkt, dass Array-Element 0 mit Element 2 gepaart ist und Element 1 mit Element 3 gepaart ist. Daher wäre mein Code wie folgt. Es wird Ihnen genau den Tisch geben, den Sie wollten.

print "<table border=1>"; 

$numArray = count($arr)/2; 

for($i=0;$i<$numArray;$i++) { 
    $element = $arr[$i]; 
    print "<tr><td>Menu Title {$element['title']}</td><td>Main Category {$element['name']}</td></tr>"; 
    $element = $arr[$i+2]; 
    print "<tr><td>{$element['name']}</td><td>{$element['cat_desc']} </td></tr>"; 
} 

print "</table>"; 
+0

Ich akzeptiere Ihre Antwort, weil es hier am kürzesten ist. Vielen Dank. –

+0

Funktioniert es @ Peku Chawngthu –

0

Von dem, was ich sehe, glaube ich, $ r% 2 ein wenig mehr Sinn als $ r% 1

Bei $ r macht eine ganze Zahl, $ r% 1 wird immer eine Null zurück. Es sieht so aus, als ob Sie in diesem Fall die Logik für ungerade und gerade Zahlen aufteilen, was für Ihren Datensatz sinnvoll ist.

Stellen Sie sicher, dass sich der Datensatz nicht ändert. Vielleicht wäre es besser, einen zuverlässigeren Ansatz zu verwenden. Das Hinzufügen von Indizes zum Datensatz würde auch nicht schaden :)

+0

'$ r% 2' gibt nicht die zweite Schleife für die wiederholte Reihe zu tun kommentiert .ie ' Menü-Titel Test2 Hauptkategorie DEF ' –

+0

Wahrscheinlich, weil man von einem falschen Wert fängt. Versuchen Sie, den Wert von $ r in der Schleife zu wiederholen, um den Logiken zu folgen. Oder versuchen Sie ab $ r = 1 – Cthulchu

1

Ich finde, dass Daten aus einer relationalen DB nicht wirklich für den direkten Gebrauch geeignet sind und einige Massierungen erfordern, um die Komplexität des Codes zu verringern. Wenn Sie also ein dynamisches Menü mit Untermenüs erstellen möchten, würde ich vorschlagen, die Datenstruktur in eine Baumstruktur umzuwandeln und dann über jede Ebene zu schleifen.

Eine Struktur würde eine bessere Daten sein:

$menus = array( 
    1 => array(// original array item index 0 
    'title'=>'Test', 
    'name'=>'ABC', 
    'cat_desc'=>'ABC_DESC', 
    'parent'=>0, 
    'parent_menu'=>1 
    'children'=> array(// new array containing submenus 
     array(// original array item index 2 
     'title'=>'Test2', 
     'name'=>'GHI', 
     'cat_desc'=>'GHI_DESC', 
     'parent'=>1, 
     'parent_menu'=>0 
    ), 
    ), 
), 
    2 => array(// original array item index 1 
    'title'=>'Test2', 
    'name'=>'DEF', 
    'cat_desc'=>'DEF_DESC', 
    'parent'=>0, 
    'parent_menu'=>2 
    'children'=> array(// array containing original item index 2 
     array(
     'title'=>null, 
     'name'=>'JKL', 
     'cat_desc'=>'JKL_DESC', 
     'parent'=>2, 
     'parent_menu'=>0 
    ), 
    ), 
), 
); 

Anstatt nur die Daten in dieser mehr covenient Form eintritt, ist es gute Praxis, es zu konvertieren. Also, von den ursprünglichen Daten zu bekommen, um diese Struktur Sie eine einfache Arbeitsgang foreach-Schleife verwenden kann:

$menus = []; 
foreach($arr as $item) { 
    if($item['parent'] == 0) { 
    $item['children'] = array(); 
    $menus[$item['parent_menu']] = $item; 
    } 
    else { 
    $menus[$item['parent']]['children'][] = $item; 
    } 
} 

Nachdem Sie die Daten in einer schönen bequemen Form haben, können Sie einfach verschachtelten foreach verwenden Schleifen sie iterieren und Ausgang der Tisch in einer klaren Art und Weise wie folgt aus:

<table> 
    <tr> 
     <th>Name</th> 
     <th>Description</th> 
    </tr> 
    <?php foreach($menus as $menu) { ?> 
     <tr>    
      <td> Menu Title <?php echo $menu['title'];?> </td> 
      <td> Main Category <?php echo $menu['name'];?></td> 
     </tr> 
     <?php foreach($menu['children'] as $child) { ?> 
      <tr> 
       <td><?php echo $child['name'];?></td> 
       <td><?php echo $child['cat_desc'];?></td> 
      </tr> 
    <?php } } ?> 
</table> 
+0

danke für Ihre Zeit. Ich habe die Idee. –

1

Sie können dies nutzen, wo ich was und warum

<table> 
    <tr> 
     <th>Name</th> 
     <th>Description</th> 
    </tr> 
<?php 
// Store the array into temporary array 
$temp_array = $arr; 
foreach ($arr as $akey => $sArr) 
{   
    // Check that prrent is 0 
    if ($sArr['parent'] ==0) 
    { 
     // Store parent_menu id 
     $parent_menu = $sArr['parent_menu']; 
    ?> 
     <tr>    
     <td> Menu Title <?php echo $sArr['title'];?> </td> 
     <td> Main Category <?php echo $sArr['name'];?></td> 
     </tr> 
     <?php 
     // Unset or remove current index from array 
     unset($temp_array[$akey]); 
     // Iterate all rows  
     foreach ($temp_array as $skey => $aval) 
     {   
     // Check that it has parent for the current menu 
     if ($aval['parent'] == $parent_menu) 
     { 
     ?> 
      <tr> 
       <td><?php echo $aval['name'];?></td> 
       <td><?php echo $aval['cat_desc'];?></td> 
      </tr>   
     <?php 
     } 
     } 
     // End of foreach 
    } 
    // End of if 
} 
// End of foreach 
?> 
</table> 
+0

Bitte lassen Sie mich wissen, dass Sie fertig sind oder nicht –

+0

Danke, das funktioniert auch. –

Verwandte Themen