MH: Array mit in_array vergleichen

Heyho,

ist es irgendwie möglich, $daten['zeit'] mit in_array zu vergleichen? Ich muss halt aus dem Array $daten die Zeit mit einer bestimmten Uhrzeit vergleichen und dann die daten die dazu in $daten['person'] und in $daten['bereich'] stehen bekommen. Hatte mir das bislang wie folgt überlegt, bekommen dann aber immer eine Fehlermeldung

if(in_array($time, $daten['zeit'])){
	echo $daten['person'] . ' ' . $daten['bereich'];
}

Ich bekomme dann aber immer die Fehlermeldung, dass in_array 2 Parameter brauch und nur einer gegeben ist.

Ist das irgendwie möglich? gibt es sonst eine andere Möglichkeit das zu realisieren?

Gruß MH

  1. Tach!

    ist es irgendwie möglich, $daten['zeit'] mit in_array zu vergleichen?

    Nein.

    Ich muss halt aus dem Array $daten die Zeit mit einer bestimmten Uhrzeit vergleichen und dann die daten die dazu in $daten['person'] und in $daten['bereich'] stehen bekommen.

    Aber array_filter() mit selbst definiertem $callback kannst du verwenden.

    dedlfix.

    1. Moin,
      ich hab damit noch nie gearbeitet und auch keine Ahnung wie ich die $callback machen soll.
      Könntest du mir ein Beispiel geben? Das Array $daten sieht wie folgt aus:

      $daten = array(
                  'zeit' => $row1['Uhrzeit'],
                  'abteilung' => $row1['Abteilung'],
                  'person' => $person,
                  'bereich' => $bereich
                );
      

      Danke :)
      MH

      1. Tach!

        ich hab damit noch nie gearbeitet und auch keine Ahnung wie ich die $callback machen soll.
        Könntest du mir ein Beispiel geben?

        Ja, sind welche im PHP-Handbuch. Deine Callback-Funktion bekommt ein Element deines Arrays, also einen Datensatz in deinem Fall, und du sagt mit true/false, ob es ein passender ist. Somit bekommst du ein kleineres Array als Ergebnis von array_filter(), das du dann weiterverarbeiten kannst.

        dedlfix.

        1. Hey,
          ok, ich hab mir das jetzt durchgelesen und ein bisschen probiert, bekomme es aber nicht hin. wärst du so nett und würdest mir den Code "geben"?!
          Ich versteh einfach nicht, wie ich speziell meine Callback funktion schreiben muss :(

          Gruß
          MH

          1. Tach!

            ok, ich hab mir das jetzt durchgelesen und ein bisschen probiert, bekomme es aber nicht hin. wärst du so nett und würdest mir den Code "geben"?!
            Ich versteh einfach nicht, wie ich speziell meine Callback funktion schreiben muss :(

            Du gibst der array_filter() dein komplettes Array. Deine Callback-Funktion wird daraufhin mehrfach aufgerufen und bekommt bei jedem Aufruf einen Eintrag aus diesem Array als Funktionsparameter übergeben, also einen Datensatz in deinem Fall. Du kannst dann mit $variablenname['zeit'] auf das Zeitfeld zugreifen und womit auch immer vergleichen. Wenn es übereinstimmt, dann gib true zurück, sonst false.

            dedlfix.

            1. Hey,

              so, hab das jetzt mal so umgesetzt wie ich dich verstanden habe. Bekomme aber keine Ausgabe.
              Das ist meine Funktion:

              function inarray($var){
                        if($var['zeit'] == $time){
                          return(true);
                        } else{
                          return(false);
                        }
                      }
              

              Und das dann das Aufrufen mit array_filter:

              if(array_filter($daten, "inarray") == true){
                            $html .= '<tr>
                                        <td style="text-align: center;">' . $time . '</td>
                                        <td>' . $daten['person'] . '</td>
                                        <td>' . $daten['bereich'] . '</td>
                                      </tr>';
                         }
              

              Wo liegt der Fehler?
              Ich blick langsam nicht mehr durch…

              gruß
              MH

              1. Hallo,

                Wo liegt der Fehler?
                Ich blick langsam nicht mehr durch…

                Wieso prüfst du das gefilterte Array nochmal auf true?

                Gruß
                Kalk

                1. Hallo,
                  Gute Frage...😀
                  Funktioniert aber trotzdem nicht.

                  Gruß
                  MH

                  1. Tach!

                    Funktioniert aber trotzdem nicht.

                    Entschuldigung, alles verkehrt, was ich sagte, hab nicht genau hingeschaut. Siehe Antwort von Rolf b.

                    dedlfix.

              2. Tach!

                Das ist meine Funktion:

                function inarray($var){
                          if($var['zeit'] == $time){
                            return(true);
                          } else{
                            return(false);
                          }
                        }
                

                Die Variable $time existiert nicht im Scope deiner Funktion. Sollte einen Fehler geben, wenn man error_reporting auf E_ALL und display_errors auf on/1 hat.

                Und das dann das Aufrufen mit array_filter:

                if(array_filter($daten, "inarray") == true){
                

                array_filter() liefert ein Array zurück. Wenn du nur wissen willst, ob dein Eintrag enthalten ist, dann schau ob ds Array empty() ist oder nicht. Ansonsten bekommst du alle passenden Einträge aus deinem Array zum Drüberlaufen mit foreach. Oder wenn nur ein Ergebnis entstehen kann, dann findest du es im nullten Element.

                Ich blick langsam nicht mehr durch…

                Erstmal solltest du losgelöst von deinem eigentlichen Problem die Arbeitsweise verstehen. Dann kannst du das Wissen auf dein Problem anwenden. Und musst dazu mitunter (so auch hier) die Herangehensweise an die Lösung ändern.

                dedlfix.

  2. Hallo,

    Ich bekomme dann aber immer die Fehlermeldung, dass in_array 2 Parameter brauch und nur einer gegeben ist.

    Na, vorallem benötigt es ein Array, du hast stattdessen einen Wert aus einem Array übergeben.

    Gruß
    Kalk

  3. Hello,

    man kann Arrays auch anders herum aufbauen.

    vielleicht geht der Vergleich oder der Zugriff dann auch ohne Callback-Funktion?

    Liebe Grüße
    Tom S.

    --
    Es gibt nichts Gutes, außer man tut es
    Andersdenkende waren noch nie beliebt, aber meistens diejenigen, die die Freiheit vorangebracht haben.
  4. Hey Leute - ihr sitzt da einem Irrtum auf. $daten ist kein wirkliches Array, sondern ein als Array realisiertes Objekt. Deswegen sind Suchfunktionen wie in_array oder array_filter hier nicht richtig.

    Falls Du prüfen willst, ob $daten den Schlüssel 'zeit' überhaupt enthält, machst Du das mit array_key_exists('zeit', $daten). Wenn Du wissen willst, ob $daten['zeit'] einen bestimmten Wert enthält, dann vergleiche einfach. Wenn Du beides wissen willst, nagut, dann mach beides 😉

    Ob Du die Zeit mit == oder === vergleichst (Werte-Gleichheit oder Werte-Identität) hängt von deinen Daten ab. Wenn Du die internen Typangleichungen (siehe hier und hier) brauchst, die PHP bei == durchführt, dann nimm ==, sonst nimm ===.

    if ($daten['zeit'] == $time) {
       $html .= '<tr>
      <td style="text-align: center;">' . $time . '</td>
      <td>' . $daten['person'] . '</td>
      <td>' . $daten['bereich'] . '</td>
    </tr>';
    }
    

    Statt Stringverkettung kannst Du auch die HEREDOC Syntax verwenden, du musst nur die Array-Zugriffe als complex syntax (in geschweifte Klammern eingeschlossen) notieren. Vorteil von HereDoc: Du kannst Apostrophe und Anführungszeichen gleichermaßen verwenden, und du musst nicht aufpassen, dass Du alle Stringfragmente korrekt in ' oder " einschließt. Die Zeilenumbrüche hinter <<<XXX und vor XXX; werden nicht in den String übernommen.

    if ($daten['zeit'] == $time) {
       $html .= <<<XXX
    <tr>
      <td style="text-align: center;">$time</td>
      <td>{$daten['person']}</td>
      <td>{$daten['bereich']}</td>
    </tr>
    XXX;
    }
    

    Rolf

    1. Tach!

      Hey Leute - ihr sitzt da einem Irrtum auf. $daten ist kein wirkliches Array, sondern ein als Array realisiertes Objekt. Deswegen sind Suchfunktionen wie in_array oder array_filter hier nicht richtig.

      Du meinst, man muss da genauer hinschauen und nicht nur Annahmen treffen? Wie ungewöhnlich! 🤦

      Falls Du prüfen willst, ob $daten den Schlüssel 'zeit' überhaupt enthält, machst Du das mit array_key_exists('zeit', $daten). Wenn Du wissen willst, ob $daten['zeit'] einen bestimmten Wert enthält, dann vergleiche einfach. Wenn Du beides wissen willst, nagut, dann mach beides 😉

      isset() wird statt array_key_exists() empfohlen, wenn man den Schlüssel (hier 'daten') bereits als Literal vorliegen hat und nicht beispielsweise in einer Variable. Also: isset($daten['zeit'])

      dedlfix.

      1. Genauer hinschauen? Ach was, ein Wort pro Zeile lesen reicht meistens aus. Wenn der Rest wichtig war, kommt das beim anschließenden Flamewar schon heraus.

        Es ist aber nicht so, als ob ich darüber nicht nachgedacht hätte. Ich bin nur zum falschen Ergebnis gekommen.

        $a = ["zeit" => null];
        echo (isset($a['zeit']) ? "Zeit ist da" : "Keine Zeit")."\n";
        echo array_key_exists('zeit', $a) ? "Zeit gefunden" : "Zeit verloren";
        

        isset sagt „Keine Zeit“ und array_key_exists sagt „Zeit gefunden“. Allerdings wäre das Ergebnis von isset wohl besser verwendbar. Und schneller ist es auch.

        Rolf