PHP trim() , Lösung für UTF-8 : Versuch mit Array, Wettbewerb?
bearbeitet von RaketenwilliIch habe „ideenhalber“ mal versucht, eine auf Arrays basierende Funktion zu schreiben, die mit UTF-Symbolen kann. Diese **scheint** zu funktionieren, mir auch ausreichend schnell zu sein - ist aber noch nicht genügend getestet. 
Weshalb ich das Zeug ausdrücklich als „bad“ („schlecht“, „nicht verwenden”) markiere:
~~~PHP,bad
<?php
$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: "' .  raketen_trim( $string, $toTrim ) . '"' . PHP_EOL;
$rounds = 1000000;
$start = microtime(true);
for ($i=0; $i<$rounds; $i++) {
	raketen_trim( $string, $toTrim ) . PHP_EOL;
}
echo  round( ( microtime(true) - $start) * 1000)  . ' Millisekunden für ' . $rounds . ' Runden.'  .  PHP_EOL;
function raketen_trim( $string, $toTrim ) {
	if ( '' == $string ) return '';
	if ( '' == $toTrim ) return $string;
	$arString = mb_str_split( $string );
	if ( ! is_array( $toTrim ) ) {
		$arToTrim = mb_str_split( $toTrim );
	}
	$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[ sizeof($arString) -1 ], $arToTrim ) ) {
			array_pop( $arString );
			if (0 == count( $arString ) ) return '';
			$changed = true;			
		}
	}
	return implode( '', $arString );
}
~~~
Ausgaben: (Die Leerzeichen sind "geschützte Leerzeichen"):
~~~
Zu durchsuchender String (HTML-kodiert:)
	"🛠 äüöödäipusö🛠 öäü"
 Zu entfernende Zeichen: (HTML-kodiert:)
	"🛠öä ü"
Ergebnis: "däipus"
10226 Millisekunden für 1000000 Runden.
~~~
Wettbewerb(e):
1. Fehler finden
2. eine schnellere (und funktionierende) Funktion schreiben
PHP trim() , Lösung für UTF-8 : Versuch mit Array, Wettbewerb?
bearbeitet von RaketenwilliIch habe „ideenhalber“ mal versucht, eine auf Arrays basierende Funktion zu schreiben, die mit UTF-Symbolen kann. Diese scheint zu funktionieren, mir auch ausreichend schnell zu sein) - ist aber noch nicht genügend getestet. 
Weshalb ich das Zeug ausdrücklich als „bad“ („schlecht“, „nicht verwenden”) markiere:
~~~PHP,bad
<?php
$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: "' .  raketen_trim( $string, $toTrim ) . '"' . PHP_EOL;
$rounds = 1000000;
$start = microtime(true);
for ($i=0; $i<$rounds; $i++) {
	raketen_trim( $string, $toTrim ) . PHP_EOL;
}
echo  round( ( microtime(true) - $start) * 1000)  . ' Millisekunden für ' . $rounds . ' Runden.'  .  PHP_EOL;
function raketen_trim( $string, $toTrim ) {
	if ( '' == $string ) return '';
	if ( '' == $toTrim ) return $string;
	$arString = mb_str_split( $string );
	if ( ! is_array( $toTrim ) ) {
		$arToTrim = mb_str_split( $toTrim );
	}
	$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[ sizeof($arString) -1 ], $arToTrim ) ) {
			array_pop( $arString );
			if (0 == count( $arString ) ) return '';
			$changed = true;			
		}
	}
	return implode( '', $arString );
}
~~~
Ausgaben: (Die Leerzeichen sind "geschützte Leerzeichen"):
~~~
Zu durchsuchender String (HTML-kodiert:)
	"🛠 äüöödäipusö🛠 öäü"
 Zu entfernende Zeichen: (HTML-kodiert:)
	"🛠öä ü"
Ergebnis: "däipus"
10226 Millisekunden für 1000000 Runden.
~~~
Wettbewerb(e):
1. Fehler finden
2. eine schnellere (und funktionierende) Funktion schreiben
Trimmen, UTF-8 : Versuch mit Array, Wettbewerb?
bearbeitet von RaketenwilliIch habe „ideenhalber“ mal versucht, eine auf Arrays basierende Funktion zu schreiben, die mit UTF-Symbolen kann. Diese scheint zu funktionieren, mir auch ausreichend schnell zu sein) - ist aber noch nicht genügend getestet. 
Weshalb ich das Zeug ausdrücklich als „bad“ („schlecht“, „nicht verwenden”) markiere:
~~~PHP,bad
<?php
$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: "' .  raketen_trim( $string, $toTrim ) . '"' . PHP_EOL;
$rounds = 1000000;
$start = microtime(true);
for ($i=0; $i<$rounds; $i++) {
	raketen_trim( $string, $toTrim ) . PHP_EOL;
}
echo  round( ( microtime(true) - $start) * 1000)  . ' Millisekunden für ' . $rounds . ' Runden.'  .  PHP_EOL;
function raketen_trim( $string, $toTrim ) {
	if ( '' == $string ) return '';
	if ( '' == $toTrim ) return $string;
	$arString = mb_str_split( $string );
	if ( ! is_array( $toTrim ) ) {
		$arToTrim = mb_str_split( $toTrim );
	}
	$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[ sizeof($arString) -1 ], $arToTrim ) ) {
			array_pop( $arString );
			if (0 == count( $arString ) ) return '';
			$changed = true;			
		}
	}
	return implode( '', $arString );
}
~~~
Ausgaben: (Die Leerzeichen sind "geschützte Leerzeichen"):
~~~
Zu durchsuchender String (HTML-kodiert:)
	"🛠 äüöödäipusö🛠 öäü"
 Zu entfernende Zeichen: (HTML-kodiert:)
	"🛠öä ü"
Ergebnis: "däipus"
10226 Millisekunden für 1000000 Runden.
~~~
Wettbewerb(e):
1. Fehler finden
2. eine schnellere (und funktionierende) Funktion schreiben
 nicht angemeldet
 nicht angemeldet