php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
array: zahlen austauschen


 
beebob
27-08-2002, 22:14 
 
moin!
ich habe z.b. ein array mit dem inhalt

array(1,2,3,4)

nun möchte ich z.b. hier die inhalte austauschen, ohne dass die indexe des arrays berührt werden:

array(1,4,2,3);

weiss einer, wie das am saubersten zu bewerkstelligen wäre?

danke!

beebob :huep:

 
CHnuschti
27-08-2002, 23:06 
 
Ich denke es gibt ne ganze Menge Möglichkeiten anhand der array-Funktionen:
http://www.php-resource.de/manual.php?p=ref.array

Der springende Punkt ist wohl, wie du die zu vertauschende Elemente definierst bzw. wie du diese identifizieren/ermitteln möchtest.

Per Schlüssel zugreifen wäre z.B. völlig einfach, du willst z.B. die Elemente mit Schlüssel 4 und 7 austauschen:
$a1=$array[4];
$a2=$array[7];
$array[4]=$a2;
$array[7]=$a1;

Ansonsten kannst du mit array_search deine beiden Elemente suchen (so sie dann nur einmal vorkommen), die du austauschen möchtest und anhand deren Schlüssel analog oben die Werte vertauschen.

mfg

 
beebob
27-08-2002, 23:21 
 
danke, aber das prob geht ein wenig tiefer. was ich gerne realisieren möchte, ist ein 'selection sort'. das explizite austauschen eines wertes also.

vielleicht erkläre ich besser die gesamtaufgabe:

ich habe ein mysql-suchergebnis, welches lediglich aus integers besteht. diese integers stellen die sortierreihenfolge dar (z.b.: a=1,b=2,c=4,d=3). letztendlich soll diese reihenfolge explizit geändert werden. z.b. möchte ich, dass 'datensatz a', mit dem derzeitigen sortierungswert '3' die sortierungsid '1' erhält. die betreffenden werte, unterhalb des replacements, sollen entsprechende, neue werte erhalten. das suchergebnis kopiere ich derzeit in ein array. und dieses array möchte ich nun manipulieren und die neu sortierten ergebnisse wieder in der datenbank abspeichern.

ich habe ein Java beispiel gefunden, welches dieses problem lösen soll, konnte es aber unter php nicht rekonstruieren:

void InsertionSort()
{
int Ix, Jx, flag = 0;
Data Elem;

for( Ix = 1; Ix <= n-1; Ix++ )
{
Elem = data[Ix]; // A: Z/T
Jx = Ix - 1;

while( !flag && Elem < data[Jx] ) // A+C: Z/V
{
data[Jx+1] = data[Jx]; // C: Z/Z/T
Jx--;
if( Jx < 0 ) flag=1;
}
}
data[Jx+1] = Elem; // A: Z/T
flag = 0;
}
}

mit namen kann ich das leider nicht realisieren, da ich nicht im voraus weiss, wieviele datensätze ich erhalten werde.

 
CHnuschti
28-08-2002, 00:16 
 
Ich habs zwar nicht kapiert, was du letztlich willst. Aber ich ahne worauf du hinaus willst.

Probiere mal diese beiden Formen
sort($array) bzw. rsort($array)
und
asort($array) bzw. arsort($array).

Im ersten Fall werden die Schlüssel nicht beibehalten, im zweiten Fall hingegen schon.

Mit folgender Konstruktion gehst du ein array durch, von "oben nach unten", unabhängig von Schlüsseln usw.
Die Ausgabe erfolgt in der Reihenfolge, wie du es vorhin sortiert hast.

while(list($key, $value) = each($array)): //$k ist der Schlüssel
echo "k=$key; v=$value <br>";
endwhile;

Indem du es so erweiterst
$i=0;
while(list($key, $value) = each($array)):
echo "k=$key; v=$value <br>";
$neuarray[]=array($i, $key, $value);
$i=$i+1;
endwhile;

kannst du dir deine Sortierung "raussaugen" und festhalten. Die Schlüssel von $neuarray sind identisch mit $i

Sobald du sort, rsort, usort hintereinander brauchst für den gleichen array $array musst du allerdings eine neue "Kopie" von $array benützen, also z.B. $b=$c=$d ... =$array und mit $b, $c usw. weiterarbeiten, weil du mit diesen die Schlüssel änderst und damit $array nicht mehr im "Original" vorliegt.

Im übrigen gibt es noch array_flip(), das tauscht Schlüssel mit Werten. Wenn deine Werte auch von 0 aufsteigend sind und alle einmalig sind ist das möglicherweise ein einfaches Hilfsmittel für dein Vorhaben.

BTW hatte ich schon mal ein ähnliches Problem, bei dem es schlussendlich bedeutend einfacher war, einfach für jede Sortierung eine neue mysql-query abzusetzen ;)

Hoffe es hilft.
mfg

 
beebob
28-08-2002, 01:09 
 
danke chef!
ich hab's jetzt so 'gelöst':

if(!$result=mysql_query("SELECT ID,SHOWPOS FROM news WHERE LANG='$lang' AND ARCHIVE='0' ORDER BY SHOWPOS;",$link)){
echo "Datenbankfehler2 -> ".mysql_error($link);
exit;
}

while($a=mysql_fetch_array($result)){
if($showpos=="up" && $actpos==$a["SHOWPOS"] && $a["ID"]==$newsid){
echo "poop";
$shps=$a["SHOWPOS"] - 1;
mysql_query("UPDATE news SET SHOWPOS=$shps WHERE ID={$a["ID"]} AND LANG='$lang';");
}else if($showpos=="down" && $actpos==$a["SHOWPOS"] && $a["ID"]==$newsid){
$shps=$a["SHOWPOS"] + 1;
mysql_query("UPDATE news SET SHOWPOS=$shps WHERE ID={$a["ID"]} AND LANG='$lang';");
}
}

if($showpos=="up"){
mysql_query("UPDATE news SET SHOWPOS=(SHOWPOS + 1) WHERE SHOWPOS >= ($shps) AND ID!=$newsid AND LANG='$lang';");
}else if($showpos=="down")
mysql_query("UPDATE news SET SHOWPOS=(SHOWPOS - 1) WHERE SHOWPOS <= ($shps) AND ID!=$newsid AND LANG='$lang';");

resortShowIDs($link,$lang);
echo "<script>location.href='$PHP_SELF?d=$USERID&PHPSESSID=".session_id()."&list=$lang';</script>";
echo "Reihenfolge erfolgreich ge&auml;ndert!";


damit gehe ich jetzt pro zeile entweder hoch oder runter. ist für den kunden sowieso leichter, schritt für schritt hochzugehen ;)

dein beispiel probiere ich aber morgen aus, weil ich das so für intelligenter halte, als meinen spagetthi-code oben. ging halt am schnellsten so.


beebob :huep:


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:41 Uhr.