bruno: alle werte eines array vergrössern oder verkleineren

hi Leute,

ich möchte gern die Werte die aus Zahlen bestehen alle um 10% verringern oder erhöhen!

gitb es dafür eine Array-Funktoin ich haben leider noch keine gefunden!

mfg bruno

  1. Moin,

    ich möchte gern die Werte die aus Zahlen bestehen alle um 10% verringern oder erhöhen!

    gitb es dafür eine Array-Funktoin ich haben leider noch keine gefunden!

    du könntest es entweder ganz stupide über eine Schleife oder dir die array_walk-Funktion angucken.

    http://de.php.net/manual/en/function.array-walk.php

    HtH,
      Juan

    1. hi juan,

      werd mir die funkion mal angucken, danke für den Tipp.

      mfg bruno

  2. Hallo,

    ich möchte gern die Werte die aus Zahlen bestehen alle um 10% verringern oder erhöhen!

    gitb es dafür eine Array-Funktoin ich haben leider noch keine gefunden!

    Wo hast Du denn gesucht?

    Willst Du nur die Werte mit echtem numerischen Typ behandeln, oder auch solche, die aussehen, wie eine Nummer oder eine Zahl?

    Array_map() würde in Frage kommen.

    Sonst bau eine foreach()-Schleife.
    Selbst mit "Sicherheitsabfragen" für Numerischen Typ ergibt das nur wenige Zeilen Code. Außerdem solltest Du an Rekursion denken. Also zuerst eine Funktion naufbauen, die beim Typ "Array" sich selbst aufruft.

    LG
    Chris

    1. hi Chris,

      ja die foreach schleife hab ich schon fast vergessen, naja bei php.net bin ich mal die Funkionen durchgegangen aber die englischen sagen mir nicht sofort was.

      mfg bruno

      1. hi Chris,

        sag mal ich möchte ja die werte ändern und geändert weiter verwenden muss die dann in ein neues array packen oder wie geht das ?

        so siehts grad aus :

        {foreach($zeiten as $value){$value * 2;}echo $zeiten[0]; }

        mfg bruno

        1. Hallo Bruno,

          sag mal ich möchte ja die werte ändern und geändert weiter verwenden muss die dann in ein neues array packen oder wie geht das ?

          so siehts grad aus :

          {foreach($zeiten as $value){$value * 2;}echo $zeiten[0]; }

          Foreach() arbeitet mit einer Kopie vom Array.

          foreach($zeiten as $key => $value)
             {
               $zeiten[$key] = $zeiten[$key] * 2;
             }

          oder auch:

          foreach($zeiten as $key => $value)  # [1]
             {
               $zeiten[$key] = $value * 2;       # [2]
             }

          Das $zeiten als foreach-Argument (also in der Klammer [1]) ist eine Kopie, das $zeiten innerhalb der foreach()-Schleife [2] ist das Original-Array.

          Die Kopie ist nach dem Schleifendurchlauf vergessen.

          LG
          Chris

          1. Hi Chris,

            ok danke soweit!

            foreach($zeiten as $key => $value)
               {
                 $zeiten[$key] = $zeiten[$key] * 2; // woher weiss php jetzt welches das orginal ist , weil mit der kopie gearbeitet wird?
               }

            foreach($zeiten as $key => $value)  # [1]
               {
                 $zeiten[$key] = $value * 2;       # [2]// wieso benutzt du den key, den kann ich doch auch ändern oder ?
               }

            bruno

            1. Hallo Bruno,

              foreach($zeiten as $key => $value)
                 {
                   $zeiten[$key] = $zeiten[$key] * 2; // woher weiss php jetzt welches das orginal ist , weil mit der kopie gearbeitet wird?
                 }

              Das Array, das als Attribut in der foreach( * )-Klammer steht, ist immer eine Kopie. $key und $value sind ebenfalls nur Kopien. Wenn Du die also änderst, hat das keine Relevanz für das Original-Array.

              Wenn aber innerhalb der Foreach()-Schleife auf Variablen zugegriffen wird, also zwischen   {   und   } , dann sind das immer die Originale des jeweiligen Scopes, in dem foreach() steht.

              foreach($zeiten as $key => $value)  # [1]
                 {
                   $zeiten[$key] = $value * 2;       # [2]// wieso benutzt du den key, den kann ich doch auch ändern oder ?
                 }

              Den Key kannst Du nicht ändern. Du kannst lediglich ein Element mit dem Key löschen und ein neues mit einem anderen anlegen. Dann würde es am Ende des "Arrays" angehängt werden, egal welchen key es bekommt. Voraussetzung ist, dass der neue Key noch nicht vorhanden war, sonst würde das Element mit dem vorhandenen Key an seiner derzeitigen Position überschrieben werden.

              Du solltest Dir Arrays in PHP immer als verkettete Baumstruktur unterscheidlichster Elemente vorstellen und nicht als geschlossene Speicherstruktur gleichartiger Elemente.

              LG
              Chris

              1. Guten Abend Chris,

                deine Erkärungen sind sehr hilfreich.

                ich habe nun alle drei möglichkeiten ausprobiert inklusive array_map und sie funktionieren alle.

                Es sind drei änderungen möglich die immer am anfang abgefagt werden und dann wird die zeit je nach änderung geändert.

                Nun möchte ich das geänderte array $zeiten in ein anderes array packen, welches dann in einen Cookie kommt.

                aber so scheint es nicht zu klappen

                $serial = array($zeiten,$_GET['grad']);

                hier der text untern bei $serial machen ich es dann mit den feldern einzelt aber dann nimmt er halt immer 2000 wenn ich $b oder $zeiten reinmache wird nichts im cookie gespeichert obwohl ich mit print_r ($serial); die entsprechenden Werte rauskriege.

                $zeiten = array($feld1 = 2000,$feld2 = 2000,$feld3 = 2000,$feld4 = 2000,
                $feld5 = 2000,$feld6 = 2000,$feld7 = 2000,$feld8 = 2000,);

                if(isset($_GET['grad']))
                {
                    if ($_GET['grad']==mittel)
                  {   function cube($n) {return $n*2;}

                $b = array_map("cube", $zeiten);
                         print_r($b[0]);
                    }

                elseif($_GET['grad']==leicht) {foreach($zeiten as $key => $value){$zeiten[$key] = $value * 3;}echo $zeiten[0]; }

                elseif($_GET['grad']==schwer) {foreach($zeiten as $key => $value){$zeiten[$key] = $zeiten[$key] * 4;}echo $zeiten[0];}
                }

                //

                if(isset($_GET['sub'])){
                $serial = array($feld1,$feld2,$feld3,$feld4,$feld5,$feld6,$feld7,$feld8,$_GET['grad']);
                $daten_string = implode("&",$serial);

                Du solltest Dir Arrays in PHP immer als verkettete Baumstruktur unterscheidlichster Elemente vorstellen und nicht als geschlossene Speicherstruktur gleichartiger Elemente.

                kennst du eine gute website wo sowas näher gebracht wird mit algorithmen und so ?`

                mfg bruno

                1. Guten Abend Chris,

                  hab grad gesehen in der ausgabe von print_r macht er mir [0] als array und dann kommen die aufzählungen also kann ich das wohl so vergessen

                  $serial = array($zeiten,$_GET[grad]);

                  er ändert doch eigentlich die $zeiten direkt bei anwendung von foreach.
                  wieso übernimmt er sie dann nicht wenn ich folgendes mache

                  $serial = array($feld1,$feld2,bis acht halt ,$_GET['grad']);

                  wenn es so im ausgangs array steht den anscheinend greift er dann auf jenes was doch eigentlich geänder sein sollte.

                  hier mal der ganze text

                  $zeiten = array($feld1 = 2000,$feld2 = 2000,$feld3 = 2000,$feld4 = 2000,
                  $feld5 = 2000,$feld6 = 2000,$feld7 = 2000,$feld8 = 2000,);

                  if(isset($_GET['grad']))
                  {
                      if ($_GET['grad']==mittel)
                    {   function cube($n) {return $n*2;}

                  $b = array_map("cube", $zeiten);
                           print_r($b[0]);
                      }

                  elseif($_GET['grad']==leicht) {foreach($zeiten as $key => $value){$zeiten[$key] = $value * 3;}echo $zeiten[0]; }

                  elseif($_GET['grad']==schwer) {foreach($zeiten as $key => $value){$zeiten[$key] = $zeiten[$key] * 4;}echo $zeiten[0];}
                  }

                  //$feld1,$feld2,$feld3,$feld4,$feld5,$feld6,$feld7,$feld8

                  if(isset($_GET['sub'])){
                  $serial = array($zeiten,$_GET['grad']);
                  $daten_string = implode("&",$serial);
                  setcookie("cook_first_one",$daten_string,time()+60*60*24*10);}
                  elseif(isset($_COOKIE['cook_first_one'])){
                  $cook_daten = explode("&",$_COOKIE["cook_first_one"]);
                  }

                  ?>

                  mfg bruno

                  1. hi ,

                    hab dit jetzt so gemacht und das klappt.

                    $serial = array ($zeiten[0],$zeiten[1],bis sieben ,$_GET['grad']);

                    wenn du noch ein besseren vorschlag hast kannst du mir den gerne ansagen, oder warum die felder die zuerst ganz oben ins array kommen nicht angesprochen werden mit änderung?

                    also $serial = array($feld1 immer 2000 bleibt ?)

                    gute nacht bruno