PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP Array_multisort/Mehrfachdimensionales Array


huberg
22.06.2009, 12:27:52
Hallo PHP-Künstler,
als Anfänger habe ich ein Problem mit der Textzeile.
Diese soll für ein Multisort von Zeilen in Spalten umgestellt werden.

Meine Textzeilen habe folgendes Aussehen:

20090614|Maier Anna|100|1. Mahnung|o
20090612|Meier Jo|120|bezahlt|bar
20090612|Meyer Vivi|130|B.Ueberweisung|y
20090530|Meier Herbert|10|bar|mtl.


$array = file("$DOCUMENT_ROOT/../htdocs/Daten/name_xyz.txt");
$anzahl_zeile = count($array);

foreach ( $array as $key => $zeile )
{
list ($datum, $name, $betrag, $bemerkung, $kz) = explode("|" , $zeile);

$datum[$key] = strtolower ( $zeile['datum'] );
$name[$key] = strtolower ($zeile['name']);
$betrag[$key] = strtolower ($zeile['betrag']);
$bemerkung[$key]= strtolower ($zeile['bemerkung']);
$kz[$key] = strtolower ($zeile['kz']);
.
.
switch ( $_GET['sortierung'] ) {
case ( "d" ):
array_multisort( $datum, SORT_ASC, $name, SORT_ASC, $array );
echo "nach switch d"; // nur fuer Test
break;

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in C:\xampp\htdocs\………………Name_out_2.php on line 58

Irgendwie ist etwas mit dem Aufsplitten der Textzeile in list()
oder dem nachfolgenden Code falsch.

Wie müsste dies für ein mehrdimensionalen Arrays aussehen ?
Ein Tipp oder sollte Jemand ein Script für ein ähnliche Aufgabe haben, bitte E-Mailen.

Thank you and Greatest Blessings (sagt man hier)

Huberg

DokuLeseHemmung
22.06.2009, 12:46:30
Ach komm...
Wonach soll sortiert werden?
Aus deinem Code ist wenig zu erkennen. Ihn durchzulesen habe ich auch wenig Lust.
1. Keine Code Erleuchtung
2. Bis zur unkenntlichkeit zerschnibbelt.

error_reporting(-1);
ini_set('display_errors', TRUE);

function transform_line(&$item)
{
$keys = array('datum','name','betrag','bemerkung','kz');
$item = trim($item);
$item = strtolower($item);
$item = array_combine($keys, explode("|",$item));
}

function by_datum($a, $b)
{
if ($a['datum'] == $b['datum'])return 0;
return ($a['datum']<$b['datum'])?-1:1;
}

$array = file("$DOCUMENT_ROOT/../htdocs/Daten/name_xyz.txt");
array_walk($array,'transform_line');
usort($array,'by_datum');
*ungetestet*

huberg
22.06.2009, 23:51:04
an DokuLeseHemmung,
erst mal Danke für die schnelle Antwort. Ich hatte das Script so gekürzt, weile es mir Vorallendingen um das Umsetzen der Zeilen in Spalten (Arrays) ankam. In dem von Ihnen erstellen Antwort-Script sind viele Konstrukte enthalten, die ich als Anfänger das Erst mal sehe und nicht verstehe. Ich bin noch nicht soweit.

Hier noch mal, wie es aussehen sollte: Eingabe u.Ausgabe

Eingabe:
20090614|Maier Anna|100|1. Mahnung|o
20090612|Meier Jo|120|bezahlt|bar
20090612|Meyer Vivi|130|B.Ueberweisung|y
20090530|Meier Herbert|10|bar|mtl.

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in C:\xampp\htdocs\Uebung_Pfeile\Name_out_4.php on line 37
Ausgabe
Datum ↓ ↑ Name↓ ↑ Betrag↓ ↑ Bemerkung Kz
20090614 Maier Anna 100 1. Mahnung o
20090612 Meier Jo 120 bezahlt bar
20090612 Meyer Vivi 130 B.Ueberweisung y
20090530 Meier Herbert 10 bar mtl.

Und hier mein Script (aber bitte nicht lachen!) - geht aber nicht , Scriptly reagiert nicht.
kommt in der naechsten Antwort.

Huberg

--------------------------------------------------------------------------------------------------------------

<?php
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
echo "Name_xyz.txt Tabelle Stand 15.6.2009";
$array = file("$DOCUMENT_ROOT/../htdocs/Daten/Name_xyz.txt");
$anzahl_zeile = count($array);
//------------------------------------------------------------
foreach ( $array as $key => $zeile)
{
list($datum, $name, $betrag, $bemerkung, $kz) = explode("|" , $zeile);
echo "<br/>"; // nur fuer Test
echo "<pre>"; // nur fuer Test
print_r ($zeile); // nur fuert Test
}
foreach ($array as $nr => $inhalt) {
$datum[$nr] = ($inhalt[datum]);
$name[$nr] = ($inhalt[name]);
$betrag[$nr] = ($inhalt[betrag]);
$bemerkung[$nr] = ($inhalt[bemerkung]);
$kz[$nr] = ($inhalt[kz]);
}
switch ( $_GET['sortierung'] ) {
case ( "d" ):
array_multisort( $datum, SORT_ASC, $name, SORT_ASC, $array );
echo "nach switch d"; // nur fuert Test
break;
case ( "da" ):
array_multisort( $datum, ORT_DESC, $name, SORT_DESC, $array );
echo "nach switch da"; // nur fuert Test
break;
case ( "b" ): array_multisort( $datum, SORT_ASC, $name, SORT_ASC, $array );
echo "nach switch b"; // nur fuert Test
break;
case ( "ba" ): array_multisort( $name, SORT_DESC, $array );
echo "nach switch ba"; // nur fuert Test
break;
DEFAULT:
array_multisort( $datum, SORT_ASC, $name, SORT_ASC, $array ) ;
}
ausgabe_tabelle ($array);
function ausgabe_tabelle ($array)
{
echo '<table border="1" cellpadding="6" cellspacing="0">';
echo '<tr bgcolor="#6CF8E6">';
echo '<th>';
echo 'Datum ';
echo '<a href="Name_out_4.php?sortierung=d">&darr; </a>';
echo ' ';
echo '<a href="Name_out_4.php?sortierung=da">&uarr; </a>';
echo '</th>';
echo '<th>';
echo 'Name';
echo '<a href="Name_out_4.php?sortierung=b">&darr; </a>';
echo ' ';
echo '<a href="Name_out_4.php?sortierung=ba">&uarr; </a>';
echo '</th>';
echo '<th>';
echo 'Betrag';
echo '<a href="Name_out_4.php?sortierung=o">&darr; </a>';
echo ' ';
echo '<a href="Name_out_4.php?sortierung=oa">&uarr; </a>';
echo '</th>';
echo '<th>';
echo 'Bemerkung ';
echo '</th>';
echo '<th>';
echo ' Kz';
echo '</th>';
echo '</tr>';
// -------------------------------------------------------------------
foreach ( $array as $records )
{
list ($datum, $name, $betrag, $bemerkung, $kz)= explode("|" , $records);
$zeilenr++;
echo '<tr'; echo farbwechsel ( $zeilenr ); echo ">";
// echo '<td>'; echo $zeilenr. "."; echo '</td>';
echo '<th>';
echo $datum;
echo '</th>';
echo "<td> $name </td>";
echo "<td> $betrag</td>";
echo "<td> $bemerkung</td>";
echo "<td>$kz</td>";
echo '</tr>';
}
}
echo '</table>';
// -----------------------------------------------------------
function farbwechsel ( $zeilenr )
{
if ( bcmod ( $zeilenr , '2' ) == 0 )
{
$hintergrundfarbe = ' bgcolor="#ACC8F0" ';
}
else
{ $hintergrundfarbe = ' bgcolor="#DDE8F9" '; }
return ( $hintergrundfarbe );
}
?>

vt1816
23.06.2009, 00:44:59
[...]
Und hier mein Script (aber bitte nicht lachen!) - geht aber nicht , Scriptly reagiert nicht.
kommt in der naechsten Antwort.

Huberg



Wenn Du hier in Deinem hohen Alter (71???; wenn's dann stimmt - Respekt!!) weiterhin Hilfe erwartest, dann benutze zukünftig die entsprechenden Tag's!

huberg
27.06.2009, 23:44:57
Hallo Web-Künstler,
Eure Unterstützung war gleich Null. Also diesmal werde ich mich nicht bedanken. Aber das ist gut so. Jetzt habe ich mir selber geholfen. Und war gezwungen mich in das Thema ein zuarbeiten. Ich verstehe jetzt das Thema Arrays auch besser.

Das Script vom 22.6.2009 ist voller Fehler - besser nicht anschauen. Hier ist aber die Lösung: Eine Text-Datei einlesen und sortiert nach Spalten ausgeben. Die Tabelle bietet auch die Möglichkeit mehrer Spalten durch Ancliken (Pfeil up u. down) erneut zu sortieren. Array-multisort ist wohl ein heikles Thema für viele. Habe nichts Vergleichbares gefunden. Ein Teil stammt aus: www.php-kurs.com.
Den Input /Output werde ich als Anhang versuchen beizufuegen.

An das SELFPHP-Management, auch wenn ich fast bei Euch zum Alzheimer-Ast zähle, Eure Plattform gefällt mir, Ihr macht eine gute Arbeit.
Farmer (aber mehr Rentner) in Afrika
Huberg


Mein Script:

<?php // Version Name_627.php
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
echo "name_xyz.txt Daten Stand 27.6.2009";
$array = file("$DOCUMENT_ROOT/../htdocs/Daten/name_xyz.txt");
$anzahl_zeilen = count($array);
echo "<br/>"; echo "<br/>";
echo 'array vor der Sortierung und vor der Trennung mit explode' ;
echo "<pre>";
print_r ($array); // nur fuer Test

echo "array in 5 Spalten (arrays) zerlegt " ;
echo "<br/>"; echo "<br/>";
for ($i = 0; $i < $anzahl_zeilen ; $i++)
{
// Zeilen in Spalten speichern -----------------------------
$line = explode ("|" , $array[$i]) ;
$datum[$i] = strtolower ($line[0] );
$name[$i] = strtolower ($line[1]);
$betrag[$i] = strtolower ($line[2]);
$bemerkung[$i]= strtolower ($line[3]);
$kz[$i] = strtolower ($line[4]);
print_r ($datum[$i]); // nur fuer Test
print_r ($name[$i] );
print_r ($betrag[$i] );
print_r ($bemerkung[$i] );
print_r ($kz[$i] );
}
switch ( $_GET['sortierung'] )
{
case ( "d" ):
array_multisort($datum, SORT_ASC, $name, SORT_ASC,$betrag, SORT_ASC, $bemerkung, SORT_ASC );
echo "nach switch/case d"; // nur fuer Test
break;
case ( "da" ):
array_multisort($datum, SORT_DESC, $name, SORT_DESC, $betrag, SORT_DESC, $bemerkung, SORT_ASC );
echo "nach switch/case da"; // nur fuer Test
break;
case ( "b" ):
array_multisort( $name, SORT_ASC, $datum, SORT_ASC, $betrag,SORT_ASC,$bemerkung, SORT_ASC );
echo "nach switch/case b"; // nur fuer Test
break;
case ( "ba" ):
array_multisort( $name, SORT_DESC,$datum, SORT_DESC,$betrag, SORT_DESC,$bemerkung, SORT_DESC );
echo "nach switch/case ba"; // nur fuer Test
break;
case ("o"):
array_multisort( $betrag, SORT_ASC,$name, SORT_ASC,$datum, SORT_ASC,$bemerkung, SORT_ASC);
echo "nach switch/case o"; // nur fuer Test
break;
case ("oa"):
array_multisort( $betrag, SORT_DESC,$name, SORT_DESC,$datum, SORT_DESC,$bemerkung, SORT_DESC);
echo "nach switch/case oa"; // nur fuer Test
break;
DEFAULT:
array_multisort($datum, SORT_ASC, $name, SORT_ASC,$betrag, SORT_ASC, $bemerkung, SORT_ASC );
}
ausgabe_tabelle ( $datum, $name, $betrag, $bemerkung, $kz, $anzahl_zeilen);
// ------------------------------------------------------------------
function ausgabe_tabelle ( $datum, $name, $betrag, $bemerkung, $kz, $anzahl_zeilen)
{
echo '<table border="1" cellpadding="6" cellspacing="0">';
echo '<tr bgcolor="#6CF8E6">';
echo '<th>';
echo 'Datum ';
echo '<a href="Name_627.php?sortierung=d">&darr;</a>';
echo ' ';
echo '<a href="Name_627.php?sortierung=da">&uarr;</a>';
echo '</th>';
echo '<th>';
echo 'Name ';
echo '<a href="Name_627.php?sortierung=b">&darr;</a>';
echo ' ';
echo '<a href="Name_627.php?sortierung=ba">&uarr;</a>';
echo '</th>';
echo '<th>';
echo 'Betrag ';
echo '<a href="Name_627.php?sortierung=o">&darr;</a>';
echo ' ';
echo '<a href="Name_627.php?sortierung=oa">&uarr;</a>';
echo '</th>';
echo '<th>';
echo 'Bemerkung ';
echo '</th>';
echo '<th>';
echo ' Kz';
echo '</th>';
echo '</tr>';
// -------------------------------------------------------------------
for ($i = 0; $i < $anzahl_zeilen; $i++)
{
// var_dump($datum); // nur fuer Test
$zeilenr++;
echo '<tr';
echo farbwechsel ( $zeilenr );
echo '>';
echo '<td>';
echo $datum[$i];
echo '</td>';
echo '</td>';
echo '<td>';
echo $name[$i];
echo '</td>';
echo '</td>';
echo '<td>';
echo $betrag[$i];
echo '</td>';
echo '<td>';
echo $bemerkung[$i];
echo '</td>';
echo '<td>';
echo $kz[$i];
echo '</td>';
echo '</tr>';
} }
echo '</table>';
// -----------------------------------------------------------
function farbwechsel ( $zeilenr )
{
if ( bcmod ( $zeilenr , '2' ) == 0 ) {
$hintergrundfarbe = ' bgcolor="#ACC8F0" ';
} else
{ $hintergrundfarbe = ' bgcolor="#DDE8F9" '; }
return ( $hintergrundfarbe );
}
?>

huberg
28.06.2009, 23:22:08
Kleiner Fehler:

Um die Zeile beim Sortieren zusammen zuhalten, muss im Code noch eine Erweiterung erfolgen.

Alle Zeilen mit:

array_multisort($datum, SORT_ASC, $name, SORT_ASC,$betrag, SORT_ASC, $bemerkung, SORT_ASC,

bitte dies nachtragen:

$kz, SORT_ASC); bzw. SORT_DESC

dieses Array/Flags sorgt dafuer, dass einer der Sortierung z.B. nach Namen das Kz wieder in der richtigen Zeile steht.


huberg