Rolf B: PHP Strings zusammenführen?

Beitrag lesen

Hallo WernerK,

ich habe nochmal geschaut - was Du brauchst, ist in PHP eigentlich bereits vorhanden, nämlich array_map. Dem kann man nicht nur ein Array übergeben, sondern mehrere. array_map durchläuft diese Arrays parallel und übergibt die Werte an die Callback-Funktion.

Beispiel:

$a = ARRAY(1,2,3);
$b = ARRAY(11,12,13,14);
$c = ARRAY(21,22,23);

array_map("myCallback", $a, $b, $c);

Von array_map wird die Funktion myCallback nun vier mal aufgerufen.

Aufruf 1: myCallback(1,11,21);
Aufruf 2: myCallback(2,12,22);
Aufruf 3: myCallback(3,13,23);
Aufruf 4: myCallback(null,14,null);

Ergebnis ist ein Array, das aus den vier Rückgabewerten von myCallback besteht.

Angewendet auf deine Aufgabenstellung denke ich mir, dass es ein Sonderfall ist, dass Du nur zwei Strings hast, die Du zusammenmischen willst. Im Allgemeinen wird das ein Array aus 1-N Strings sein. Nennen wir es mal $results.

Herausforderung 1 ist demnach, array_map mit einer variablen Anzahl von Parametern aufzurufen. Das ist seit PHP 5.6 relativ einfach geworden, man verwendet den Operator "...". Vorher hätten wir ein temporäres Array aufbauen und call_user_func_array verwenden müssen.

Die Parameter für array_map müssen wir noch aufbereiten. Du hast Strings, in denen die Werte mit Semikolon getrennt sind, das müssen Arrays werden. Wie schon geschrieben, dient dazu explode. Wir müssen also ein Array aus Strings in ein Array aus explodierten Strings umwandeln - wieder eine Aufgabe für array_map:

function explode_result($aString) {
   return explode(";", $aString);
}
$results_as_array = array_map("explode_result", $results);

Damit können wir nun array_map aufrufen, um die Werte zu konsolidieren:

$consolidated_result 
    = array_map("coalesce_values", ...$results_as_array);

Hier wird der ... Operator in seiner Funktion als "Spread"- oder "Splat"-Operator benutzt: er verteilt das Array auf seine einzelnen Werte. Bei 3 Einträgen in $results_as_array würde array_map 4 Parameter übergeben bekommen.

coalesce_values ist der Name der Funktion, die array_map als Callback aufrufen soll. Diese Funktion enthält Herausforderung 2, wir wissen ja nicht, wieviele Arrays wir an array_map übergeben, und darum wissen wir nicht, wieviele Parameter die Callbackfunktion bekommt. Auch hier hilft der ... Operator, diesmal als "Rest"-Operator, der alle Parameter in einem Array einsammelt (hier steht mehr dazu).

function coalesce_values(...$werte) {
   foreach ($werte as $wert)
      if ($wert !== null && $wert !== "") return $wert;
   return "";
}

Was coalesce_values tut, sollte offensichtlich sein: sie durchläuft die übergebenen Werte und gibt den ersten zurück, der nicht NULL oder "" ist. Gibt es keinen, wird "" zurückgegeben.

Das ist alles. Nochmal alles zusammengefasst:

$results_as_array = array_map("explode_result", $results);

$consolidated_result 
    = array_map("coalesce_values", ...$results_as_array);

function explode_result($aString) {
   return explode(";", $aString);
}

function coalesce_values(...$werte) {
   foreach ($werte as $wert)
      if ($wert !== null && $wert !== "") return $wert;
   return "";
}

Auf Aspekte funktionaler Programmierung, die man hier für die Callbacks anbringen könnte, habe ich bewusst verzichtet.

Rolf

--
sumpsi - posui - clusi