PHP Prüfen eines Zahlenwertes in einer foreach-Schleife

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

ich habe eine foreach-Schleife, die Werte einer Datenbank in einer Liste wiedergibt.
U.a. gibt es in dieser Liste einen entsprechenden Zahlenwert.

Jetzt möchte ich gerne prüfen, ob alle Datensätze in dieser foreach-Schleife in dieser
entsprechenden Spalte jeweils den gleichen Wert haben und im Falle dessen true
zurückgeben - sonst false.

Beispiel für true:
Zeile 1: Wert 223
Zeile 2: Wert 223
Zeile 3: Wert 223
Zeile 4: Wert 223
Zeile 5: Wert 223

Beispiel für false:
Zeile 1: Wert 223
Zeile 2: Wert 0
Zeile 3: Wert 443
Zeile 4: Wert 223
Zeile 5: Wert 223

Wie kann ich dies am besten realisieren? Habt ihr einen Tipp für mich?

VG, David
 
Was hast du denn bisher probiert bzw. welche Ansätze hast du verfolgt?
Versteh mich nicht falsch, mögliche Lösungen sind denkbar einfach, allerdings lernt man diesen Kram am besten, wenn man sich selber nen Kopf macht und ausprobiert. Immer nur fertige Lösungen an den Kopf geworfen zu bekommen, hilft nicht!
 
  • Gefällt mir
Reaktionen: abcddcba
Ja, im Grunde musst du pro Iteration deiner foreach-Schleife nur den aktuellen Wert mit dem vorherigen Wert vergleichen.
 
Zuletzt bearbeitet:
Du musst ja immer nur den Wert aus dem aktuellen Durchlauf mit dem des letzten Durchlaufs vergleichen. Sobald da mal was nicht gleich ist, returnst du false. Ansonsten nach dem letzten Durchlauf eben true.
 
Wie wäre Folgendes:
array_sum auf das Array anwenden, diese Summe durch die Anzahl der Spalten teilen und mit dem Wert der ersten Zeile vergleichen.

Also das:
PHP:
$row = [223, 223, 223, 223, 223];

$allValuesAreEqual = (array_sum($row) / count ($row)) == $row[0];
 
@nyromant:
Code:
$row = [10, -10, 30, 10, 10];
wäre dann aber auch "alles gleich" bei deiner Rechnung ;)
 
  • Gefällt mir
Reaktionen: nyromant
Und ist gleichzeitig auch noch anfällig für Rundungsfehler. PHP bietet sehr viele Funktionen für Arraymanipulation, ein möglicher Ansatz wäre z.B.

Code:
return (count(array_flip($row)) == 1);
 
  • Gefällt mir
Reaktionen: nyromant und Nase
Ist doch im Grunde sehr einfach:

Du holst dir den ersten Wert in der Liste, speicherst ihn in einer Variablen und vergleichst die Variable mit allen anderen Werten in der Liste. Und steigst dann aus der Schleife aus mit einem false, sollten die Werte nicht übereinstimmen.
 
  • Gefällt mir
Reaktionen: BeBur
Ich kann mir irgendwie nicht vorstellen, dass man nicht von alleine auf die hier vorgeschlagene triviale Lösung mit dem "merke ersten Wert, vergleiche mit folgenden, Abbruch wenn nicht gleich" kommt. Das ist doch offensichtlich auch das gleiche was man macht, wenn man auf die Liste guckt.
 
  • Gefällt mir
Reaktionen: Ebrithil und casual_gamer
abcddcba schrieb:
Ich kann mir irgendwie nicht vorstellen, dass man nicht von alleine auf die hier vorgeschlagene triviale Lösung mit dem "merke ersten Wert, vergleiche mit folgenden, Abbruch wenn nicht gleich" kommt. Das ist doch offensichtlich auch das gleiche was man macht, wenn man auf die Liste guckt
Aber wie kann das Gehirn tatsächlich zwei Signale, gleich welcher Charakteristik, "vergleichen"? Vielleicht geht das so: zwei gleiche Werte werden auf einer (Dirac-)Delta-Funktion repräsentiert und über Wellenphänomene in der Signalverarbeitung im Gehirn wird sowas wie eine Fouriertransformation gemacht, welche bei gleichen Werten (einzelner Peak bzw. zweimal identischer Peak) den resultierenden Signalwert 0 liefert. Das Gehirn hat gelernt, diese 0 als "gleich" zu interpretieren? Bei Zahlen ist das interessant, da erst eine solche Repräsentation aus der symbolischen Form und ihrer Bedeutung (Zahlenwert) temporär erzeugt werden muß.
 
  • Gefällt mir
Reaktionen: abcddcba
Klar ist die simple foreach Schleife samt Vergleich zum Vorwert der offensichtliche Ansatz aber eben unter Umständen (im Erfolgsfall - alle Werte gleich) auch der mit Abstand teuerste. Kommt eben auf die Anzahl der Zeilen an, die typischerweise zurück kommen.
Wenn es eine Datenbankabfrage ist, lohnt es sich meistens eben diese die Prüfung machen zu lassen, da sie für solche Aggregationen entworfen wurde.
Muss es unbedingt im PHP Code sein, dann würde ich folgenden Ansatz wählen.
PHP:
return 1 === count(array_unique(array_column($resultSet, $columnIdentifier)));
Alles drei sind native PHP Funktionen und somit deutlich schneller als jede Schleife.
Die SQL Lösung ist aber in den meisten Fällen deutlich schneller.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: casual_gamer
Zurück
Oben