array_push mehrdimensional

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • array_push mehrdimensional

    Ich habe ein kleines Problem bei einem array.
    Ich habe ein Array $arrayAnzahl. Dort möchte ich nun eine Anzahl($anz) einem Monat($m) in einem Jahr($j) zu teilen. Also in etwa so:

    Quellcode

    1. array_push($arrayAnzahl[$j][$m], $anz);


    Dabei wird das Jahr und der Monat immer hochgezählt in for-schleifen. Also so etwas:

    Quellcode

    1. for($j=2010;$j<=2013;$j++){ for($m=1;$m<=12;$m++){ $anz=irgendwas array_push($arrayAnzahl[$j][$m], $anz); }}


    Nun ist das Problem, das das mit dem array_push nicht funktioniert. Hab es auch schon mit $arrayAnzahl[$j][$m]=$anz versucht aber auch das ging nicht. Dann wurde nämlich nur das letzte array erstellt also das inwelchem $j 2013 war... Kann mir jemand sagen wie ich den array_push so mache, dass ich ihn dann einfach über
    echo $arrayAnzahl[$j][$m];
    ansprechen kann?
  • Dann stimmt die Deklaration von $anz nicht, aber ich kann den Fehler grad nicht nachvollziehen.
    Woher kommt $anz? Ist das ein fester Wert oder ergibt er sich aus einer Datenbank? Wenn es ein fester Wert ist kannst du meinen Beispielcode 1 zu 1 verwenden, wenn sich $anz für jeden Monat ändert muss das natürlich innerhalb der zweiten for-Schleife ablaufen.
    Da habe ich leider zu wenig Informationen, um dir wirklich helfen zu können.
  • Ok ich kann es dir mal etwas besser erläutern. Sorry meine Erklärung zu meinem Problem war etwas kurz...
    Also Ich stelle in meinem kleinen Projekt vergleiche an zwischen anzahlen von Artikeln, welche gekauft wurden. Der user gibt für den Monat Januar im Jahr 2010 eine gesammtanzahl ein. Diese Anzahl wird dann in die Datenbank eingetragen. Dann möchte ich in einer Rubrik nun die Statistiken erstellen. Hierzu hole ich mir die Anzahl aus der Datenbank und speichere sie in der Variable $anz. Mit Hilfe von 2 for-schleifen möchte ich diese anzahl in ein array speichern und dann zum schluss ausgeben. Ich setze den Monat und das Jahr zusammen und dies ist dann eine neue Variable $tmonat. Diese Variable gehört zu einem Vergleich $i und hat den Wert, welcher für diesen Monat in dem Jahr eingegeben wurde, zugewiesen. Das sieht so aus:
    $i=id des vergleichs
    $tmonat=zusammensetzung des Jahrs und des Monats
    $vjahr.$vmonat=erster monat im vergleich
    $bjahr.$bmonat=letzter monat im vergleich
    $sstmonat=substring letzte 2 ziffern der zusammensetztung aus jahr und monat, also eigentlich nur die monatsid z.b 1 für januar,...

    Quellcode

    1. For($i=1;$i<='anzahl der Vergleiche'; $i++){
    2. ...
    3. For($tmonat=$vjahr.$vmonat; $tmonat<=$bjahr.$bmonat; $tmonat++){
    4. ...
    5. $arrayAnz[$i][$sstmonat] = $anz;
    6. ...
    7. }
    8. }

    Die for schleifen funktionieren einwandfrei. Ich erhalte die richtigen werte und so aber wenn ich mir dann die werte aus dem array rausholen will, beispielsweise so:

    Quellcode

    1. echo "</br>".print_r($arrayAnz)."</br>";

    Zeigt es mir wenn ich zum beispiel 2 vergleiche gemacht habe, nur die werte des 2ten vergleichs an:
    array [2]=>[5]=>3...
    also die 2 ist der 2te vergleich, die 5 steht für den monat mai und die 3 ist die anzahl, welche zugewiesen wurde. Allerdings gibt es mir bei der ausgabe eben immer nur werte für den 2ten vergleich obwohl auch werte für den ersten vorhanden wäre. Die werte welche eingetragen werden ins array sind alles integer sowohl beim ersten als auch beim 2ten vergleich. Wenn ich jetzt einfach mal getestet habe es explizit anzusprechen also mit:

    Quellcode

    1. echo $arrayAnz[1][5];

    erhalte ich den Fehler: undefined offset 1 ...
    Was ja heisst, das es die 1 in diesem array nicht gibt. Jetzt habe ich mit einem if-statment und !isset($array[$i][$tmonat]){$array...=0} gesagt dass es mir einfach 0 als wert zurückgeben soll, falls das gesuchte array nicht existiert. Dann erhalte ich für alle Werte die ich ausgeben will vom ersten vergleich die rückgabe 0 und vom 2ten vergleich die korrekten werte.

    Achtung ich erhalte die werte des 2ten array nur wenn 2 der letzten vergleich ist, wenn ich als anzahl vergleiche 3 eingebe, erhalte ich die korrekten werte des 3ten vergleichs und die des 1ten und 2ten sind 0.

    Bei Fragen gerne fragen. Ich konnte das Probelm auf das array eingrenzen also mit den for-schleifen ist alles ok.

    Danke schon mal
  • Ich bin mir nicht sicher, ob ich dich richtig verstanden, also korrigiere mich, wenn ich falsch liege.

    Quellcode

    1. $arrayAnz[$i][$sstmonat] = $anz;

    Wenn $sstmonat == $m ist, dann überschreibst du unter Umständen Werte aus dem Array, allerdings erklärt das nicht, warum Werte fehlen :S
    Außerdem verändert sich dann die Zuweisung der Schlüsselwerte.

    Quellcode

    1. array(
    2. 1 => array( // diese 1 ist deine Vergleichs-ID
    3. 1 => 42 // diese 1 ist dein Monat der sich aus $sstmonat ergibt
    4. )
    5. )
    6. // sollte das nicht eher so aussehen?
    7. array(
    8. 2010 => array( // jahr
    9. 1 => 42, // monat => wert, aus DB
    10. 2 => 21
    11. )
    12. )
    Alles anzeigen


    Ich hab noch ein anderes Verständnisproblem:
    Du sagst in der ersten For-Schleife "mache x Vergleiche", aber in der zweiten For-Schleife lässt du jedesmal den kompletten Zeitraum durchlaufen. Evtl muss das so sein für deine Berechnung, aber momentan erkenn ich den Sinn dahinter nicht?
  • Das mit dem $m war ein beispiel. Ich dachte es sei dann das selbe problem...
    Tut mir leid für meine formulierung, glaub bin nicht so im stande, es verständlich auszudrücken.^^
    [$i] soll die Vergleichsid sein. Ich habe mehrere vergleiche von sozusagen zeitspannen. Die zeitspannen beinhalten die einzellnen monaten mit ihren werten.
    [$sstmonat] soll die monatszahl sein also die 1 für den januar, die 2 für den februar,...
    Ein vergleich hat eine gewisse anzahl monate und jeder dieser monate hat dann genau eine anzahl.
    Also so:
    $i = 1 //also verlgeich nummer 1
    $sstmonat = 1 //der monat ist januar
    $anz = 5 // die anzahl ist 5

    In der ersten for-schleife; for($tmonat=$vjahr.$vmonat; $tmonat<=$bjahr.$bmonat; $tmonat++); werden die monate hochgezählt.
    In der
    zweiten for-schleife; For($i=1;$i<=$anzahl; $i++); wird die vergleichsid hochgezählt.
    Die erste for-schleife befindet sich in der zweiten for-schleife, damit in jedem verlgeich die monate hochgezählt werden.

    Wie gesagt, die forschleifen funktionieren, hab es mit echos getestet. Was sich jetz aber als schwierig erweist ist die anzahl den monaten zuzuweisen.
    Mit der Variante $arrayAnz[$i][$sstmonat]=$anz; erhalte ich immer nur die werte zu der letzten vergleichsid und ich hab keine ahnung wiso...

    Falls es noch fragen bitte gerne fragen und sonst gerne antworten ^^

    Danke schonmal freeek für deine hartnäckigkeit bei meinem problem
  • Ich schick dir morgen mal den Code der ganzen Datei und mach paar notizen zur erklärung... Ich erkenne den Fehler nämlich auch nicht. Array wird vor den beiden Forschleifen instaziert ($ArrayAnz = new array()) und dann in der zweiten Forschleife editiert. Ich weiss nicht ob der Fehler daran liegen kann, das ich es ohne parameter instaziere und dann direkt ein zweidimensionales array editiere... Aber mehr dazu morgen

    Vielen Dank schonmal
  • So hier mal der relevante Codeteil:

    Quellcode

    1. If(isset($_POST['Vergleich'])AND isset($_POST['Anzahl'])){
    2. $vergleich = $_POST['Vergleich'];
    3. $anzahl = $_POST['Anzahl'];
    4. Switch ($vergleich){
    5. case 1:
    6. $arrayvj = array();
    7. $arraybj = array();
    8. For($i=1;$i<=$anzahl; $i++){
    9. $arrayAnz = array(); //array[Vergleich][Monat]=anzahl
    10. If(isset($_POST['VJahr'.$i])AND isset($_POST['VMonat'.$i])AND isset($_POST['BJahr'.$i])AND isset($_POST['BMonat'.$i])AND isset($_POST['Tabelle'])AND (isset($_POST['Gaestekartetyp'])OR isset($_POST['Altersklasse']))){
    11. If($_POST['VJahr'.$i]=="" OR $_POST['VMonat'.$i]=="" OR $_POST['BJahr'.$i]=="" OR $_POST['BMonat'.$i]=="" OR $_POST['Tabelle']=="" OR ($_POST['Gaestekartetyp']=="" AND $_POST['Altersklasse']=="")){
    12. echo 'Eingabe inkorrekt!</br><a href="staterstellen.php">zurück</a>';
    13. }else{
    14. $tabelle = $_POST['Tabelle'];
    15. Switch($tabelle){
    16. case 1:
    17. $tabellenname="tbl_ferienwohnung";
    18. $t_anzahl = "f_anzahl";
    19. break;
    20. case 2:
    21. $tabellenname="tbl_hotel";
    22. $t_anzahl = "h_anzahl";
    23. break;
    24. case 3:
    25. $tabellenname="tbl_camping";
    26. $t_anzahl = "c_anzahl";
    27. break;
    28. case 4:
    29. $tabellenname="tbl_lager";
    30. $t_anzahl = "l_anzahl";
    31. break;
    32. }
    33. $vjahr = $_POST['VJahr'.$i];
    34. $bjahr = $_POST['BJahr'.$i];
    35. $vmonat = $_POST['VMonat'.$i];
    36. $bmonat = $_POST['BMonat'.$i];
    37. for($tmonat=$vjahr.$vmonat; $tmonat<=$bjahr.$bmonat; $tmonat++){
    38. $tmonat = (int)$tmonat;
    39. $sstmonat = substr((string)$tmonat, -2);
    40. if($sstmonat=="13"){
    41. $tmonat+=88;
    42. $sstmonat = "01";
    43. }
    44. $sstmonat = (int)$sstmonat;
    45. If($tabelle==1 AND $_POST['Gaestekartetyp']!=""){
    46. $gaestekartetyp=$_POST['Gaestekartetyp'];
    47. $query = "Select f_anzahl as f_anzahl from ".$tabellenname." where CONCAT(fk_jahr, fk_monat) = '".$tmonat."' AND fk_gaestekarte='".$gaestekartetyp."'";
    48. $ergebnis = mysql_query($query);
    49. $row = mysql_fetch_object($ergebnis);
    50. @$anz = $row -> $t_anzahl;
    51. $anz = $anz+0;
    52. echo "Anzahl des Monat ".$tmonat." &nbsp".$i.": &nbsp".$anz."</br></br>";
    53. $arrayAnz[$i][$sstmonat] = $anz;
    54. echo $sstmonat."</br>";
    55. }
    56. elseif($_POST['Altersklasse']!="" AND ($tabelle==2 OR $tabelle==3 OR $tabelle==4)){
    57. $altersklasse=$_POST['Altersklasse'];
    58. $query = "Select ".$t_anzahl." as ".$t_anzahl." from ".$tabellenname." where CONCAT(fk_jahr, fk_monat) = '".$tmonat."' AND fk_altersklasse='".$altersklasse."'";
    59. $ergebnis = mysql_query($query);
    60. $row = mysql_fetch_object($ergebnis);
    61. @$anz = $row -> $t_anzahl;
    62. $anz = $anz+0;
    63. echo "Anzahl des Monat ".$tmonat." &nbsp".$i.": &nbsp".$anz."</br></br>";
    64. $arrayAnz[$i][$tmonat] = $anz;
    65. }else{
    66. echo 'Fehler aufgetreten: <a href="staterstellen.php">zurück</a>';
    67. }
    68. }
    69. }
    70. }
    71. else{
    72. echo 'Fehler aufgetreten: <a href="staterstellen.php">zurück</a>';
    73. }
    74. array_push($arrayvj, $vjahr.$vmonat);
    75. array_push($arraybj, $bjahr.$bmonat);
    76. }
    77. $vjm = $arrayvj[0];
    78. $bjm = $arraybj[0];
    79. $ssvjm = (int)substr((string)$vjm, -2);
    80. $ssbjm = (int)substr((string)$bjm, -2);
    81. $x=0;
    82. echo "</br></br></br>";
    83. echo "Von:".$vjm."&nbsp;Bis:".$bjm;
    84. echo "</br>Von:".$ssvjm."&nbsp;Bis:".$ssbjm."</br>";
    85. For($sstmonat=$ssvjm;$sstmonat<=$ssbjm;$sstmonat++){
    86. $sstmonat = (int)$sstmonat;
    87. if($sstmonat==13){
    88. $sstmonat = 01;
    89. }
    90. for($i=1;$i<=$anzahl;$i++){
    91. if(!isset($arrayAnz[$i][$sstmonat])){
    92. $arrayAnz[$i][$sstmonat]=0;
    93. }
    94. echo "</br>sstmonat:".gettype($sstmonat)."&nbsp;".$sstmonat;
    95. echo "</br>i:".gettype($i)."&nbsp;".$i;
    96. echo "</br>".$arrayAnz[$i][$sstmonat];
    97. }
    98. $x++;
    99. }
    100. echo "</br>".print_r($arrayAnz)."</br>";
    Alles anzeigen

    beim letzten echo erhalte ich nun nur werte für [2]
  • Hab jetzt mal eine vereinfachte version gebastelt, an der man das problem doch lösen können sollte.
    Hier der php code:

    Quellcode

    1. <?php
    2. $anzahl=2;
    3. $vjm=200004;
    4. $bjm=200007;
    5. $anz=1;
    6. For($i=1;$i<=$anzahl; $i++){
    7. $arrayAnz = array(); //array[Vergleich][Monat]=anzahl
    8. echo "</br>";
    9. for($tmonat=$vjm; $tmonat<=$bjm; $tmonat++){
    10. $sstmonat=substr($tmonat, -2);
    11. $arrayAnz[$i][$sstmonat] = $anz;
    12. echo "Anz:".$anz."&nbsp; i:".$i."&nbsp; sstmonat:".$sstmonat."</br>";
    13. $anz++;
    14. }
    15. }
    16. print_r($arrayAnz);
    17. ?>
    Alles anzeigen

    Ausgabe:
    Anz:1 i:1 sstmonat:04
    Anz:2 i:1 sstmonat:05
    Anz:3 i:1 sstmonat:06
    Anz:4 i:1 sstmonat:07

    Anz:5 i:2 sstmonat:04
    Anz:6 i:2 sstmonat:05
    Anz:7 i:2 sstmonat:06
    Anz:8 i:2 sstmonat:07
    Array ( [2] => Array ( [04] => 5 [05] => 6 [06] => 7 [07] => 8 ) )

    Ich hätte gerne diese Ausgabe:
    Anz:1 i:1 sstmonat:04
    Anz:2 i:1 sstmonat:05
    Anz:3 i:1 sstmonat:06
    Anz:4 i:1 sstmonat:07

    Anz:5 i:2 sstmonat:04
    Anz:6 i:2 sstmonat:05
    Anz:7 i:2 sstmonat:06
    Anz:8 i:2 sstmonat:07
    Array ([1] => Array ( [04] => 1 [05] => 2[06] => 3 [07] => 4 ) [2] => Array ( [04] => 5 [05] => 6 [06] => 7 [07] => 8 ) )
    oder so in der Art.
    Kann mir jemand sagen, warum nur die Werte für $i=2 eingetragen werden?

    Vielen Dank schonmal
  • Warum ist mir das nicht früher aufgefallen -.-

    Du initierst $arrayAnz erst in der ersten For-Schleife, dadurch überschreibst du natürlich jeweils die Schleife zuvor.

    Nicht:

    Quellcode

    1. For($i=1;$i<=$anzahl; $i++){ ...
    2. $arrayAnz = array(); //array[Vergleich][Monat]=anzahl
    3. }

    Sondern:

    Quellcode

    1. $arrayAnz = array(); //array[Vergleich][Monat]=anzahl
    2. For($i=1;$i<=$anzahl; $i++){ ... }