Funktion str_shuffle() - Zeichen eines strings nach Zufallsprinzip mischen

Die einzelnen Zeichen eines strings müssen manchmal nach dem Zufallsprinzip gemischt werden. Ein typisches Beispiel hierfür ist z.B. ein Buchstabenrätsel. Man könnte das Mischen aus einem vordefinierten Zeichenvorrat auch nutzen, um den Usern ein Passwortvorschlag zu unterbreiten oder um Captchas zu generieren. Für solche Vorgänge kann man in PHP die Funktion str_shuffle() verwenden. Dabei werden innerhalb der runden Klammern die folgenden Parameter angegeben.

  1. Die Zeichenkette, die gemischt werden soll (string).

Beim folgenden Beispiel wird die Zeichenkette ABCXYZ gemischt und ausgegeben.

<?php

$str = 'ABCXYZ';

// Beispiel Ausgabe CZXYBA
echo str_shuffle($str);

?>

Die Variable $str bleibt bei diesem Code wie es ist, da die Funktion str_shuffle() nicht direkt die Variable verändert. Falls man $str im weiteren Verlauf erneut verwendet, z.B. mit echo ausgibt, ist das Ergebnis ABCXYZ.

<?php

$str = 'ABCXYZ';

// Beispiel Ausgabe CZXYBA
echo str_shuffle($str);

// Ausgabe ABCXYZ
echo $str;

?>

Man kann str_shuffle() natürlich auch direkt auf die Variable $str anwenden. In dem Fall wird die Funktion bei jedem Aufruf der PHP-Seite auf die Variable angewendet und man erhält bei einer Ausgabe von $str eine gemischte Zeichenkette.

<?php

$str = 'ABCXYZ';
$str = str_shuffle($str);

// Beispiel Ausgabe BZCAXY
echo $str;

?>

Funktion str_shuffle() mit UTF-8 Zeichenkodierung

Aus technischer Sicht betrachtet, werden nicht die Zeichen gemischt, sondern die Bytes, die diese belegen. Dabei wird davon ausgegangen, dass 1 Zeichen 1 Byte belegt. Das Mischen funktioniert daher nur zufriedenstellend, wenn die Zeichen eines strings jeweils 1 Byte belegen. Das kann bei der Verwendung der Zeichenkodierung UTF-8 zu unerwünschten Effekten führen, da mit UTF-8 ein Zeichen auch mehr als 1 Byte belegen kann, z.B. Umlaute. Beim folgenden Beispiel erhält man eine Ausgabe mit den kryptischen Diamond-Zeichen, da jedes Byte gemischt wird und zusammengehörige Bytes getrennt werden.

<?php

$str = 'äöüßÄÖÜ';

// Beispiel Ausgabe �Ä�ö�Ü��ü�
echo str_shuffle($str);

?>

Eigene Multibyte-Funktion für UTF-8 schreiben

Gemäß dem Stand von 03/2016 gibt es keine interne Multibyte-Funktion für str_shuffle(), sodass man bei der Verwendung von UTF-8 bzw. von Zeichen, die mehr als 1 Byte belegen, eine eigene Multibyte-Funktion schreiben muss. Eine mögliche Lösung kann die Funktion mb_str_shuffle() im folgenden Code sein. Hierbei werden mehrere Funktionen verwendet, um denselben Effekt wie bei str_shuffle() zu erhalten, nur mit dem Unterschied, dass als Zeichenkodierung des strings Unicode herangezogen wird.

<?php

function mb_str_shuffle($str)
{
  $arr = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);
  shuffle($arr);
  return implode('', $arr);
}

$str = 'ÄÖÜßäöü';

// Beispiel Ausgabe öÄßäÖüÜ
echo mb_str_shuffle($str);

?>

Mit der Funktion preg_split() wird die Zeichenkette anhand eines regulären Ausdrucks zerlegt und im Array ($arr) gespeichert. Als regulärer Ausdruck wird // verwendet, womit die Zeichenzwischenräume gemeint sind. Damit die Zeichenkette als Unicode behandelt wird, verwendet man den Modifikator u. Als zweiten Parameter übergibt man den zu zerlegenden string. Die weiteren Parameter (-1, PREG_SPLIT_NO_EMPTY) spielen in diesem Beispiel keine Rolle. Mit -1 wird angegeben, dass die Anzahl der Teil-Strings unlimitiert sein soll. PREG_SPLIT_NO_EMPTY veranlasst, dass nur nicht leere Teil-Strings zurückgegeben werden.

Zum Mischen nach dem Zufallsprinzip wird die Array-Funktion shuffle() verwendet. Zum Schluss werden die einzelnen Zeichen mit implode() wieder zusammengesetzt und das Ergebnis ist der Rückgabewert der Funktion mb_str_shuffle().