Mailinglisten-Archive |
--k1lZvvs/B4yU6o8G Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Hi, On Wed, Dec 08, 1999 at 07:03:30PM +0100, Armin Steiner aka QUAKEman wrote: > > In einem Array sind Zahlen. > > Ich brauche den grössten und den kleinsten > > Wert, will das Array aber nicht verändern. ^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > Geht es elegant, oder nur mit if $a < $b ....? > Schreibe eine funktion, die den Array einmal von "lowest nach highest" > sortiert [sort()] und einmal von "highest nach lowest" [rsort()]. ... a) er will das 'array' dabei aber eigentlich nicht veraendern (aus welchen Gruenden auch immer). Wenn er sich die Ergebnisse durch eine Funktion wie z.B. list( $min, $max ) = find_min_and_max( $theArray ); berechnen laesst, wird bei Uebergabe des Feldes $theArray mittels 'call by value' (das ist der Normalfall bei PHP) eine komplette Kopie des Feldes faellig. (Das kann bei grossen Feldern teuer sein) Waehlt man um effizienteren Code zu erhalten die Parameteruebergabe 'call by reference' wird der Sortiervorgang eben doch wieder das Original-Feld veraendern. > Jeweils ziehst du dir dann den index 0 des arrays raus, und gibst > ihn aus. ... b) Warum willst Du das Feld denn dann auch noch zweimal sortieren? Wenn es einmal (aufsteigend) 'sortiert' ist, steht das kleinste Element am Anfang und groesste Element zum Schluss. Also koennte die Funktion z.B. (ungetestet) so aussehen. function find_min_max_A( $theArray ){ sort( $theArray ); $theMin = reset( $theArray ); end( $theArray ); $theMax = current( $theArray ); return array( $theMin, $theMax ); } Mich wuerde daran bei grossen Feldern die eigentlich unnoetige Kopie des Arrays stoeren (s.o.) Es stellt sich also die Frage, 'warum' soll das Ursprungsfeld nicht veraendert werden? - Wahrscheinlich, weil die sequentielle Reihenfolge der Elemente spaeter noch benoetigt wird. Wenn das Feld spaeter ueber eine auf- oder absteigende Folge von Schluesseln erfolgen kann, koennte man versuchen die 'schluesselerhaltende' Eigenschaft der Standardfunktion 'asort' auszunutzen. Also (mit 'call-by-reference'-Parameter, keine Kopie notwendig) : function find_min_max_B( &$theArray ){ asort( $theArray ); $theMin = reset( $theArray ); end( $theArray ); $theMax = current( $theArray ); return array( $theMin, $theMax ); } Zwar ist das Ursprungsarray nachher veraendert, aber (mal ein 'normales' ueber Ganzzahlen indiziertes Feld vorausgesetzt) die durch den Index urspruenglich definierte Ordnung auf den Werten der einzelnen Feldelemente ist erhalten geblieben. Eine Schleife der Art for( $i=0; $i < count( $ourArray ); $i++ ){ echo "<p>ourArray[" . $i . "]:" . $ourArray[ $i ] . "</p>\n"; } liefert dann weiterhin die 'alte' Folge der Werte, obwohl sich die 'physikalische' Anordnung der Feldelemente durchaus geaendert hat. Hmmm. Da es jetzt sowieso schon so lang geworden ist, haeng' ich doch noch ein kleines Demo-Script mit an die Mail. Gruss, Andreas -- : TSE GmbH Neue Medien : Gsf: Arne Reuter : : : Hovestrasse 14 : Andreas Braukmann : We do it with : : D-48351 Everswinkel : HRB: 1430, AG WAF : FreeBSD/SMP : :--------------------------------------------------------------------: : Anti-Spam Petition: http://www.politik-digital.de/spam/ : : PGP-Key: http://www.tse-online.de/~ab/public-key : : Key fingerprint: 12 13 EF BC 22 DD F4 B6 3C 25 C9 06 DC D3 45 9B : --k1lZvvs/B4yU6o8G Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="array-test.php3" <?php function find_min_max_A( $theArray ){ sort( $theArray ); $theMin = reset( $theArray ); end( $theArray ); $theMax = current( $theArray ); return array( $theMin, $theMax ); } function find_min_max_B( &$theArray ){ asort( $theArray ); $theMin = reset( $theArray ); end( $theArray ); $theMax = current( $theArray ); return array( $theMin, $theMax ); } $ourArray = array( 3, 10, 456, 1, 5, 43, 7 ); echo "<H3>Das Feld vor der Sortierung</H3>\n"; for( $i=0; $i < count( $ourArray ); $i++ ){ echo "<p>ourArray[" . $i . "]:" . $ourArray[ $i ] . "</p>\n"; } list( $min, $max ) = find_min_max_A( $ourArray ); echo "<H3>Test von find_min_max_A</H3>\n"; echo "<p>Min: $min - Max: $max </p>\n"; echo "<H4>Das Feld nach der Sortierung</H4>\n"; for( $i=0; $i < count( $ourArray ); $i++ ){ echo "<p>ourArray[" . $i . "]:" . $ourArray[ $i ] . "</p>\n"; } list( $min, $max ) = find_min_max_B( $ourArray ); echo "<H3>Test von find_min_max_A</H3>\n"; echo "<p>Min: $min - Max: $max </p>\n"; echo "<H4>Das Feld in alter sequentieller Ordnung <br>"; echo "nach der Sortierung</H4>\n"; for( $i=0; $i < count( $ourArray ); $i++ ){ echo "<p>ourArray[" . $i . "]:" . $ourArray[ $i ] . "</p>\n"; } echo "<H4>Das Feld nach der Sortierung</H4>\n"; reset( $ourArray ); while( list( $key, $value ) = each( $ourArray ) ){ echo "<p>ourArray[" . $key . "]:" . $value . "</p>\n"; } ?> --k1lZvvs/B4yU6o8G--
php::bar PHP Wiki - Listenarchive