Raketenwilli: PHP trim() , Lösung für UTF-8 : Versuch mit Array, Wettbewerb?

Beitrag lesen

Nö. lscpu behauptet:

AMD Ryzen 7 2700 Eight-Core Processor

Das System ist aber so konfiguriert, dass der wegen der kurzen Belastung nicht erst aus dem Stromsparmodus geht.

CPU MHz:                         1550.000

Stepping:                        2
Frequenzanhebung:                aktiviert
CPU MHz:                         1550.000

und ich hatte php-xdebug an Start. Das ha ich jetzt mal abgeschaltet:

Verbesserungen: (immer noch nicht genug getestet!)

<?php
### file: mb_trim.php

if ( ! function_exists ( 'mb_trim' ) ) {
	function mb_trim( $string, $toTrim ) {

		if ( '' == $string ) return '';
		if ( ! is_array( $toTrim ) ) {
			$arToTrim = mb_str_split( $toTrim );
		}
		if ( ! count( $arToTrim ) ) return $string;

		$arString = mb_str_split( $string );

		$changed = true;
		while ( $changed ) {
			$changed = false;
			if ( in_array( $arString[ 0 ], $arToTrim ) ) {
				array_shift( $arString );
				if (0 == count( $arString ) ) return '';
				$changed = true;
				
			}
			if ( in_array( $arString[ count( $arString ) -1 ], $arToTrim ) ) {
				array_pop( $arString );
				if (0 == count( $arString ) ) return '';
				$changed = true;			
			}
		}
		return implode( '', $arString );
	}
} else {
	trigger_error( 'The function "mb_trim" exists! Pleace check your script(s)!', E_USER_ERROR );
}

if ( ! function_exists ( 'mb_rtrim' ) ) {
	function mb_rtrim( $string, $toTrim ) {

		if ( '' == $string ) return '';
		if ( ! is_array( $toTrim ) ) {
			$arToTrim = mb_str_split( $toTrim );
		}
		if ( ! count( $arToTrim ) ) return $string;

		$arString = mb_str_split( $string );

		$changed = true;
		while ( $changed ) {
			$changed = false;
			if ( in_array( $arString[ count( $arString ) -1 ], $arToTrim ) ) {
				array_pop( $arString );
				if (0 == count( $arString ) ) return '';
				$changed = true;			
			}
		}
		return implode( '', $arString );
	}
} else {
	trigger_error( 'The function "mb_rtrim" exists! Pleace check your script(s)!', E_USER_ERROR );
}

if ( ! function_exists ( 'mb_ltrim' ) ) {
	function mb_ltrim( $string, $toTrim ) {

		if ( '' == $string ) return '';
		if ( ! is_array( $toTrim ) ) {
			$arToTrim = mb_str_split( $toTrim );
		}
		if ( ! count( $arToTrim ) ) return $string;

		$arString = mb_str_split( $string );

		$changed = true;
		while ( $changed ) {
			$changed = false;
			if ( in_array( $arString[ 0 ], $arToTrim ) ) {
				array_shift( $arString );
				if (0 == count( $arString ) ) return '';
				$changed = true;
				
			}
		}
		return implode( '', $arString );
	}
} else {
	trigger_error( 'The function "mb_ltrim" exists! Pleace check your script(s)!', E_USER_ERROR );
}

Tests:

<?php
require_once ('mb_trim.php');

$rounds = 100000;
$nbsp = chr(0xC2).chr(0xA0);
$string = '🛠' . $nbsp . 'äüöödäipusö🛠' . $nbsp . 'öäü';
$toTrim = '🛠öä' . $nbsp . 'ü';

echo 'Zu durchsuchender String (HTML-kodiert:)'. PHP_EOL;
echo "\t". '"' . htmlentities( $string, ENT_HTML5 ) .'"' . PHP_EOL . PHP_EOL;

echo' Zu entfernende Zeichen: (HTML-kodiert:)' . PHP_EOL;
echo "\t". '"' . htmlentities( $toTrim, ENT_HTML5 ) .'"' . PHP_EOL . PHP_EOL;

echo 'Ergebnis für mb_trim(): "'  .  mb_trim( $string, $toTrim ) . '"' . PHP_EOL;
echo 'Ergebnis für mb_rtrim(): "' .  mb_rtrim( $string, $toTrim ) . '"' . PHP_EOL;
echo 'Ergebnis für mb_ltrim(): "' .  mb_ltrim( $string, $toTrim ) . '"' . PHP_EOL;


echo PHP_EOL . 'Zeitmessung:'. PHP_EOL;

####################################################
echo PHP_EOL . 'mb_trim:'  .PHP_EOL;

$start = microtime(true);
for ($i=0; $i<$rounds; $i++) {
	mb_trim( $string, $toTrim ) . PHP_EOL;
}

$time = ( microtime(true) - $start )  ;
echo $time .  PHP_EOL;
echo  round( $time * 1000)  . ' Millisekunden für ' . $rounds . ' Runden. (' . round($time/$rounds * 1000000) . ' Mikrosekunden pro Aufruf).' .  PHP_EOL;

####################################################
echo PHP_EOL . 'mb_rtrim:'  . PHP_EOL;

$start = microtime(true);
for ($i=0; $i<$rounds; $i++) {
	mb_rtrim( $string, $toTrim ) . PHP_EOL;
}

$time = ( microtime(true) - $start )  ;
echo $time .  PHP_EOL;
echo  round( $time * 1000)  . ' Millisekunden für ' . $rounds . ' Runden. (' . round($time/$rounds * 1000000) . ' Mikrosekunden pro Aufruf).' .  PHP_EOL;

####################################################
echo PHP_EOL . 'mb_ltrim:'  . PHP_EOL;
$start = microtime(true);
for ($i=0; $i<$rounds; $i++) {
	mb_ltrim( $string, $toTrim ) . PHP_EOL;
}

$time = ( microtime(true) - $start )  ;
echo $time .  PHP_EOL;
echo  round( $time * 1000)  . ' Millisekunden für ' . $rounds . ' Runden. (' . round($time/$rounds * 1000000) . ' Mikrosekunden pro Aufruf).' .  PHP_EOL;

Ausgaben von php -dxdebug.mode=off test_mb_trim.php

Zu durchsuchender String (HTML-kodiert:)
	"🛠&nbsp;&auml;&uuml;&ouml;&ouml;d&auml;ipus&ouml;🛠&nbsp;&ouml;&auml;&uuml;"

 Zu entfernende Zeichen: (HTML-kodiert:)
	"🛠&ouml;&auml;&nbsp;&uuml;"

Ergebnis für mb_trim(): "däipus"
Ergebnis für mb_rtrim(): "🛠 äüöödäipus"
Ergebnis für mb_ltrim(): "däipusö🛠 öäü"

Zeitmessung:

mb_trim:
0.26273894309998
263 Millisekunden für 100000 Runden. (3 Mikrosekunden pro Aufruf).

mb_rtrim:
0.15137410163879
151 Millisekunden für 100000 Runden. (2 Mikrosekunden pro Aufruf).

mb_ltrim:
0.16421294212341
164 Millisekunden für 100000 Runden. (2 Mikrosekunden pro Aufruf).

Jetzt lachst Du nicht mehr :-)