phpbar.de logo

Mailinglisten-Archive

[php] Re: =?iso-8859-1?Q?=5Bphp=5D_Re:_=5Bphp=5D_kleinster_&_gr=F6sster_Wert_im_Ar?= =?iso-8859-1?Q?ray=3F?= =?iso-8859-1?Q?ray=3F?=

[php] Re: =?iso-8859-1?Q?=5Bphp=5D_Re:_=5Bphp=5D_kleinster_&_gr=F6sster_Wert_im_Ar?= =?iso-8859-1?Q?ray=3F?= =?iso-8859-1?Q?ray=3F?=

Andreas Braukmann braukmann_(at)_tse-online.de
Wed, 8 Dec 1999 21:35:33 +0100


--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