PHP – Tricky … arrays in colonne, ma in un ordine specifico

<?php $combinedArray = arrays("apple","banana","watermelon","lemon","orange","mango"); $num_cols = 3; $i = 0; foreach ($combinedArray as $r ){ /*** use module to check if the row should end ***/ echo $i++%$num_cols==0 ? '<div style="clear:both;"></div>' : ''; /*** output the arrays item ***/ ?> <div style="float:left; width:33%;"> <?php echo $r; ?> </div> <?php } ?> <div style="clear:both;"></div> 

Il codice precedente stamperà la matrix in questo modo:

mela — banana — anguria

limone — arancia — mango

Tuttavia, ho bisogno di questo in questo modo:

mela — anguria — arancione

banana — limone — mango

Sai come convertire questo? Fondamentalmente, each valore dell'arrays deve essere posizionato al di sotto di quello sopra, ma deve essere basato su questa stessa struttura di 3 colonne, e anche una uguale quantità di frutti per colonna / row (a less che non ci fossero come 7 frutti ci sarebbe 3 in una colonna e 2 nelle altre colonne.

Scusa, lo so che è confuso lol

Grazie a tutti per il vostro aiuto … Ho realizzato un modo migliore di farlo comunque. Semplicemente, ho 3 colonne fluttuanti l'una accanto all'altra. E in each colonna, aggiungo un elenco degli elementi in esso e si fermano quando colpisco gli articoli massimi per row.

codice di lavoro:

 <div style="float:left; width:33%;"> <?php $combinedArraySizeOf = sizeof($combinedArray); $num_cols = 3; $iPerRow = $combinedArraySizeOf / $num_cols; for ($i=0; $i!=$combinedArraySizeOf; $i++){ if ($i % $iPerRow == 0){ echo '</div><div style="float:left; width:33%;">'; } echo $combinedArray[$i]."<br />"; } ?> </div> <div style='clear:both;'></div> 

Non dimenticare di cancellare entrambi alla fine, se necessario: P

Perché non stai facendo esattamente quello che vuoi fare? Voglio dire mostrarli in colonne, invece di righe?

 $combinedArray = arrays("apple","banana","watermelon","lemon","orange","mango"); $num_cols = 3; $rowCount = ceil(count($combinedArray)/$num_cols); $i = 1; // in order the modulus to work correctly ?> <div style="float: left; width:33%"> <!-- this is the first column --> foreach ($combinedArray as $r ){ ?> <div> <!-- just a div containing $r --> <?php echo $r; ?> </div> <?php // this is where the magic happens // check if we have enough rows and start another column if ($i % $rowCount == 0) { ?> </div> <!-- close the previous column and start a new one --> <div style="float: left; width:33%"> <!-- this is the new column --> <?php } $i++; } ?> </div> <!-- closing the last open column --> <div style="clear:both;"></div> 

Questo dovrebbe fare solo il lavoro che desideri. La risposta di Marvin è migliore se vuoi usare solo tabelle senza div.

 $combinedArray = arrays("apple","banana","watermelon","lemon","orange","mango"); $step = 2; $i = 0; $new_arrays = arrays(); foreach ($combinedArray as $r ){ $remainder = ($i % $step); $new_arrays[$remainder][] = $r; $i++; } foreach($new_arrays as $arrays) { echo implode(' --- ', $arrays)."<br>"; } 

Funzionerebbe?

 $combinedArray = arrays("apple","banana","watermelon","lemon","orange","mango"); $num_cols = 3; $rows = ceil(count($combinedArray)/$num_cols); for($i = 0; $i < $rows; $i++){ for($j = 0; $j < $num_cols; $j++){ echo $combinedArray[(($i+$j) * $rows)-$i]; } echo "<br />"; } 

Ciò dovrebbe anche verificare che il valore esistesse per i casi in cui il numero di elementi non era esattamente divisibile per il numero di colonne, è ansible farlo con la seguente modifica:

 $combinedArray = arrays("apple","banana","watermelon","lemon","orange","mango"); $num_cols = 3; $rows = ceil(count($combinedArray)/$num_cols); for($i = 0; $i < $rows; $i++){ for($j = 0; $j < $num_cols; $j++){ $cell = (($i+$j) * $rows)-$i; if($cell > count($combinedArray)) break; echo $combinedArray[$cell]; } echo "<br />"; } 

Se questo ordine è ciò che idealmente desideri, ma non è fondamentale che funzioni in tutti i browser, forse dovresti esaminare il layout di colonne (ancora una bozza css3 ancora molto sperimentale). Se usi il block inline di dispay per l'elemento in each colonna, avrai l'ordine corrente come fallback.

Puoi anche usare una tabella per il layout e usare un ciclo for qualcosa come questo (codice pseudo php, è da un po 'che non ho programmato alcun php):

 maxHeight = Math.ceil(arrays.length / 3) // meaning length=6 will give 3, // length=7 will give 4 $x = -1; // horizontal index for(i = 0; i < arrays.length(); i++){ $y = i % maxHeight; // vertical index if($y == 0){ $x++; } addToTable($x,$y, arrays[i]); }