Patzschke Steffen: Arrays zusammenführen

Liebe PHP Gemeinde,

habe ein Problem mit der Zusammenführung von assoziierten Arrays:

<?php
$ary_maschkosten=array();
array_push($ary_maschkosten,array("maschkost_jahre"=>1999,"MaschKosten"=>0));
array_push($ary_maschkosten,array("maschkost_jahre"=>2000,"MaschKosten"=>0));
array_push($ary_maschkosten,array("maschkost_jahre"=>2001,"MaschKosten"=>0));

print_r(($ary_maschkosten));

$ary_maschkosten_qry=array();

array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2000,"MaschKosten"=>1000));

print_r(($ary_maschkosten_qry));

?>

Im Ergenbis brauche ich beide in einem, jedoch der Datensatz mit "MaschKosten"=>1000 muß den "MaschKosten"=>0 ersetzen. Ich bitte um Hilfe, denn ich schlage mich schon einen Tag damit rum. Mit in array hab ich's auch schon versucht; keine Chance gefunden in einem assoz. Array direkt zu suchen, oder doch?

Tausend Dank.

  1. Hallo Patzschke,

    Dein Array:

      
    $ary_maschkosten=array();  
    array_push($ary_maschkosten, array("maschkost_jahre"=>1999,"MaschKosten"=>0));  
    array_push($ary_maschkosten, array("maschkost_jahre"=>2000,"MaschKosten"=>0));  
    array_push($ary_maschkosten, array("maschkost_jahre"=>2001,"MaschKosten"=>0));  
    
    

    Und nun möchtest du also den Eintrag ersetzen, wo der Eintrag "maschkost_jahre" = 2000 ist, aber folgender Code hängt dir natürlich einfach nur das Array dran:
    array_push($ary_maschkosten, array("maschkost_jahre"=>2000,"MaschKosten"=>1000));

    Vielleicht solltest du es mit einer Schleife versuchen:

      
    for($i=0; $i<count($ary_maschkosten); $i++)  
    {  
      if($ary_maschkosten[$i]['maschkost_jahre'] == 2000)  
      {  
        $ary_maschkosten[$i] = array("maschkost_jahre"=>2000,"MaschKosten"=>1000);  
        break;  
      }  
    }  
    
    

    Und so wie ich das sehe wäre eine Datenbank für dich genau das richtige, um all deine Probleme _komfortabel_ zu lösen. Suchwort für dich ist hierbei z.B. "MySQL".

    Grüße

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Hallo Marc,

      danke für deine Antwort. Das Array $ary_maschkosten_qry kommt aus DISTINCT- Query einer Access-DB. Nun ist es so, dass ich das Array $ary_maschkosten über eine Schleife mit den Jahren 1999-2009 (immer 10Jahre) fülle und den MaschKosten hier null(0) übergebe. Die DISTICNT Query liefert nun MaschKost für z.B. 2001,2003 und 2005. Jetzt brauche ich ein Array wo alle 10 Jahre gelistet sind und in den relevanten MaschKost aus den ermittelten Jahren der DISTINCT-query. ok?

      danke für deine bemühungen.

      1. hallo mark,

        hier meine php-datei, die mittlerweile funktioniert. ich vergleiche jetzt
        die beiden array mit 2 for schleifen aber gibt es da keine bessere lösung,
        da er ja 'zig mal vergleichen muß. probier sie mal aus und dann weißt du wo
        mein problem liegt. danke dir.

        <html>
        <body>
        <?php
        $ary_maschkosten=array();
        array_push($ary_maschkosten,array("maschkost_jahre"=>1999,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2000,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2001,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2002,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2003,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2004,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2005,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2006,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2007,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2008,"MaschKosten"=>0))
        ;
        array_push($ary_maschkosten,array("maschkost_jahre"=>2009,"MaschKosten"=>0))
        ;

        echo "<b>das ist das pauschl gefüllte Array</b><br>";
        print_r(($ary_maschkosten));

        $ary_maschkosten_qry=array();

        array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2000,"MaschKosten"=

        1000));

        array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2001,"MaschKosten"=

        500));

        array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2007,"MaschKosten"=

        777));

        echo "<b>und das sind die echten werte der DB</b><br>";
        print_r(($ary_maschkosten_qry));

        for($i=0; $i<count($ary_maschkosten); $i++)
        {
         for($k=0; $k<count($ary_maschkosten_qry); $k++)
         {

        if($ary_maschkosten[$i]['maschkost_jahre'] ==
        $ary_maschkosten_qry[$k]['maschkost_jahre'])
           { //echo "drin ".$ary_maschkosten[$i]['maschkost_jahre']."i".$i."k".$k."
        <br>";
             $ary_maschkosten[$i] =
        array("maschkost_jahre"=>$ary_maschkosten_qry[$k]['maschkost_jahre'],"MaschK
        osten"=>$ary_maschkosten_qry[$k]['MaschKosten']);
             break;
           }
           else
           {
           //echo "else
        ".$ary_maschkosten[$i]['maschkost_jahre']."I".$i."K".$k."<br>";
           $ary_maschkosten[$i] =
        array("maschkost_jahre"=>$ary_maschkosten[$i]['maschkost_jahre'],"MaschKoste
        n"=>$ary_maschkosten[$i]['MaschKosten']);
           }

        }
        }

        echo "<b>und das soll das ergebnis sein</b><br>";
        print_r(($ary_maschkosten));

        ?>
        </body>
        </html>

        1. Ahoi Steffen,

          warum nimmst du nicht das array aus der DB und fügst dann die fehlenden jahre mit 0 hinzu?

            
          $ary_maschkosten_qry=array();  
          array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2000,"MaschKosten"=>1000));  
          array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2001,"MaschKosten"=>500));  
          array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2007,"MaschKosten"=>777));  
            
          $jahr = 1999;  
            
          foreach($ary_maschkosten_qry as $zwischenwert)  
          {  
            while($jahr < $zwischenwert['maschkost_jahre'])  
            {  
              $echtewerte[]['maschkost_jahre'] = $jahr;  
              $echtewerte[]['MaschKosten'] = 0;  
              $jahr++  
            }  
            $echtewerte[]['maschkost_jahre'] = $zwischenwert['maschkost_jahre'];  
            $echtewerte[]['MaschKosten'] = $zwischenwert['MaschKosten'];  
          }  
          
          

          MfG

          --
          Alle Angaben wie immer ohne Gewähr
          \     \           /    /              \    \          /     /
           \     \         /    /                \    \        /     /
            \     /´¯.l.¯\    /                  \   /´¯.l.¯\     /
            |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |
            l    l   .l.   \   \                 /   /   .l.   1    1
            l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1
            \                                                       /
          1. Ahoi Daniel,

            $ary_maschkosten_qry=array();
            array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2000,"MaschKosten"=>1000));
            array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2001,"MaschKosten"=>500));
            array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2007,"MaschKosten"=>777));

            $jahr = 1999;

            $z=0;

            foreach($ary_maschkosten_qry as $zwischenwert)
            {
              while($jahr < $zwischenwert['maschkost_jahre'])
              {
                $echtewerte[$z]['maschkost_jahre'] = $jahr;

            ^^

            $echtewerte[$z]['MaschKosten'] = 0;

            ^^

            $jahr++;

            ^
                   $z++;

            }
              $echtewerte[$z]['maschkost_jahre'] = zwischenwert['maschkost_jahre'];

            ^^

            $echtewerte[$z]['MaschKosten'] = $zwischenwert['MaschKosten'];

            ^^
                 $jahr++;
                 $z++;

            }

              
            Jetzt must du nurnoch wegen der 10 jahresspanne kucken ein if($z<10) bzw. while() könnte helfen.  
              
            MfG  
            
            -- 
            Alle Angaben wie immer ohne Gewähr  
              
            \     \           /    /              \    \          /     /  
             \     \         /    /                \    \        /     /  
              \     /´¯.l.¯`\    /                  \   /´¯.l.¯`\     /  
              |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |  
              l    l   .l.   \   \                 /   /   .l.   1    1  
              l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1  
              \                                                       /
            
            1. hi daniel,

              hier nochmal mein ganzer code. es funktioniert so aber gibt es denn nicht eine bessere variante, denn so läuft er ja 'zig mal durch die schleifen und prüft!

              <html>
              <body>
              <?php
              $ary_maschkosten=array();
              array_push($ary_maschkosten,array("maschkost_jahre"=>1999,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2000,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2001,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2002,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2003,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2004,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2005,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2006,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2007,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2008,"MaschKosten"=>0));
              array_push($ary_maschkosten,array("maschkost_jahre"=>2009,"MaschKosten"=>0));

              echo "<b>das ist das pauschl gefüllte Array</b><br>";
              print_r(($ary_maschkosten));

              $ary_maschkosten_qry=array();

              array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2000,"MaschKosten"=>1000));
              array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2001,"MaschKosten"=>500));
              array_push($ary_maschkosten_qry,array("maschkost_jahre"=>2007,"MaschKosten"=>777));

              echo "<b><br>und das sind die echten werte der DB</b><br>";
              print_r(($ary_maschkosten_qry));

              $total_maschkost=0;
              for($i=0; $i<count($ary_maschkosten); $i++)
              {
               for($k=0; $k<count($ary_maschkosten_qry); $k++)
               {

              if($ary_maschkosten[$i]['maschkost_jahre'] == $ary_maschkosten_qry[$k]['maschkost_jahre'])
                 { //echo "drin ".$ary_maschkosten[$i]['maschkost_jahre']."i".$i."k".$k." <br>";
                   $ary_maschkosten[$i] = array("maschkost_jahre"=>$ary_maschkosten_qry[$k]['maschkost_jahre'],"MaschKosten"=>$ary_maschkosten_qry[$k]['MaschKosten']);
                   $total_maschkost=$total_maschkost+$ary_maschkosten_qry[$k]['MaschKosten'];
                   break;
                 }
                 //else
                 //{
                 //echo "else ".$ary_maschkosten[$i]['maschkost_jahre']."I".$i."K".$k."<br>";
                 //$ary_maschkosten[$i] = array("maschkost_jahre"=>$ary_maschkosten[$i]['maschkost_jahre'],"MaschKosten"=>$ary_maschkosten[$i]['MaschKosten']);
                 //}

              }
              }

              echo "<b>und das soll das ergebnis sein</b><br>";
              print_r(($ary_maschkosten));

              echo "<br>".$total_maschkost."\n";

              ?>
              </body>
              </html>

              1. Ahoi Steffen,

                hi daniel,

                hier nochmal mein ganzer code. es funktioniert so aber gibt es denn nicht eine bessere variante, denn so läuft er ja 'zig mal durch die schleifen und prüft!

                hast du meinen code auch gelesen? da prüfst du dann nicht so oft.

                PS: von 1999 bis 2009 sind 11 jahre und keine 10.

                MfG

                --
                Alle Angaben wie immer ohne Gewähr
                \     \           /    /              \    \          /     /
                 \     \         /    /                \    \        /     /
                  \     /´¯.l.¯\    /                  \   /´¯.l.¯\     /
                  |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |
                  l    l   .l.   \   \                 /   /   .l.   1    1
                  l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1
                  \                                                       /
                1. Ja, du hast recht aber ich dachte es gibt eine Variante so ganz ohne schleifen, so dirket über array-funktionen.

                  Ciao Steffen

                  1. Ahoi Steffen,

                    Ja, du hast recht aber ich dachte es gibt eine Variante so ganz ohne schleifen, so dirket über array-funktionen.

                    evt. kannst du dir mit
                    http://de3.php.net/manual/de/function.array-diff.php
                    etwas basteln. oder einer anderen array funktion
                    http://de3.php.net/manual/de/ref.array.php

                    MfG

                    --
                    Alle Angaben wie immer ohne Gewähr
                    \     \           /    /              \    \          /     /
                     \     \         /    /                \    \        /     /
                      \     /´¯.l.¯\    /                  \   /´¯.l.¯\     /
                      |    l   .l.  (¯ '\                   /' ¯)  .l.   1    |
                      l    l   .l.   \   \                 /   /   .l.   1    1
                      l    l´¯.l´¯.l  \  '|               |'  /  1.¯´1.¯´1    1
                      \                                                       /