Hallo,
Was ist mit "deep copy der Arrays" gemeint?
Naja, in C sind Array Pointer auf Speicherbloecke. Jetzt kann man den Array auf zwei Arten
kopieren: 'deep' und 'shallow'. 'Shallow' hiesse, man kopiert nur den Pointer auf den
Speicherbereich, man hat also zweimal denselben Speicherbereich und damit faktisch denselben
Array. 'Deep' hiesse, man dupliziert den Speicherbereich. Es koennte natuerlich sein, dass
die Array-Elemente wieder nur Pointer sind, bei einer deep copy muessten dann die
Datenstrukturen, auf die die Array-Elemente zeigen, auch verdoppelt werden.
Ich diskutierte kürzlich mit Michael darüber, wie PHP mit einem MySQL-Result umgeht und ob
die mysql_fetch_*-Funktionen die Daten womöglich im Speicher verdoppeln.
Natuerlich tun sie das ;)
Ein Lesen bzw. Umwandeln des Ergebnisses in einen PHP-Array Zeile für Zeile bzw. Datensatz
für Datensatz wäre sinnlos, wenn das Ergebnis schon vorher in einer Array-Speicherstruktur
vorhanden wäre,
Ist es aber nicht. Es ist nur in einem mysql_result vorhanden, als Referenz auf einen
Speicherbereich. In dem Speicherbereich stehen die unaufbereiteten, von MySQL serialisierten
Ergebnisse. Bei jedem mysql_fetch_irgendwas wird der Pointer in der mysql_result-Struktur um
einen Datensatz weiter nach vorn gesetzt.
ein $datensatz_array=mysql_fetch_*(...) wäre demnach ein Verdoppeln der Daten im Speicher,
was äußerst speicherintensiv wäre, wenn man Operationen mit allen Datensätzen des
Resultates vorhat (welche nicht von der Datenbank ausgeführt werden können).
Oh, es ist aber notwendig. Irgendwie muss man die Daten ja durch den Socket kriegen. Dazu
muessen die 'serialisiert', in Textform gebracht werden. Wie genau das Format aussieht,
ist sicher dokumentiert, bei Bedarf bei mysql.com nachlesen :) Und auf der Client-Seite wird
das ganze ueber die mysql_fetch_irgendwas-Funktionen wieder umgewandelt in eine andere Form,
in diesem Fall 'mysql_row's. Diese mysql_row wird wieder umgewandelt in einen PHP-Array,
damit die Daten auch in PHP erreichbar sind.
Gruesse,
CK