/** * Prüfen ob alle leeren Elemente außer dem array gelöscht werden * und keys unberührt bleiben */ public function testRemoveEmptyValues() { $aArray = array('ich', 'bin', 1, '', 0, null, 'Array' => array(), 'Test', true, false); $aNoEmptyValues = tx_mklib_util_Array::removeEmptyValues($aArray); $this->assertTrue(is_array($aNoEmptyValues), 'No array given.'); $this->assertEquals(count($aNoEmptyValues), 6, 'Wrong count of entries.'); //auf die keys im zurück gegebenen und initialen array achten!!! $this->assertEquals('ich', $aNoEmptyValues[0], '1. wert falsch'); $this->assertEquals('bin', $aNoEmptyValues[1], '2. wert falsch'); $this->assertEquals(1, $aNoEmptyValues[2], '3. wert falsch'); $this->assertEquals(array(), $aNoEmptyValues['Array'], '4. wert falsch'); $this->assertEquals('Test', $aNoEmptyValues[6], '5. wert falsch'); $this->assertEquals(true, $aNoEmptyValues[7], '6. wert falsch'); }
/** * Erzeugt einen technisch richtigen Float-Wert. * Bei floatval() werden die Eistellungen über setlocal beachtet. * Wurde das beispielsweise auf Deutsch gesetzt, wird aus 5.45 > 5,45. * Das Komma macht dann Beispielsweise DB-Abfragen kaputt/fehlerhaft. * * @author Michael Wagner <*****@*****.**> * * @param string $number * @param array $config * @return string der float wert als String. */ public static function floatVal($number, array $config = array()) { $float = self::parseFloat($number); $string = (string) $float; // Hier ist die aktuelle Definition für die Umwandlung von Floats enthalten $local = localeconv(); // Das sind die Zeichen, mit denen wir die aus der localeconv ersetzen. $config = array_merge(array('decimal_point' => '.', 'mon_decimal_point' => '.', 'thousands_sep' => '', 'mon_thousands_sep' => '', 'int_curr_symbol' => '', 'currency_symbol' => '', 'positive_sign' => '', 'negative_sign' => '-'), $config); // Erstmal ersetzen wir die Leerzeichen! $string = preg_replace('/\\s/', '', $string); // Jetzt ersetzen wir Currencies und Signs! (EUR $ + -) $string = str_replace(array($local['int_curr_symbol'], $local['currency_symbol'], $local['positive_sign'], $local['negative_sign']), array($config['int_curr_symbol'], $config['currency_symbol'], $config['positive_sign'], $config['negative_sign']), $string); // Jetzt wird es komplizierter: // Wir müssen anhand eines pregreplace, die Werte teilen. // Das machen wir, da wir mit string replace aus 4.999,95 // immer 4.999.95 oder 4,999,95 machen würden. $mapping = array($local['mon_decimal_point'] => $config['mon_decimal_point'], $local['mon_thousands_sep'] => $config['mon_thousands_sep'], $local['decimal_point'] => $config['decimal_point'], $local['thousands_sep'] => $config['thousands_sep']); // Wir entfernen leere Einträge. // Die können nicht ersetzt werden und verursachen Fehler tx_rnbase::load('tx_mklib_util_Array'); $preg = tx_mklib_util_Array::removeEmptyValues(array_keys($mapping)); $preg = '/(' . implode('|\\', $preg) . ')/'; // Wir splitten nun die Werte auf. // Dabei werden alle Trennzeichen mitgegeben und leere Werte entfernt! $matches = preg_split($preg, $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); // Wir ersetzen nun die entsprechenden Zeichen. foreach ($matches as &$part) { foreach ($mapping as $from => $to) { if ($part == $from) { $part = $to; break; } } } // Jetzt nur noch zusammenführen und Fertig! return implode('', $matches); }