Forum
Tipps
News
Menu-Icon

array_multisort mit dynamischen Arrays

Hi,

ich bin grad dabei eine Art Datenbank zu entwickeln, die auf Textdateien basiert. Ich bin grade bei der Funktion, die einen "Datenbankstream" nach bestimmten Merkmalen sortiert.

Nur hab ich jetzt das Problem, dass ich nicht vorher weiß, wie viele Spalten sortiert werden sollen:

	
function 
filedb_sort($dbdata$database$row$flag)
	
{
	
	
$row trim($row);
	
	
$flags explode(',', $flag);
	
	

	
	
for(
$a 1$a <= $dbdata[0]; $a++)
	
	
{
	
	
	
if(
$dbdata[$a] == $row)
	
	
	
{
	
	
	
	
$sortrow = ($a 1);
	
	
	
}
	
	
}
	
	
	

	
	

	
	
$flags[0] = dbname(trim($flags[0]));
	
	
$flags[1] = dbname(trim($flags[1]));
	
	

	
	
$sortarray = array();
	
	
$temprows count($database[0]);
	
	
for(
$a 0$a $temprows$a++)
	
	
{
	
	
	
$sortarray[$a] = array();
	
	
}
	
	

	
	
for(
$b 0$b count($database); $b++)
	
	
{
	
	
	
for(
$c 0$c count($database[$b]); $c++)
	
	
	
{
	
	
	
	
array_push($sortarray[$c], $database[$b][$c]);
	
	
	
}
	
	
}
	
	

	
	

	
	
if(((
$flags[0] == &#39;normal&#39;)and($flags[1] == &#39;asc&#39;)) or (($flags[1] == &#39;normal&#39;)and($flags[0] == &#39;asc&#39;)))
	
	
{
	
	
	
array_multisort($sortarray[$sortrow], SORT_ASCSORT_REGULAR$sortarray);
	
	
}
	
	
if(((
$flags[0] == &#39;normal&#39;)and($flags[1] == &#39;desc&#39;)) or (($flags[1] == &#39;normal&#39;)and($flags[0] == &#39;desc&#39;)))
	
	
{
	
	
	
array_multisort($sortarray[$sortrow], SORT_DESCSORT_REGULAR$sortarray);
	
	
}
	
	
if(((
$flags[0] == &#39;string&#39;)and($flags[1] == &#39;asc&#39;)) or (($flags[1] == &#39;string&#39;)and($flags[0] == &#39;asc&#39;)))
	
	
{
	
	
	
array_multisort($sortarray[$sortrow], SORT_ASCSORT_STRING$sortarray);
	
	
}
	
	
if(((
$flags[0] == &#39;string&#39;)and($flags[1] == &#39;desc&#39;)) or (($flags[1] == &#39;string&#39;)and($flags[0] == &#39;desc&#39;)))
	
	
{
	
	
	
array_multisort($sortarray[$sortrow], SORT_DESCSORT_STRING$sortarray);
	
	
}
	
	
if(((
$flags[0] == &#39;numeric&#39;)and($flags[1] == &#39;asc&#39;)) or (($flags[1] == &#39;numeric&#39;)and($flags[0] == &#39;asc&#39;)))
	
	
{
	
	
	
array_multisort($sortarray[$sortrow], SORT_ASCSORT_STRING$sortarray);
	
	
}
	
	
if(((
$flags[0] == &#39;numeric&#39;)and($flags[1] == &#39;desc&#39;)) or (($flags[1] == &#39;numeric&#39;)and($flags[0] == &#39;desc&#39;)))
	
	
{
	
	
	
array_multisort($sortarray[$sortrow], SORT_DESCSORT_STRING$sortarray);
	
	
}
	
	

	
	
$orgarray = array();
	
	

	
	
for(
$a 0$a count($sortarray[0]); $a++)
	
	
{
	
	
	
$orgarray[$a] = array();
	
	
	
for(
$b 0$b count($sortarray); $b++)
	
	
	
{
	
	
	
	
array_push($orgarray[$a], $sortarray[$b][$a]);
	
	
	
}
	
	
}
	
	

	
	
return 
$orgarray;
	
}


$dbdata ist ein Array, das erste Feld ist mit der Anzahl der Spalten beschrieben und die restlichen Spalten sind mit den Namen der Spalten gefüllt. $database ist ein mehrdimensionales Array mit dem Inhalt der "Datenbank", jeweils nach Spalten sortiert, $row ist der Name der Spalte, nach der Sortiert werden soll und $flag ist die Sortiermethode (also z.B. "normal, asc" oder "numeric, desc".

So schaut $database z.B. aus: (die ersten beiden Zeilen sind nur zur Erläuterung, die | zwischen den Zeichen sind auch nur zur Darstellung)

row1|row2|row3|row4|row5
--------------------
1|z|3|5|0
A|2|C|4|1
2|T|4|g|1
a|3|e|Q|1


$database = array(
       array(1, A, 2, a),
       array(z,2,T,3,8),
       array(3,C,4,e),
       array(0,1,1,1)
       );


Wie kann ich jetzt z.B. nach "row2" sortieren lassen und bei array_multisort() ganz am Ende alle anderen Felder des korrekt angeben, damit die anderen Spalten angepasst werden, wenn ich vorher nicht die Anzahl kenne?

Wenn ich dann "manuell" angebe, z.B. bei "row1" vorne dann $sortarray[0] und dann hinten "$sortarray[1], $sortarray[2], $sortarray[3]", dann funktionierts richtig, aber wie gesagt weiß ich ja vorher nicht, wie viele Spalten es in einer Datenbank gibt.

Ich hoffe ich hab das korrekt erläutert, wenn nicht lade ich mal den ganzen Code hoch mit einer "Beispieldatenbank".

Greez
Schwoebel

Antworten zu array_multisort mit dynamischen Arrays:

Hi Schwoebel

Ich werds mir mal ansehn, kann aber noch ne weile dauern.

MFG
BWA

hi!

das wäre meine Lösung


function filedb_sort($dbdata$database$row$flag)
{

	
$row trim($row);
	
$flags explode(&#39;,&#39;, $flag);
	
for(
$a 1$a <= $dbdata[0]; $a++)
	

	
{
	

	
	
if(
$dbdata[$a] == $row)
	

	
	
{
	
	
	
$sortrow = ($a 1);
	
	
}
	
}
	
//$flags[0] = dbname(trim($flags[0]));
	
//$flags[1] = dbname(trim($flags[1]));
	
$flags[0] = trim($flags[0]);
	
$flags[1] = trim($flags[1]);
	

	

	
$sortarray = array();
	
$temprows count($database[0]);

	
for(
$b 0$b count($database); $b++)
	
{
	
	
$sortarray[$b] = $database[$b][$sortrow];
	
}
	

	
$sort_modes = array(&#39;normal&#39; => SORT_REGULAR, &#39;string&#39; => SORT_STRING, &#39;numeric&#39; => SORT_NUMERIC);
	
$sort_directions = array(&#39;asc&#39; => SORT_ASC, &#39;desc&#39; => SORT_DESC);
	

	
$sort_direction = isset($sort_directions[$flags[0]])?$sort_directions[$flags[0]]:(isset($sort_directions[$flags[1]])?$sort_directions[$flags[1]]:SORT_ASC);
	
$sort_mode = (isset($sort_modes[$flags[0]]))?$sort_modes[$flags[0]]:((isset($sort_modes[$flags[1]]))?$sort_modes[$flags[1]]:SORT_REGULAR);
	

	
array_multisort($sortarray$sort_direction$sort_mode$database);
	

	

	
return 
$database;
}


Zum testen hab ich den Code verwendet:



$dbdata 
= array(5,&#39;col1&#39;, &#39;col2&#39;, &#39;col3&#39;, &#39;col4&#39;, &#39;col5&#39;);
$database = array(
       array(1, &#39;A&#39;, 2, &#39;a&#39;),
       array(&#39;z&#39;,2,&#39;T&#39;,3,8),
       array(3,&#39;C&#39;,4,&#39;e&#39;),
       array(0,1,1,1)
);

print_r ($database);
print_r (filedb_sort($dbdata$database, &#39;col2&#39;, &#39;normal, asc&#39;));


Wenn du dich irgendwo ned auskennst schreib einfach.

MFG
BWA

« Letzte Änderung: 26.10.06, 14:12:33 von BWA »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Hallo BWA,

die Lösung funktioniert, nur verstehe ich eigentlich nicht so wirklich was da gemacht wird.

Solche "Kurzanweisungen" mit wert1?wert2:anweisung oder so ähnlich hab ich schon öfters gesehn, nur ist mir das zu wenig Code um verständlich zu sein.

Gibts da denn irgendwo eine Referenz dazu? Ich hab mir schon gedacht, dass man das so in der Art lösen muss, aber ich hab die Funktion noch nie gebraucht.

Ich hab mir auch mal das Script hochgeladen soweit wie ich gerade bin:
FileDB Download

Das kann das Script also jetzt:
- Tabelle mit beliebig vielen Spalten und Zeile einlesen
- Auswahl beliebiger Spalten
- ("automatische Korrektur"; falsch geschriebene oder nicht exisitierende Spalten werden nicht übernommen)
- Tabellendaten nach einer beliebigen Spalte sortieren

Jetzt kommen noch die Befehle "insert", "update" und "delete". Dann hätte man schon mal die Grundausstattung eines Datenbanksystems. Ich mach dann auch noch eine Referenz dazu und kommentier den Quelltext aus.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Solche "Kurzanweisungen" mit wert1?wert2:anweisung oder so ähnlich hab ich schon öfters gesehn, nur ist mir das zu wenig Code um verständlich zu sein.


(ausdruck) ? machwas : machwasanderes

ist eine Kurzschreibweise für

if (ausdruck)
{
  machwas
}
else
{
  machwasanderes
}

greez 8)
JoSsiF

« MySQL date feld - tag, monatiLch Designs? »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Scart
SCART, ein europäischer Standard für Steckverbindungen, spielte eine wichtige Rolle in der Geschichte der Audio- und Videotechnik. Ursprünglich konzipiert,...

Datenbank
Eine Datenbank (DBS), im englischen database, ist eine strukturierte Datensammlung und fungiert wie ein "digitales Archiv". Datenbanken dienen der effizienten Aufbewahrun...

Hostname
Ein Hostname ist der eindeutige Name, der einem Gerät in einem Netzwerk zugewiesen wird. Dieser Name wird (parallel zu der IP Adresse) verwendet, um das Gerät i...