Ein Array in 3 Arrays aufteilen!

Loomis

Mitglied Bunt
Zuerstmal etwas Code.
PHP:
// Vorher Datenbankzeug...
    $data = array();

    while( $row = $result->fetch_assoc() )
    {
        array_push
        (
            $data,
            array
            (
                'id' => $row['id'],
                'name' => htmlentities ( $row['name'] )
            )
        );
    }
$data ist nun ein schönes foreach-taugliches Array für mein HTML-Template. Was auch gut funktioniert, bisher.

Folgendes Template möchte ich gerne mit Daten füllen (die <table>-Tags sind dazu da um es besser zu veranschaulichen, ich Layoute natürlich ohne Tabellen!):
PHP:
<table>
    <tr>
        <td valign="top"> <!-- Linke Spalte -->
            <table width="300" border="1">

                <?php foreach( $data_1 AS $left ): ?>
                <tr>
                    <td><?php echo $left['id']; ?></td>
                    <td><?php echo $left['name']; ?></td>
                </tr>
                <?php endforeach; ?>

            </table>
        </td>
        <td valign="top"> <!-- Mittlere Spalte -->
            <table width="300" border="1">

                <?php foreach( $data_2 AS $middle ): ?>
                <tr>
                    <td><?php echo $middle['id']; ?></td>
                    <td><?php echo $middle['name']; ?></td>
                </tr>
                <?php endforeach; ?>

            </table>
        </td>
        <td valign="top"> <!-- Rechte Spalte -->
            <table width="300" border="1">

                <?php foreach( $data_3 AS $right ): ?>
                <tr>
                    <td><?php echo $right['id']; ?></td>
                    <td><?php echo $right['name']; ?></td>
                </tr>
                <?php endforeach; ?>

            </table>
        </td>
    </tr>
</table>
Dazu habe ich mir von array_slice viel erhofft. So weit bin ich bisher:
PHP:
$count = count( $data ); 
$data_1 = array_slice($data, 0, $count-$count/3*2  );
$data_2 = array_slice($data, $count-$count/3*2, $count-$count/3*2 );
$data_3 = array_slice($data, $count-$count/3 );
Scheint zu funktionieren, gefällt mir aber irgendwie nicht :/
Gibt es da eine schönere Lösung? Mir fällt nichts mehr ein.
 
Zuletzt bearbeitet:
Besseres Ergebnis, aber ekelhafter Code :)
PHP:
$count = count( $data );

$rows = round( $count/3 );

$data_1 = array_slice( $data, 0, $count-$rows*2  );

$count_2 = ( $count - count( $data_1 ) ) / 2;

$data_2 = array_slice( $data, $count-$rows*2, $count_2 );

$count_3 = $count - ( count( $data_1 ) + count( $data_2 ) );

$data_3 = array_slice( $data, $count-$count_3 );

Bei einem Array mit 25 Elemente bekomme ich nun:
Code:
$data_1 => 9 Elemente
$data_2 => 8 Elemente
$data_3 => 8 Elemente
So wie es sein soll.
Wenn jemand eine bessere Idee hat, nur her damit.

//edit:
99 Elemente:
Code:
$data_1 => 33 Elemente
$data_2 => 33 Elemente
$data_3 => 33 Elemente
70 Elemente:
Code:
$data_1 => 24 Elemente
$data_2 => 23 Elemente
$data_3 => 23 Elemente
Sieht also gut aus vom Ergebnis her.
 
Zuletzt bearbeitet:
Eine andere Möglichkeit:
PHP:
$segments = 3;
$array = array();
$count = count($data);
for ($i=0; $i<$count; $i++) {
	$array[floor($i/$count*$segments)][] = $data[$i];
}
 
Ok, habe noch eine andere Möglichkeit gefunden. Ich war ja die ganze Zeit darauf fixiert 3 einzelne neue Arrays zu erstellen, die ich dann schön mit foreach durchlaufen lassen kann.
Das muss ich aber garnicht.
Mit folgender Zeile:
PHP:
$new_data = array_chunk( $data , round( count( $data )/3 ) );
Und einer kleiner Änderung im Template:
PHP:
foreach( $new_data[0] AS $left ):
foreach( $new_data[1] AS $middle ):
foreach( $new_data[2] AS $right ):
komme ich (so wie es aussieht) zu extaxt dem gleichen Ergebnis (Siehe Bild).

Noch mehr Ideen?
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    55,5 KB · Aufrufe: 20
Zuletzt bearbeitet:
Zurück