Ich habe einen Datensatz von MySQL erhalten, das so geht:Ignoranz ODER Fehler in PHPs "foreach" -Konstrukt?
Array ( [0] => Array ( [views] => 14 [timestamp] => 06/04 [views_scaled] => 4.9295774647887 [unix_time] => 1239022177 ) [1] => Array ( [views] => 1 [timestamp] => 19/04 [views_scaled] => 0.35211267605634 [unix_time] => 1240194544 ) ... ... ... ) 1
(es ist nachbearbeitet, ‚Zeitstempel‘ war wirklich ein Zeitstempel vor, aber das spielt keine Rolle, sowieso)
Das Array auf $results
gespeichert sind, und in der Mitte meines Code ich mache das so etwas wie:
$results = array_merge($results, $new_days); $a = $results; foreach ($results as $row) { $unix_time[] = $row['unix_time']; } $b = $results;
Das Problem:$a
und $b
ar Beide sind verschieden. Der erste zeigt das Array, wie es soll, und der zweite hat das gleiche count()
, aber das vierte Element ist ein Duplikat vom letzten. Soweit ich weiß, übergebe ich nichts als Referenz, also $results
soll nicht ändern (vielleicht der Zeiger, aber nicht der Inhalt). Ich verwende PHP 5.2.4 unter Mac OS X 10.5.2.
Die offensichtliche Frage: Ist das irgendwie das beabsichtigte Verhalten, ein Bug oder mache ich hier etwas falsch? (keine boolesche Antwort bitte;)
EDIT: Vielen Dank für das Interesse, ich weiß nicht genau, wie viel zusätzlichen Code ich posten sollte, mache ich nicht viel vorher außer dem Abrufen der Daten von der DB und eine
foreach
, um den Zeitstempel zu analysieren und ein neues Array (
$new_days
) für die fehlenden Tage zu erstellen. Das funktioniert alles gut.
Dieser Code geht nach der, die ich früh gebucht haben:
array_multisort($unix_time, SORT_ASC, $results); $days = implode('|', array_pluck('timestamp', $results)); $views = implode('|', array_pluck('views', $results)); $views_scaled = implode(',', array_pluck('views_scaled', $results));
(array_pluck()
ist eine benutzerdefinierte Funktion ein Array aus einer Spalte in einem typischen DB-dumped-Datensatz zu erzeugen)
EDIT 2 : Nochmals vielen Dank, hier ist the full snippet und die Ausgabe von
$results
Array
$a
und
$b
(auch in den Kommentaren des Codes verwiesen).
Das ist definitiv nicht das beabsichtigte Verhalten des Codes, den Sie enthalten haben. Und es ist auch kein Fehler in foreach. Sie sollten den _exact_ Code verwenden, den Sie verwenden, zwischen $ a = $ results; und wenn du endlich $ a und $ b druckst. – Calvin
Dass mein Freund, so komisch das klingen mag, ist der genaue Code. Ich habe exit (print_r()) für jeden Punkt verwendet, den ich mit einer Variablen in diesem Code ($ a und $ b) dargestellt habe. – lima
Was ist der Inhalt von $ new_days, welche Funktion verwenden Sie, um den Zeitstempel zu analysieren? Können wir den Code sehen, der für die Zeitstempel verwendet wird? Was passiert mit dem, was Sie mit dem Array tun, bevor Sie seine Ausgabe sehen? Können Sie Abzüge der Arrays direkt nach diesem Abschnitt, den Sie uns bisher gezeigt haben, ablegen? – Louis