php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.07.2010, 08:56  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard Array sortieren...

Hallo leute,

ich habe ein kleines Problem.. ich dachte ich könnte programmieren aber musste heute feststellen dass ich viel zu verwöhnt bin fertige funktionen zu verwenden... ich muss ein mehrdimensionales array nach bestimmten kriterien sortieren OHNE vorgefertigte funktionen zu verwenden.. folgendes array ist vorhanden

PHP-Code:
$liste = array(
    
=> array('paketNr' => 424'priority' => 1'distance' => 8),
    
=> array('paketNr' => 290'priority' => 1'distance' => 5),
    
=> array('paketNr' => 295'priority' => 2'distance' => 9),
    
=> array('paketNr' => 129'priority' => 1'distance' => 1),
    
=> array('paketNr' => 176'priority' => 3'distance' => 2),
    
=> array('paketNr' => 131'priority' => 2'distance' => 2),
    
=> array('paketNr' => 121'priority' => 1'distance' => 4),
    
=> array('paketNr' => 934'priority' => 1'distance' => 8),
    
=> array('paketNr' => 385'priority' => 1'distance' => 5),
    
=> array('paketNr' => 323'priority' => 3'distance' => 7),
    
10 => array('paketNr' => 287'priority' => 2'distance' => 4),
    
11 => array('paketNr' => 350'priority' => 2'distance' => 5)
); 
so ich muss das array erstmal nach entfernung sortieren also kleiner 5 und größer 5.. alle werte die kleiner sind als 5 müssen dann nach priority sortiert werden also höhere zahl = höhere prioritat, bei gleicher entfernung und priorität, spielt es keine rolle , welche reihenfolge und das gleiche dann mit der entfernung höher als 5. mein ansatz war folgender:
PHP-Code:
$html '<table border="1" width="100%">
    <tr>
<th>Paket Nummer</th>
<th>Priorität</th>
<th>Entfernung</th>
</tr>'
;

foreach (
$liste as $index => $paket) {
    if (
$liste[$index]['distance'] < 5) {
        
$html .= '<tr>';
        
$html .= '<td>' $liste[$index]['paketNr'] . '</td>';
        
$html .= '<td>' $liste[$index]['priority'] . '</td>';
        
$html .= '<td>' $liste[$index]['distance'] . '</td>';
        
$html .= '</tr>';
    } else {
        
$html .= '<tr>';
        
$html .= '<td>' $liste[$index]['paketNr'] . '</td>';
        
$html .= '<td>' $liste[$index]['priority'] . '</td>';
        
$html .= '<td>' $liste[$index]['distance'] . '</td>';
        
$html .= '</tr>';
    }
}
$html .= '</table>';
echo 
$html
somit habe ich erstmal die liste in 2 teile getrennt.. und danach? also ich nach "Array Sortieren " gegooled habe, kamen schon einige beispiele raus aber jedesmal wurde da entweder usort() oder andere funktionen verwendet... könnt ihr mir ein denkanstos geben? Ich müsste ja irgendwie ein wert zwischenspeichern und im nächsten durchlauf , den zwischengespeicherten wert mit dem aktuellen vergleichen.. irgendwie war da was.. kann mich nicht mehr erinnern weil ich halt immer funktionen verwendet habe.

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.07.2010, 09:06  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Hier mal ein Sortieralgorithmus aus einer meiner Vorlesungen aus dem letzten Semester. Sortiert glaube ich absteigend von groß nach klein
Zitat:
Eingabe: Natürliche Zahlen a1; : : : ; an mit n >= 1
Ausgabe: ?

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

1: Setze i = 1
2: Solange i < n gilt:
3: Setze max = i + 1
4: Setze j = i + 1
5: Solange j <= n gilt:
6: Falls aj > amax:
7: Setze max = j
8: Erhöhe j um 1
9: Falls amax > ai:
10: Vertausche amax und ai
11: Erhöhe i um 1

Geändert von Asipak (09.07.2010 um 09:11 Uhr).
Asipak ist offline  
Alt 09.07.2010, 09:15  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

i auf 1 setzen? ist nicht i das array index und muss es nicht 0 sein?

was ist n? anzahl der datensätze?
was ist max ? aktueller größter zwischengespeicherter wert?
und aj und amax?
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Alt 09.07.2010, 09:19  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
i auf 1 setzen? ist nicht i das array index und muss es nicht 0 sein?
Klar, doch nach der Eingabe beginnen die Indizes der Zahlen bei 1
Zitat:
Eingabe: Natürliche Zahlen a1; : : : ; an mit n >= 1
Zitat:
was ist n? anzahl der datensätze?
Jap.
Zitat:
was ist max ? aktueller größter zwischengespeicherter wert?
Jein, der Index der Zahl, die einen Index > i hat.
Zitat:
und aj und amax?
j ist ein Index, genau wie max. a ist dein Array.
Asipak ist offline  
Alt 09.07.2010, 09:21  
Erfahrener Benutzer
 
Registriert seit: 15.04.2010
Beiträge: 813
PHP-Kenntnisse:
Fortgeschritten
Paul.Schramenko befindet sich auf einem aufstrebenden Ast
Standard

Mach doch einfach 2Bubblesorts drauf. Der erste sortiert erstmal nach Entfernung und der zweite schaut, dass wenn die Entfernung gleich ist, und schaut dann nach der priority.
Und wenn du nicht weißt, was ein Bubblesort ist, dann solltest du dir tatsächlich mal einige Grundlagen aneignen!
__________________
"My software never has bugs, it just develops random features."
"Real programmers don't comment. If it was hard to write, it should be hard to understand!"
Positive Bewertungen sind nicht unwillkommen...
Paul.Schramenko ist offline  
Alt 09.07.2010, 09:24  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

ich weis was bubblesort ist dont worry... jedoch funktioniert das nicht einfach mit bubblesort da ich ja nicht erst nach einer kriterie sortieren muss und dann nach einer anderen.. sondern ich muss den haufen in 2 teile spalten und dann nach den beiden kriterien sortieren.. so ich mach jetzt forum aus und konzentrier mich ein wenig..
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Alt 09.07.2010, 12:28  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

ok bin ein stückchen weitergekommen.. habe mein array nach entfernung sortiert

PHP-Code:
$liste = array(
    
=> array('paketNr' => 424'priority' => 1'distance' => 8),
    
=> array('paketNr' => 290'priority' => 1'distance' => 5),
    
=> array('paketNr' => 295'priority' => 2'distance' => 9),
    
=> array('paketNr' => 129'priority' => 1'distance' => 1),
    
=> array('paketNr' => 176'priority' => 3'distance' => 2),
    
=> array('paketNr' => 131'priority' => 2'distance' => 2),
    
=> array('paketNr' => 121'priority' => 1'distance' => 4),
    
=> array('paketNr' => 934'priority' => 1'distance' => 8),
    
=> array('paketNr' => 385'priority' => 1'distance' => 5),
    
=> array('paketNr' => 323'priority' => 3'distance' => 7),
    
10 => array('paketNr' => 287'priority' => 2'distance' => 4),
    
11 => array('paketNr' => 350'priority' => 2'distance' => 5)
);

do {
    
$zahl 0;
    for (
$i 0$i count($liste); $i++) {

        if (
$liste[$i]['distance'] >= $liste[$i 1]['distance'] && !empty($liste[$i 1]['distance'])) {
            if (
$liste[$i]['distance'] == $liste[$i 1]['distance']) {
                
$zahl++;
            }
            
$tmp_nr $liste[$i]['paketNr'];
            
$tmp_pri $liste[$i]['priority'];
            
$tmp_dist $liste[$i]['distance'];

            
$liste[$i]['paketNr'] = $liste[$i 1]['paketNr'];
            
$liste[$i]['priority'] = $liste[$i 1]['priority'];
            
$liste[$i]['distance'] = $liste[$i 1]['distance'];

            
$liste[$i 1]['paketNr'] = $tmp_nr;
            
$liste[$i 1]['priority'] = $tmp_pri;
            
$liste[$i 1]['distance'] = $tmp_dist;
        } else {
            
$zahl++;
        }
    }
} while (
$zahl count($liste));
$html '
    <table border="1" width="100%">' 
"\n" .
        
'<tr>' "\n" .
        
'<th>Index</th>' "\n" .
        
'<th>Paket Nummer</th>' "\n" .
        
'<th>Priorität</th>' "\n" .
        
'<th>Entfernung</th>' "\n" .
        
'</tr>' "\n";
foreach (
$liste as $index => $paket) {
    
$html .= '<tr>' "\n";
    
$html .= '<td>' $index '</td>' "\n";
    
$html .= '<td>' $liste[$index]['paketNr'] . '</td>' "\n";
    
$html .= '<td>' $liste[$index]['priority'] . '</td>' "\n";
    
$html .= '<td>' $liste[$index]['distance'] . '</td>' "\n";
    
$html .= '</tr>' "\n";
}

$html .= '</table>' "\n";
echo 
$html
als nächstes muss ich alle werte , bei den distanz unter 5 ist, nach der priorität sortieren(größte zahl zu erst) wenn 2 prioritäten gleich sind, dann muss nach der entfernung geschaut werden und die mit der kleinsten entfernung wird zuerst angezeigt. wenn entfernung und priorität gleich sind, dann ist die reihenfolge egal.. so da ich denke dass es nicht möglich ist, alles in eine schleife zu packen.. muss ich nach der ersten sortierung noch eine schleife reinsetzen.. habe es so versucht:

PHP-Code:
for ($i 0$i count($liste); $i++) {
    if (
$liste[$i]['distance'] < 5) {

        if (
$liste[$i]['priority'] < $liste[$i 1]['priority'] &&
                !empty(
$liste[$i 1]['priority']) &&
                
$liste[$i 1]['distance'] < 5) {

            
$tmp_nr $liste[$i]['paketNr'];
            
$tmp_pri $liste[$i]['priority'];
            
$tmp_dist $liste[$i]['distance'];

            
$liste[$i]['paketNr'] = $liste[$i 1]['paketNr'];
            
$liste[$i]['priority'] = $liste[$i 1]['priority'];
            
$liste[$i]['distance'] = $liste[$i 1]['distance'];

            
$liste[$i 1]['paketNr'] = $tmp_nr;
            
$liste[$i 1]['priority'] = $tmp_pri;
            
$liste[$i 1]['distance'] = $tmp_dist;
        }
    }

hat wunderbar funktioniert auch bei gleicher priorität , wird der datensatz mit der kleinsten entfernung zuerst dargestellt, nur habe ich da keine abfrage
PHP-Code:
if($liste[$i]['priority'] == $liste[$i 1]['priority']){
 
//sortiere zusätzlich nach entfernung

ist das ein zufall? oder benötigt man das nicht zu prüfen??
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Alt 09.07.2010, 13:13  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Das kommt darauf an, wie du deinen Algorithmus implementiert hast. Es wäre zumindest nicht sinnvoll, sich eine Sortierung durch einen zweiten Algorithmus wieder kaputtzumachen, wenn die Sortierung noch in bestimmtem Maße beibehalten werden soll.
Genauso sortierst du ja auch nach 2 oder mehr Spalten bei MySQL
Code:
ORDER BY col1 DESC, col2
Zunächst wird nach col1 absteigend sortiert und dann werden die Einträge, bei denen col1 denselben Eintrag hat, noch nach col2 aufsteigend sortiert.


So ganz verstehe ich auch nicht, wieso du jeden einzelnen Wert des Arrays einzeln zwischenspeicherst.
Code:
$tmp_nr = $liste[$i]['paketNr'];
$tmp_pri = $liste[$i]['priority'];
$tmp_dist = $liste[$i]['distance'];
Warum schreibst du dir nicht gleich das gesamte Array in eine temporäre Variable und schiebst das dann in einem Stück zurück an die richtige Position.
Asipak ist offline  
Alt 09.07.2010, 13:19  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

achso du meinst?

PHP-Code:

if(bla bla){
$temp_array $liste[$i];
$liste[$i] = $liste[$i+1];
$liste[$i+1] = $temp_array;

hm.. bin da nicht direkt draufgekommen
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline  
Alt 09.07.2010, 13:21  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Nö, noch einfacher!
Code:
$tmp_array = $liste[$i];
[edit] Da war ich wohl zu schnell

Geändert von Asipak (09.07.2010 um 13:25 Uhr).
Asipak ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Feed in Datenbank eintragen (Formate: json, php serialized, xml) high_five Datenbanken 5 17.06.2010 03:04
[Erledigt] Sortierung mehrerer Arrays philosapiens PHP Tipps 2010 16 08.06.2010 05:22
IE8 verliert Session Lenki PHP-Fortgeschrittene 10 25.04.2010 01:10
[Erledigt] Mehrdimensionales Array sortieren skandler PHP Tipps 2010 3 11.04.2010 17:45
[Erledigt] Problem bei update mit array feldern fulltilt PHP Tipps 2010 6 13.02.2010 00:59
[Erledigt] Tabellen die sich selbst referenzieren Squall PHP Tipps 2009 19 04.08.2009 21:33
[Erledigt] Array Sortieren beist PHP Tipps 2009 4 10.07.2009 08:53
Array umwandeln von zwei zu mehrdimensional erselbst PHP Tipps 2009 6 02.04.2009 23:30
Turnierbaum aus array erstellen kingflo PHP-Fortgeschrittene 11 30.07.2008 11:32
Array sortieren mit regex Lupi PHP Tipps 2008 3 21.07.2008 15:17
Array auslesen andrew22 PHP Tipps 2006 3 21.01.2006 23:06
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
Array verkehrt sortieren (key) // letzter Arrayeintrag PHP Tipps 2005-2 5 20.09.2005 15:55
Sortieren von Arrays mit mehr als 2 Dimensionen (Teil 2) Buhmann PHP-Fortgeschrittene 4 12.07.2005 14:03

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php array sortieren nach wert, php array sortieren, php array nach wert sortieren, php array zahlen sortieren, php zahlen sortieren array, php array sortieren zahlen, array zahlen sortieren, php mehrdimensionales array nach zahl ordnen, zahlen sortieren array, php list array sortieren, php sortieralgorithmus, php nach der größten zahl sortieren, array sortieren zahlen php, php array sortieren nach zahl, zahlen sortieren php array, zahlen in einem array sortieren, sortieralgorithmen php, php zahlen array sortieren, array nach bestimmten kriterien sortieren, array ordnen von zahlen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:06 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum