Hallo,
ich habe um den Typ einer CSV-Spalte festzustellen folgende Typ-Flags:
Sortiert nach ihrer "Grobheit".
Gehen wir der Einfachheit halber von aus, dass der erste Flag bei 2^0 = 1 beginnt.
Ich durchlaufe nun einige hoffentlich repräsentative Zeilen eines CSV und ordne einem Array-Element (Index = Spaltennummer) nun per Bitverknüpfung | (bzw. +) den treffenden Typen zu. Wenn in einer Spalte (natürlich in verschiedenen Zeilen) ein Unix-Timestamp und ein Text mit maximaler Länge von 255 gefunden wird, bekommt dieses Element also den Wert $current = self::TYPE_UNIX_TIMESTAMP | self::TYPE_VARCHAR; /* 64 + 256 = 320 */
Nun möchte ich am Ende dieses Analyse zusammenfassen, das heißt, der gröbste Typ bekommt den Zuschlag (befinden sich in ein und der selben Spalte also TYPE_UNIX_TIMESTAMP und TYPE_VARCHAR bekommt TYPE_VARCHAR natürlich den Zuschlag).
Wie wäre der cleverste Algorithmus, das nun dynamisch zu machen?
Eine for-Schleife, deren Initiierungswert 512 wäre und dessen Wert sich dann jedesmal halbiert?
Im Moment habe ich folgenden Code:
Wobei ich nichtmal weiß, ob dieses Konstrukt überhaupt ohne Klammerung funktioniert.
Sprich, wenn ich in $current = 1023 (was die Zuordnung aller TYPEs wäre, da 1023 = (2 * 512) - 1), soll in meiner Variable 512 stehen, da es der größte gefundene TYPE ist.
Reicht es zur nächstgrößten 2er-Potenz zu laufen und diese zu halbieren?
Habt ihr mich überhaupt verstanden? =)
ich habe um den Typ einer CSV-Spalte festzustellen folgende Typ-Flags:
Code:
const TYPE_FLAG = 4; const TYPE_INTEGER = 8; const TYPE_DATE = 16; const TYPE_DATETIME = 32; const TYPE_UNIX_TIMESTAMP = 64; const TYPE_DOUBLE = 128; const TYPE_VARCHAR = 256; const TYPE_TEXT = 512;
Gehen wir der Einfachheit halber von aus, dass der erste Flag bei 2^0 = 1 beginnt.
Ich durchlaufe nun einige hoffentlich repräsentative Zeilen eines CSV und ordne einem Array-Element (Index = Spaltennummer) nun per Bitverknüpfung | (bzw. +) den treffenden Typen zu. Wenn in einer Spalte (natürlich in verschiedenen Zeilen) ein Unix-Timestamp und ein Text mit maximaler Länge von 255 gefunden wird, bekommt dieses Element also den Wert $current = self::TYPE_UNIX_TIMESTAMP | self::TYPE_VARCHAR; /* 64 + 256 = 320 */
Nun möchte ich am Ende dieses Analyse zusammenfassen, das heißt, der gröbste Typ bekommt den Zuschlag (befinden sich in ein und der selben Spalte also TYPE_UNIX_TIMESTAMP und TYPE_VARCHAR bekommt TYPE_VARCHAR natürlich den Zuschlag).
Wie wäre der cleverste Algorithmus, das nun dynamisch zu machen?
Eine for-Schleife, deren Initiierungswert 512 wäre und dessen Wert sich dann jedesmal halbiert?
Im Moment habe ich folgenden Code:
PHP-Code:
<?php
$type = $current & self::TYPE_TEXT
? self::TYPE_TEXT
: $current & self::TYPE_VARCHAR
? self::TYPE_VARCHAR
: $current & self::TYPE_DOUBLE
? self::TYPE_DOUBLE
: $current & self::TYPE_UNIX_TIMESTAMP
? self::TYPE_UNIX_TIMESTAMP
: $current & self::TYPE_DATETIME
? self::TYPE_DATETIME
: $current & self::TYPE_DATE
? self::TYPE_DATE
: $current & self
/* usw. */
?>
Sprich, wenn ich in $current = 1023 (was die Zuordnung aller TYPEs wäre, da 1023 = (2 * 512) - 1), soll in meiner Variable 512 stehen, da es der größte gefundene TYPE ist.
Reicht es zur nächstgrößten 2er-Potenz zu laufen und diese zu halbieren?
Habt ihr mich überhaupt verstanden? =)

Kommentar