mmofacts.com

Kleines Anfänger Tutorial

gepostet vor 19 Jahre, 2 Monate von dama
hi zusammen,
hatte grad lust und zeit mal nen lösungsansatz zu zeigen, wie man mehrdimensionale arrays ohne array_multisort nach mehreren selbst bestimmten kriterien richtig sortiert bekommt. ungeprüft...


 

/*
sortieren eines arrays nach mehreren kriterien selber gemacht ohne array_multisort und mit einem stringvergleich

für anfänger!

Matthias Geller
www.second-home.org

nehmen wir an, wir haben folgendes array
*/

$array[0] = array("name" => "Alberg", "vorname" => "Hans", "alter" => 20, "geschlecht" => "m", "guthaben" => 123);
$array[1] = array("name" => "Alberg", "vorname" => "Paul", "alter" => 30, "geschlecht" => "m", "guthaben" => 123.45);
$array[2] = array("name" => "Nuss", "vorname" => "Otto", "alter" => 22, "geschlecht" => "m", "guthaben" => 234.5);
$array[3] = array("name" => "Aalzweck", "vorname" => "Hannelore", "alter" => 42, "geschlecht" => "w", "guthaben" => 1234.45);

/*
jetzt wollen wir dieses array nach verschiedenen kriterien sortieren lassen.... mit array_multisort -> darfst gerne probieren. Nein? geht nicht richtig, sortiert komisch....?! dann las uns einen trick versuchen.

und zwar mit einer einfachen und selbst gebastelten sortierlogik, die jeder nachvollziehen und nachbasteln kann....

1. Wir bestimmen eine sortierreihenfolge
z.b.
1. name
2. alter
3. guthaben

2. Wir schauen, dass nachher alle werte die gleiche länge haben und schreiben hierfür 3 funktionen....
*/

function stringabgleich($wert)
{
$laenge_soll = 20; // maximale länge (nehm ich jetzt einfach mal an)
$laenge_ist = strlen($wert);
$fehlende_stellen = $laenge_soll - $laenge_ist;
if($fehlende_stellen < 1)
{
return $wert;
}
else
{
return str_pad($wert, $laenge_soll, chr(01), STR_PAD_RIGHT);
}
}

function intabgleich($wert)
{
$laenge_soll = 10; // maximale länge
$laenge_ist = strlen($wert);
$fehlende_stellen = $laenge_soll - $laenge_ist;
if($fehlende_stellen < 1)
{
return $wert;
}
else
{
return str_pad($wert, $laenge_soll, chr(01), STR_PAD_LEFT);
}
}

function floatabgleich($wert)
{
$laenge_soll_1 = 10; // maximale stellen vor dem komma
$laenge_soll_2 = 3; // maximale stellen nach dem komma
$laenge_soll = $laenge_soll_1 + $laenge_soll_2;
$laenge_ist = strlen($wert);

$fehlende_stellen = $laenge_soll - $laenge_ist;
if($fehlende_stellen < 1)
{
return $wert;
}
else
{
$pos = strpos ($wert, "."); // bestimmen wo der punkt ist
if ($pos === false)
{
$wert .= ".0"; // falls es eine ganzzahl ist, dann hängen wir einfach .0 hin
}
$wert_exploded = explode('.', $wert, 2); // wir teilen den wert auf
$wert_neu = str_pad($wert_exploded[0], $laenge_soll_1, chr(01), STR_PAD_LEFT); // wir füllen die stellen mit Nullen links auf
$wert_neu .= str_pad($wert_exploded[1], $laenge_soll_2, chr(01), STR_PAD_RIGHT); // wir füllen die stellen mit Nullen rechts auf
return $wert_neu;
}
}

/*
3. jetzt lassen wir die zuvor bestimmte sortierung durchrattern und schreiben sie in ein neues array.
*/

for($i = 0; $i < sizeof($array); $i++)
{
// 1. sortierung (name)
$sortierkey = stringabgleich((string)$array[$i]["name"]); // wir übergeben den wert als string
// 2. sortierung (alter)
$sortierkey .= intabgleich((string)$array[$i]["alter"]);
// 3. sortierung (guthaben)
$sortierkey .= floatabgleich((string)$array[$i]["guthaben"]);
// um sicher zu gehen, das kein key nachher doppelt vorkommt und überschrieben wird, hängen wir noch zur sicherheit ne zufallszahl dran
$sortierkey .= rand(1000,9999);


$sortier_array[$sortierkey] =
array("name" => $array[$i]["name"],
"vorname" => $array[$i]["vorname"],
"alter" => $array[$i]["alter"],
"geschlecht" => $array[$i]["geschlecht"],
"guthaben" => $array[$i]["guthaben"]);
}

/*
4. jetzt legen wir noch fest, ob wir aufwärts, oder abwärts sortieren wollen und lassen uns beide array ausgeben.
*/

ksort($sortier_array, SORT_STRING); // sortiert aufsteigend
// krsort ($sortier_array, SORT_STRING); // sortiert absteigend
echo "ursprüngliches array:
";
print_r($array);
echo "
sortiertes array:
";
print_r($sortier_array);

/*
5. Abschlusswort
dieses kleine tutorial ist an alle anfänger gerichtet!
hier sollte nur schemenhaft veranschaulicht werde, wie eine sortierung eines mehrdimensionalen arrays auf einfache art selbst umgesetzt werden kann. verwendet den code wie ihr wollt, baut ihn um und verbessert ihn 8)
*/

?>

Auf diese Diskussion antworten