text email "formatieren" ?

splat

Erfahrenes Mitglied
Hallo,

ich weiß gar nicht so recht, in welches Forum ich diese Frage posten soll.. doch da ich die Text Email mit php generiere, versuche ich es einfach mal hier..

Und zwar würde ich gerne reine Text Emails so wie hier abgebildet erstellen:

Code:
Netto                         EUR   189,60
Mwst.                         EUR    30,35
Brutto                        EUR   219,95
Porto                         EUR     5,00
Verpackung & Versicherung     EUR     2,00
Gesamtbetrag                  EUR   226,95

Menge      EP           GP  Art.No. Artikelbeschreibung
----------------------------------------------------------------------------
    1   34,99    34,99 EUR  123123  xxxxxxxxxxxxx
    1   79,99    79,99 EUR  123123  xxxxxxxxxxxxxxxxxxxx
    1   29,99    29,99 EUR  123123  xxxxxxxxxxxxxxxxxxx
    1   29,99    29,99 EUR  123123  xxxxxxxxxxxxxx
    1   44,99    44,99 EUR  123123  xxxxxxxxxxxxxxxxxx

Es geht mir hierbei um diese tabellarische Form, oder auch oben um diese Gliederung... Wie schafft man es, alles sauber untereinander zu kriegen, ohne mit Tabstops zu arbeiten? Wird hier bei jedem Wert nachgeschaut, wieviele Stellen dieser besitzt, und der Rest wird dann mit Leerzeichen gefüllt? Oder wie bekommt man so etwas hin?

Gruß,
Marc
 
Diese Vorgehensweise wäre möglich:
PHP:
<?php

	$data = array(
		array(
			'Menge'   => 1,
			'EP'      => '34,99',
			'GP'      => '34,99 EUR',
			'Art-Nr.' => 1,
			'Artikelbeschreibung' => 'xxxxxxxxxxxxx'
		),
		array(
			'Menge'   => 12345,
			'EP'      => '1,99',
			'GP'      => '1,99 EUR',
			'Art-Nr.' => 123,
			'Artikelbeschreibung' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
		),
		array(
			'Menge'   => 1,
			'EP'      => '174,99',
			'GP'      => '174,99 EUR',
			'Art-Nr.' => 12345,
			'Artikelbeschreibung' => 'xxxxxxxxxxxxx'
		)
	);
	$align = array(
		'Menge'   => STR_PAD_LEFT,
		'EP'      => STR_PAD_LEFT,
		'GP'      => STR_PAD_LEFT,
		'Art-Nr.' => STR_PAD_LEFT,
		'Artikelbeschreibung' => STR_PAD_RIGHT
	);

	$lengths = array();
	foreach( $data as $item ) {
		foreach( $item as $key => $value ) {
			if( !isset($lengths[$key]) ) {
				$lengths[$key] = 0;
			}
			$tmp = strlen($value);
			$lengths[$key] = $tmp > $lengths[$key] ? $tmp : $lengths[$key];
		}
	}

	echo '<pre>';
	foreach( array_keys($data[0]) as $value ) {
		$tmp = strlen($value);
		$lengths[$value] = $tmp > $lengths[$value] ? $tmp : $lengths[$value];
		echo str_pad($value, $lengths[$value], ' ', $align[$value]).str_repeat(' ', 2);
	}
	echo "\n".str_repeat('-', array_sum($lengths)+(count($lengths)*2)-2);
	foreach( $data as $item ) {
		echo "\n";
		foreach( $item as $key => $value ) {
			echo str_pad($value, $lengths[$key], ' ', $align[$key]).str_repeat(' ', 2);
		}
	}
	echo '</pre>';

?>
 
Hallo Gumbo!

Vielen Dank für die schnelle Hilfe! Das Teil läuft super, und alleine hätte ich so etwas ganz bestimmt nicht hingekriegt :)
Was ich noch fragen wollte.. was wird denn mit der Zeile echo '<pre>'; bewirkt? Sollte das nicht auch "\n" heißen?

Gruß,
Marc
 
Hallo nochmal..
ich komme gerade wieder mal nicht weiter, und bekomme über diese Schleife meine Produkte nicht rein :( $data bleibt einfach komplett leer.
Sieht hier jemand vielleicht den Fehler/Denkfehler?

PHP:
$data = "";

while ($qid = db_fetch_object($dbquery)) {
    $data .= array(
        array(
        'Menge'   => $qid->qty,
        'EP'      => $qid->price,
        'GP'      => $qid->total,
        'Art-Nr.' => $qid->artno,
        'Artikelbeschreibung' => $qid->name
        )
    );
}
 
Die $data-Variable muss ein zweidimensionales Array sein:
PHP:
$data = array();
while( $qid = db_fetch_object($dbquery) ) {
	$data[] = array(
		'Menge'               => $qid->qty,
		'EP'                  => $qid->price,
		'GP'                  => $qid->total,
		'Art-Nr.'             => $qid->artno,
		'Artikelbeschreibung' => $qid->name
	);
}
 
Zurück