Funktion str_split() - String trennen und in ein Array konvertieren

Zeichenketten liegen häufig nicht in der gewünschten Form vor und müssen bearbeitet werden. Eine mögliche Aufgabe dabei ist, einen String in ein Array zu konvertieren. Das kann z.B. notwendig sein, wenn in einem String eine Produktnummer enthalten ist, gewisse Bestandteile der Produktnummer eine bestimmte Bedeutung haben und man diese deshalb in einzelne Bestandteile trennen und in einem Array speichern möchte. Für solche Aufgaben kann man die Funktion str_split() verwenden. Die Parameter gibt man dabei wie folgt an.

  1. Die Zeichenkette, die in ein Array konvertiert werden soll (string).
  2. Maximale Anzahl der Zeichen eines Teilstücks (split_length, optional)

Wird der zweite Parameter nicht angegeben, erfolgt die Trennung nach jedem Zeichen. Beim folgenden Beispiel wird die Zeichenkette a, b und c getrennt und im Array gespeichert, der danach mit der foreach-Schleife ausgegeben wird.

<?php

$str = 'abc';

$arr = str_split($str);

// Ausgabe untereinander a b c
foreach ($arr as $wert)
{
  echo $wert . '<br>';
}

?>

Mit dem zweiten Parameter wird die maximale Anzahl der Zeichen eines Teilstücks festgelegt. Beim folgenden Beispiel wird die Nummer 111222333 in Teilstücke mit maximal 3 Zeichen zerlegt, sodass man 111, 222 und 333 erhält.

<?php

$str = '111222333';

$arr = str_split($str, 3);

// Ausgabe untereinander 111 222 333
foreach ($arr as $wert)
{
  echo $wert . '<br>';
}

?>

Falls der zweite Parameter kleiner als 1 ist, wird FALSE zurückgegeben und im Array wird nichts gespeichert.

<?php

$str = '111222333';

$arr = str_split($str, 0);

// Ausgabe
foreach ($arr as $wert)
{
  echo $wert . '<br>';
}

?>

Falls der zweite Parameter größer als die Länge der Zeichenkette ist, wird der String in einem Array-Element gespeichert.

<?php

$str = '111222333';

$arr = str_split($str, 10);

// Ausgabe 111222333
foreach ($arr as $wert)
{
  echo $wert . '<br>';
}

?>

Trennung bei Multibyte-Zeichen in UTF-8

Die Trennung erfolgt bei str_split() anhand der Bytes. Dabei wird davon ausgegangen, dass ein Zeichen 1 Byte belegt. Das ist jedoch nicht immer der Fall und die Belegung der Bytes hängt von der Zeichenkodierung ab. Beispielsweise belegen die Umlaute in UTF-8 nicht 1 Byte sondern 2. Falls man die Funktion str_split() mit der Zeichenkodierung UTF-8 anwendet, kann es passieren, dass zwei zusammengehörige Bytes eines Zeichens getrennt werden. Das Ergebnis sind unvollständige Bytes, die im Array gespeichert werden und bei einer Ausgabe erhält man sogenannte Diamond-Zeichen.

<?php

$str = 'äöüß';

$arr = str_split($str);

// Ausgabe untereinander � � � � � � � �
foreach ($arr as $wert)
{
  echo $wert . '<br>';
}

?>

Falls man eine Zeichenkodierung mit Multibyte-Zeichen verwendet, kann man eine eigene Funktion schreiben, damit zusammengehörige Bytes nicht getrennt werden. Hierbei gibt es mehrere Möglichkeiten. Beim folgenden Beispielcode wird die selbst geschriebene Funktion str_split_utf8() mit Hilfe von preg_split() erstellt. Hierbei kann man beim Aufruf auch den zweiten Parameter (split_length) angeben und die maximale Länge der Teilstücke begrenzen.

<?php

// Funktion str_split_utf8 erstellen
function str_split_utf8($str, $l = 0) 
{
  return preg_split('/(.{'.$l.'})/us', $str, -1, 
    PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
}

$str = 'abcäöüßxyz';

// Funktion str_split_utf8 aufrufen
$arr = str_split_utf8($str, 2);

// Ausgabe untereinander ab cä öü ßx yz
foreach ($arr as $wert)
{
  echo $wert . '<br>';
}

?>

Mit der Funktion str_split_utf8() hätte man dieselbe Wirkung wie bei str_split(), nur mit dem Unterschied, dass man auch eine Zeichenkodierung mit Multibyte-Zeichen verwenden kann.